Re: [PATCH 04/19] block: split block_class_lock

2020-09-04 Thread Hannes Reinecke

On 9/3/20 10:01 AM, Christoph Hellwig wrote:

Split the block_class_lock mutex into one each to protect bdev_map
and major_names.

Signed-off-by: Christoph Hellwig 
---
  block/genhd.c | 29 +++--
  1 file changed, 15 insertions(+), 14 deletions(-)


Reviewed-by: Hannes Reinecke 

Cheers,

Hannes
--
Dr. Hannes ReineckeKernel Storage Architect
h...@suse.de  +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer


[PATCH 04/19] block: split block_class_lock

2020-09-03 Thread Christoph Hellwig
Split the block_class_lock mutex into one each to protect bdev_map
and major_names.

Signed-off-by: Christoph Hellwig 
---
 block/genhd.c | 29 +++--
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/block/genhd.c b/block/genhd.c
index ec9b64207d9c2e..034e9089965a82 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -25,7 +25,6 @@
 
 #include "blk.h"
 
-static DEFINE_MUTEX(block_class_lock);
 static struct kobject *block_depr;
 
 struct bdev_map {
@@ -37,6 +36,7 @@ struct bdev_map {
int (*lock)(dev_t, void *);
void *data;
 } *bdev_map[255];
+static DEFINE_MUTEX(bdev_map_lock);
 
 /* for extended dynamic devt allocation, currently only one major is used */
 #define NR_EXT_DEVT(1 << MINORBITS)
@@ -400,6 +400,7 @@ static struct blk_major_name {
int major;
char name[16];
 } *major_names[BLKDEV_MAJOR_HASH_SIZE];
+static DEFINE_MUTEX(major_names_lock);
 
 /* index in the above - for now: assume no multimajor ranges */
 static inline int major_to_index(unsigned major)
@@ -412,11 +413,11 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
 {
struct blk_major_name *dp;
 
-   mutex_lock(_class_lock);
+   mutex_lock(_names_lock);
for (dp = major_names[major_to_index(offset)]; dp; dp = dp->next)
if (dp->major == offset)
seq_printf(seqf, "%3d %s\n", dp->major, dp->name);
-   mutex_unlock(_class_lock);
+   mutex_unlock(_names_lock);
 }
 #endif /* CONFIG_PROC_FS */
 
@@ -445,7 +446,7 @@ int register_blkdev(unsigned int major, const char *name)
struct blk_major_name **n, *p;
int index, ret = 0;
 
-   mutex_lock(_class_lock);
+   mutex_lock(_names_lock);
 
/* temporary */
if (major == 0) {
@@ -498,7 +499,7 @@ int register_blkdev(unsigned int major, const char *name)
kfree(p);
}
 out:
-   mutex_unlock(_class_lock);
+   mutex_unlock(_names_lock);
return ret;
 }
 
@@ -510,7 +511,7 @@ void unregister_blkdev(unsigned int major, const char *name)
struct blk_major_name *p = NULL;
int index = major_to_index(major);
 
-   mutex_lock(_class_lock);
+   mutex_lock(_names_lock);
for (n = _names[index]; *n; n = &(*n)->next)
if ((*n)->major == major)
break;
@@ -520,7 +521,7 @@ void unregister_blkdev(unsigned int major, const char *name)
p = *n;
*n = p->next;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_names_lock);
kfree(p);
 }
 
@@ -671,7 +672,7 @@ void blk_register_region(dev_t devt, unsigned long range, 
struct module *module,
p->data = data;
}
 
-   mutex_lock(_class_lock);
+   mutex_lock(_map_lock);
for (i = 0, p -= n; i < n; i++, p++, index++) {
struct bdev_map **s = _map[index % 255];
while (*s && (*s)->range < range)
@@ -679,7 +680,7 @@ void blk_register_region(dev_t devt, unsigned long range, 
struct module *module,
p->next = *s;
*s = p;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
 }
 EXPORT_SYMBOL(blk_register_region);
 
@@ -690,7 +691,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
unsigned i;
struct bdev_map *found = NULL;
 
-   mutex_lock(_class_lock);
+   mutex_lock(_map_lock);
for (i = 0; i < min(n, 255u); i++, index++) {
struct bdev_map **s;
for (s = _map[index % 255]; *s; s = &(*s)->next) {
@@ -703,7 +704,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
}
}
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
kfree(found);
 }
 EXPORT_SYMBOL(blk_unregister_region);
@@ -1039,7 +1040,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int 
*partno)
unsigned long best = ~0UL;
 
 retry:
-   mutex_lock(_class_lock);
+   mutex_lock(_map_lock);
for (p = bdev_map[MAJOR(dev) % 255]; p; p = p->next) {
struct kobject *(*probe)(dev_t, int *, void *);
struct module *owner;
@@ -1060,7 +1061,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int 
*partno)
module_put(owner);
continue;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
kobj = probe(dev, partno, data);
/* Currently ->owner protects _only_ ->probe() itself. */
module_put(owner);
@@ -1068,7 +1069,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int 
*partno)
return dev_to_disk(kobj_to_dev(kobj));
goto retry;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
return NULL;
 }
 
