Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] kobj_map semaphore to mutex conversion

Convert the kobj_map code to use a mutex instead of a semaphore. It
converts the single two users as well, genhd.c and char_dev.c.

Signed-off-by: Jes Sorensen <jes@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Jes Sorensen and committed by
Greg Kroah-Hartman
58383af6 8b5536bb

+38 -35
+16 -15
block/genhd.c
··· 15 15 #include <linux/kmod.h> 16 16 #include <linux/kobj_map.h> 17 17 #include <linux/buffer_head.h> 18 + #include <linux/mutex.h> 18 19 19 20 #define MAX_PROBE_HASH 255 /* random */ 20 21 21 22 static struct subsystem block_subsys; 22 23 23 - static DECLARE_MUTEX(block_subsys_sem); 24 + static DEFINE_MUTEX(block_subsys_lock); 24 25 25 26 /* 26 27 * Can be deleted altogether. Later. ··· 47 46 /* 48 47 * iterate over a list of blkdev_info structures. allows 49 48 * the major_names array to be iterated over from outside this file 50 - * must be called with the block_subsys_sem held 49 + * must be called with the block_subsys_lock held 51 50 */ 52 51 void *get_next_blkdev(void *dev) 53 52 { ··· 86 85 87 86 void *acquire_blkdev_list(void) 88 87 { 89 - down(&block_subsys_sem); 88 + mutex_lock(&block_subsys_lock); 90 89 return get_next_blkdev(NULL); 91 90 } 92 91 93 92 void release_blkdev_list(void *dev) 94 93 { 95 - up(&block_subsys_sem); 94 + mutex_unlock(&block_subsys_lock); 96 95 kfree(dev); 97 96 } 98 97 99 98 100 99 /* 101 100 * Count the number of records in the blkdev_list. 102 - * must be called with the block_subsys_sem held 101 + * must be called with the block_subsys_lock held 103 102 */ 104 103 int count_blkdev_list(void) 105 104 { ··· 119 118 /* 120 119 * extract the major and name values from a blkdev_info struct 121 120 * passed in as a void to *dev. Must be called with 122 - * block_subsys_sem held 121 + * block_subsys_lock held 123 122 */ 124 123 int get_blkdev_info(void *dev, int *major, char **name) 125 124 { ··· 139 138 struct blk_major_name **n, *p; 140 139 int index, ret = 0; 141 140 142 - down(&block_subsys_sem); 141 + mutex_lock(&block_subsys_lock); 143 142 144 143 /* temporary */ 145 144 if (major == 0) { ··· 184 183 kfree(p); 185 184 } 186 185 out: 187 - up(&block_subsys_sem); 186 + mutex_unlock(&block_subsys_lock); 188 187 return ret; 189 188 } 190 189 ··· 198 197 int index = major_to_index(major); 199 198 int ret = 0; 200 199 201 - down(&block_subsys_sem); 200 + mutex_lock(&block_subsys_lock); 202 201 for (n = &major_names[index]; *n; n = &(*n)->next) 203 202 if ((*n)->major == major) 204 203 break; ··· 208 207 p = *n; 209 208 *n = p->next; 210 209 } 211 - up(&block_subsys_sem); 210 + mutex_unlock(&block_subsys_lock); 212 211 kfree(p); 213 212 214 213 return ret; ··· 302 301 struct list_head *p; 303 302 loff_t l = *pos; 304 303 305 - down(&block_subsys_sem); 304 + mutex_lock(&block_subsys_lock); 306 305 list_for_each(p, &block_subsys.kset.list) 307 306 if (!l--) 308 307 return list_entry(p, struct gendisk, kobj.entry); ··· 319 318 320 319 static void part_stop(struct seq_file *part, void *v) 321 320 { 322 - up(&block_subsys_sem); 321 + mutex_unlock(&block_subsys_lock); 323 322 } 324 323 325 324 static int show_partition(struct seq_file *part, void *v) ··· 378 377 379 378 static int __init genhd_device_init(void) 380 379 { 381 - bdev_map = kobj_map_init(base_probe, &block_subsys_sem); 380 + bdev_map = kobj_map_init(base_probe, &block_subsys_lock); 382 381 blk_dev_init(); 383 382 subsystem_register(&block_subsys); 384 383 return 0; ··· 612 611 loff_t k = *pos; 613 612 struct list_head *p; 614 613 615 - down(&block_subsys_sem); 614 + mutex_lock(&block_subsys_lock); 616 615 list_for_each(p, &block_subsys.kset.list) 617 616 if (!k--) 618 617 return list_entry(p, struct gendisk, kobj.entry); ··· 629 628 630 629 static void diskstats_stop(struct seq_file *part, void *v) 631 630 { 632 - up(&block_subsys_sem); 631 + mutex_unlock(&block_subsys_lock); 633 632 } 634 633 635 634 static int diskstats_show(struct seq_file *s, void *v)
+11 -10
drivers/base/map.c
··· 11 11 12 12 #include <linux/module.h> 13 13 #include <linux/slab.h> 14 + #include <linux/mutex.h> 14 15 #include <linux/kdev_t.h> 15 16 #include <linux/kobject.h> 16 17 #include <linux/kobj_map.h> ··· 26 25 int (*lock)(dev_t, void *); 27 26 void *data; 28 27 } *probes[255]; 29 - struct semaphore *sem; 28 + struct mutex *lock; 30 29 }; 31 30 32 31 int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range, ··· 54 53 p->range = range; 55 54 p->data = data; 56 55 } 57 - down(domain->sem); 56 + mutex_lock(domain->lock); 58 57 for (i = 0, p -= n; i < n; i++, p++, index++) { 59 58 struct probe **s = &domain->probes[index % 255]; 60 59 while (*s && (*s)->range < range) ··· 62 61 p->next = *s; 63 62 *s = p; 64 63 } 65 - up(domain->sem); 64 + mutex_unlock(domain->lock); 66 65 return 0; 67 66 } 68 67 ··· 76 75 if (n > 255) 77 76 n = 255; 78 77 79 - down(domain->sem); 78 + mutex_lock(domain->lock); 80 79 for (i = 0; i < n; i++, index++) { 81 80 struct probe **s; 82 81 for (s = &domain->probes[index % 255]; *s; s = &(*s)->next) { ··· 89 88 } 90 89 } 91 90 } 92 - up(domain->sem); 91 + mutex_unlock(domain->lock); 93 92 kfree(found); 94 93 } 95 94 ··· 100 99 unsigned long best = ~0UL; 101 100 102 101 retry: 103 - down(domain->sem); 102 + mutex_lock(domain->lock); 104 103 for (p = domain->probes[MAJOR(dev) % 255]; p; p = p->next) { 105 104 struct kobject *(*probe)(dev_t, int *, void *); 106 105 struct module *owner; ··· 121 120 module_put(owner); 122 121 continue; 123 122 } 124 - up(domain->sem); 123 + mutex_unlock(domain->lock); 125 124 kobj = probe(dev, index, data); 126 125 /* Currently ->owner protects _only_ ->probe() itself. */ 127 126 module_put(owner); ··· 129 128 return kobj; 130 129 goto retry; 131 130 } 132 - up(domain->sem); 131 + mutex_unlock(domain->lock); 133 132 return NULL; 134 133 } 135 134 136 - struct kobj_map *kobj_map_init(kobj_probe_t *base_probe, struct semaphore *sem) 135 + struct kobj_map *kobj_map_init(kobj_probe_t *base_probe, struct mutex *lock) 137 136 { 138 137 struct kobj_map *p = kmalloc(sizeof(struct kobj_map), GFP_KERNEL); 139 138 struct probe *base = kzalloc(sizeof(*base), GFP_KERNEL); ··· 150 149 base->get = base_probe; 151 150 for (i = 0; i < 255; i++) 152 151 p->probes[i] = base; 153 - p->sem = sem; 152 + p->lock = lock; 154 153 return p; 155 154 }
+9 -8
fs/char_dev.c
··· 19 19 #include <linux/kobject.h> 20 20 #include <linux/kobj_map.h> 21 21 #include <linux/cdev.h> 22 + #include <linux/mutex.h> 22 23 23 24 #ifdef CONFIG_KMOD 24 25 #include <linux/kmod.h> ··· 29 28 30 29 #define MAX_PROBE_HASH 255 /* random */ 31 30 32 - static DECLARE_MUTEX(chrdevs_lock); 31 + static DEFINE_MUTEX(chrdevs_lock); 33 32 34 33 static struct char_device_struct { 35 34 struct char_device_struct *next; ··· 89 88 90 89 void *acquire_chrdev_list(void) 91 90 { 92 - down(&chrdevs_lock); 91 + mutex_lock(&chrdevs_lock); 93 92 return get_next_chrdev(NULL); 94 93 } 95 94 96 95 void release_chrdev_list(void *dev) 97 96 { 98 - up(&chrdevs_lock); 97 + mutex_unlock(&chrdevs_lock); 99 98 kfree(dev); 100 99 } 101 100 ··· 152 151 153 152 memset(cd, 0, sizeof(struct char_device_struct)); 154 153 155 - down(&chrdevs_lock); 154 + mutex_lock(&chrdevs_lock); 156 155 157 156 /* temporary */ 158 157 if (major == 0) { ··· 187 186 } 188 187 cd->next = *cp; 189 188 *cp = cd; 190 - up(&chrdevs_lock); 189 + mutex_unlock(&chrdevs_lock); 191 190 return cd; 192 191 out: 193 - up(&chrdevs_lock); 192 + mutex_unlock(&chrdevs_lock); 194 193 kfree(cd); 195 194 return ERR_PTR(ret); 196 195 } ··· 201 200 struct char_device_struct *cd = NULL, **cp; 202 201 int i = major_to_index(major); 203 202 204 - down(&chrdevs_lock); 203 + mutex_lock(&chrdevs_lock); 205 204 for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next) 206 205 if ((*cp)->major == major && 207 206 (*cp)->baseminor == baseminor && ··· 211 210 cd = *cp; 212 211 *cp = cd->next; 213 212 } 214 - up(&chrdevs_lock); 213 + mutex_unlock(&chrdevs_lock); 215 214 return cd; 216 215 } 217 216
+2 -2
include/linux/kobj_map.h
··· 1 1 #ifdef __KERNEL__ 2 2 3 - #include <asm/semaphore.h> 3 + #include <linux/mutex.h> 4 4 5 5 typedef struct kobject *kobj_probe_t(dev_t, int *, void *); 6 6 struct kobj_map; ··· 9 9 kobj_probe_t *, int (*)(dev_t, void *), void *); 10 10 void kobj_unmap(struct kobj_map *, dev_t, unsigned long); 11 11 struct kobject *kobj_lookup(struct kobj_map *, dev_t, int *); 12 - struct kobj_map *kobj_map_init(kobj_probe_t *, struct semaphore *); 12 + struct kobj_map *kobj_map_init(kobj_probe_t *, struct mutex *); 13 13 14 14 #endif