-- 
2.28.0



[PATCH 04/19] block: split block_class_lock

2020-08-30 Thread Christoph Hellwig
Split the block_class_lock mutex into one each to protect bdev_map
and major_names.

Signed-off-by: Christoph Hellwig 
---
 block/genhd.c | 29 +++--
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/block/genhd.c b/block/genhd.c
index df6485223a2c3d..0ae6210e141ee5 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -25,7 +25,6 @@
 
 #include "blk.h"
 
-static DEFINE_MUTEX(block_class_lock);
 static struct kobject *block_depr;
 
 struct bdev_map {
@@ -37,6 +36,7 @@ struct bdev_map {
int (*lock)(dev_t, void *);
void *data;
 } *bdev_map[255];
+static DEFINE_MUTEX(bdev_map_lock);
 
 /* for extended dynamic devt allocation, currently only one major is used */
 #define NR_EXT_DEVT(1 << MINORBITS)
@@ -403,6 +403,7 @@ static struct blk_major_name {
int major;
char name[16];
 } *major_names[BLKDEV_MAJOR_HASH_SIZE];
+static DEFINE_MUTEX(major_names_lock);
 
 /* index in the above - for now: assume no multimajor ranges */
 static inline int major_to_index(unsigned major)
@@ -415,11 +416,11 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
 {
struct blk_major_name *dp;
 
-   mutex_lock(_class_lock);
+   mutex_lock(_names_lock);
for (dp = major_names[major_to_index(offset)]; dp; dp = dp->next)
if (dp->major == offset)
seq_printf(seqf, "%3d %s\n", dp->major, dp->name);
-   mutex_unlock(_class_lock);
+   mutex_unlock(_names_lock);
 }
 #endif /* CONFIG_PROC_FS */
 
@@ -448,7 +449,7 @@ int register_blkdev(unsigned int major, const char *name)
struct blk_major_name **n, *p;
int index, ret = 0;
 
-   mutex_lock(_class_lock);
+   mutex_lock(_names_lock);
 
/* temporary */
if (major == 0) {
@@ -501,7 +502,7 @@ int register_blkdev(unsigned int major, const char *name)
kfree(p);
}
 out:
-   mutex_unlock(_class_lock);
+   mutex_unlock(_names_lock);
return ret;
 }
 
@@ -513,7 +514,7 @@ void unregister_blkdev(unsigned int major, const char *name)
struct blk_major_name *p = NULL;
int index = major_to_index(major);
 
-   mutex_lock(_class_lock);
+   mutex_lock(_names_lock);
for (n = _names[index]; *n; n = &(*n)->next)
if ((*n)->major == major)
break;
@@ -523,7 +524,7 @@ void unregister_blkdev(unsigned int major, const char *name)
p = *n;
*n = p->next;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_names_lock);
kfree(p);
 }
 
@@ -674,7 +675,7 @@ void blk_register_region(dev_t devt, unsigned long range, 
struct module *module,
p->data = data;
}
 
-   mutex_lock(_class_lock);
+   mutex_lock(_map_lock);
for (i = 0, p -= n; i < n; i++, p++, index++) {
struct bdev_map **s = _map[index % 255];
while (*s && (*s)->range < range)
@@ -682,7 +683,7 @@ void blk_register_region(dev_t devt, unsigned long range, 
struct module *module,
p->next = *s;
*s = p;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
 }
 EXPORT_SYMBOL(blk_register_region);
 
@@ -693,7 +694,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
unsigned i;
struct bdev_map *found = NULL;
 
-   mutex_lock(_class_lock);
+   mutex_lock(_map_lock);
for (i = 0; i < min(n, 255u); i++, index++) {
struct bdev_map **s;
for (s = _map[index % 255]; *s; s = &(*s)->next) {
@@ -706,7 +707,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
}
}
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
kfree(found);
 }
 EXPORT_SYMBOL(blk_unregister_region);
@@ -1041,7 +1042,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int 
*partno)
unsigned long best = ~0UL;
 
 retry:
-   mutex_lock(_class_lock);
+   mutex_lock(_map_lock);
for (p = bdev_map[MAJOR(dev) % 255]; p; p = p->next) {
struct kobject *(*probe)(dev_t, int *, void *);
struct module *owner;
@@ -1062,7 +1063,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int 
*partno)
module_put(owner);
continue;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
kobj = probe(dev, partno, data);
/* Currently ->owner protects _only_ ->probe() itself. */
module_put(owner);
@@ -1070,7 +1071,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int 
*partno)
return dev_to_disk(kobj_to_dev(kobj));
goto retry;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
return NULL;
 }
 
-- 
2.28.0



[PATCH 04/19] block: split block_class_lock

2020-08-26 Thread Christoph Hellwig
Split the block_class_lock mutex into one each to protect bdev_map
and major_names.

Signed-off-by: Christoph Hellwig 
---
 block/genhd.c | 29 +++--
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/block/genhd.c b/block/genhd.c
index df6485223a2c3d..0ae6210e141ee5 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -25,7 +25,6 @@
 
 #include "blk.h"
 
-static DEFINE_MUTEX(block_class_lock);
 static struct kobject *block_depr;
 
 struct bdev_map {
@@ -37,6 +36,7 @@ struct bdev_map {
int (*lock)(dev_t, void *);
void *data;
 } *bdev_map[255];
+static DEFINE_MUTEX(bdev_map_lock);
 
 /* for extended dynamic devt allocation, currently only one major is used */
 #define NR_EXT_DEVT(1 << MINORBITS)
@@ -403,6 +403,7 @@ static struct blk_major_name {
int major;
char name[16];
 } *major_names[BLKDEV_MAJOR_HASH_SIZE];
+static DEFINE_MUTEX(major_names_lock);
 
 /* index in the above - for now: assume no multimajor ranges */
 static inline int major_to_index(unsigned major)
@@ -415,11 +416,11 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
 {
struct blk_major_name *dp;
 
-   mutex_lock(_class_lock);
+   mutex_lock(_names_lock);
for (dp = major_names[major_to_index(offset)]; dp; dp = dp->next)
if (dp->major == offset)
seq_printf(seqf, "%3d %s\n", dp->major, dp->name);
-   mutex_unlock(_class_lock);
+   mutex_unlock(_names_lock);
 }
 #endif /* CONFIG_PROC_FS */
 
@@ -448,7 +449,7 @@ int register_blkdev(unsigned int major, const char *name)
struct blk_major_name **n, *p;
int index, ret = 0;
 
-   mutex_lock(_class_lock);
+   mutex_lock(_names_lock);
 
/* temporary */
if (major == 0) {
@@ -501,7 +502,7 @@ int register_blkdev(unsigned int major, const char *name)
kfree(p);
}
 out:
-   mutex_unlock(_class_lock);
+   mutex_unlock(_names_lock);
return ret;
 }
 
@@ -513,7 +514,7 @@ void unregister_blkdev(unsigned int major, const char *name)
struct blk_major_name *p = NULL;
int index = major_to_index(major);
 
-   mutex_lock(_class_lock);
+   mutex_lock(_names_lock);
for (n = _names[index]; *n; n = &(*n)->next)
if ((*n)->major == major)
break;
@@ -523,7 +524,7 @@ void unregister_blkdev(unsigned int major, const char *name)
p = *n;
*n = p->next;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_names_lock);
kfree(p);
 }
 
@@ -674,7 +675,7 @@ void blk_register_region(dev_t devt, unsigned long range, 
struct module *module,
p->data = data;
}
 
-   mutex_lock(_class_lock);
+   mutex_lock(_map_lock);
for (i = 0, p -= n; i < n; i++, p++, index++) {
struct bdev_map **s = _map[index % 255];
while (*s && (*s)->range < range)
@@ -682,7 +683,7 @@ void blk_register_region(dev_t devt, unsigned long range, 
struct module *module,
p->next = *s;
*s = p;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
 }
 EXPORT_SYMBOL(blk_register_region);
 
@@ -693,7 +694,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
unsigned i;
struct bdev_map *found = NULL;
 
-   mutex_lock(_class_lock);
+   mutex_lock(_map_lock);
for (i = 0; i < min(n, 255u); i++, index++) {
struct bdev_map **s;
for (s = _map[index % 255]; *s; s = &(*s)->next) {
@@ -706,7 +707,7 @@ void blk_unregister_region(dev_t devt, unsigned long range)
}
}
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
kfree(found);
 }
 EXPORT_SYMBOL(blk_unregister_region);
@@ -1041,7 +1042,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int 
*partno)
unsigned long best = ~0UL;
 
 retry:
-   mutex_lock(_class_lock);
+   mutex_lock(_map_lock);
for (p = bdev_map[MAJOR(dev) % 255]; p; p = p->next) {
struct kobject *(*probe)(dev_t, int *, void *);
struct module *owner;
@@ -1062,7 +1063,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int 
*partno)
module_put(owner);
continue;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
kobj = probe(dev, partno, data);
/* Currently ->owner protects _only_ ->probe() itself. */
module_put(owner);
@@ -1070,7 +1071,7 @@ static struct gendisk *lookup_gendisk(dev_t dev, int 
*partno)
return dev_to_disk(kobj_to_dev(kobj));
goto retry;
}
-   mutex_unlock(_class_lock);
+   mutex_unlock(_map_lock);
return NULL;
 }
 
-- 
2.28.0