From: Greg KH <greg@kroah.com>
To: linux-kernel@vger.kernel.org
Cc: gregkh@suse.de
Subject: [PATCH] kmap: remove usage of rwsem from kobj_map.
Date: Wed, 9 Mar 2005 16:34:46 -0800 [thread overview]
Message-ID: <11104148863225@kroah.com> (raw)
In-Reply-To: <1110414886692@kroah.com>
ChangeSet 1.2052, 2005/03/09 15:06:02-08:00, gregkh@suse.de
[PATCH] kmap: remove usage of rwsem from kobj_map.
This forces the caller to provide the lock, but as they all already had one, it's not a big change.
It also removes the now-unneeded cdev_subsys. Thanks to Jon Corbet for reminding me about that.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/base/map.c | 21 ++++++++++-----------
drivers/block/genhd.c | 2 +-
fs/char_dev.c | 26 +++++++++-----------------
include/linux/kobj_map.h | 2 +-
4 files changed, 21 insertions(+), 30 deletions(-)
diff -Nru a/drivers/base/map.c b/drivers/base/map.c
--- a/drivers/base/map.c 2005-03-09 16:28:24 -08:00
+++ b/drivers/base/map.c 2005-03-09 16:28:24 -08:00
@@ -25,7 +25,7 @@
int (*lock)(dev_t, void *);
void *data;
} *probes[255];
- struct rw_semaphore *sem;
+ struct semaphore *sem;
};
int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range,
@@ -53,7 +53,7 @@
p->range = range;
p->data = data;
}
- down_write(domain->sem);
+ down(domain->sem);
for (i = 0, p -= n; i < n; i++, p++, index++) {
struct probe **s = &domain->probes[index % 255];
while (*s && (*s)->range < range)
@@ -61,7 +61,7 @@
p->next = *s;
*s = p;
}
- up_write(domain->sem);
+ up(domain->sem);
return 0;
}
@@ -75,7 +75,7 @@
if (n > 255)
n = 255;
- down_write(domain->sem);
+ down(domain->sem);
for (i = 0; i < n; i++, index++) {
struct probe **s;
for (s = &domain->probes[index % 255]; *s; s = &(*s)->next) {
@@ -88,7 +88,7 @@
}
}
}
- up_write(domain->sem);
+ up(domain->sem);
kfree(found);
}
@@ -99,7 +99,7 @@
unsigned long best = ~0UL;
retry:
- down_read(domain->sem);
+ down(domain->sem);
for (p = domain->probes[MAJOR(dev) % 255]; p; p = p->next) {
struct kobject *(*probe)(dev_t, int *, void *);
struct module *owner;
@@ -120,7 +120,7 @@
module_put(owner);
continue;
}
- up_read(domain->sem);
+ up(domain->sem);
kobj = probe(dev, index, data);
/* Currently ->owner protects _only_ ->probe() itself. */
module_put(owner);
@@ -128,12 +128,11 @@
return kobj;
goto retry;
}
- up_read(domain->sem);
+ up(domain->sem);
return NULL;
}
-struct kobj_map *kobj_map_init(kobj_probe_t *base_probe,
- struct subsystem *s)
+struct kobj_map *kobj_map_init(kobj_probe_t *base_probe, struct semaphore *sem)
{
struct kobj_map *p = kmalloc(sizeof(struct kobj_map), GFP_KERNEL);
struct probe *base = kmalloc(sizeof(struct probe), GFP_KERNEL);
@@ -151,6 +150,6 @@
base->get = base_probe;
for (i = 0; i < 255; i++)
p->probes[i] = base;
- p->sem = &s->rwsem;
+ p->sem = sem;
return p;
}
diff -Nru a/drivers/block/genhd.c b/drivers/block/genhd.c
--- a/drivers/block/genhd.c 2005-03-09 16:28:24 -08:00
+++ b/drivers/block/genhd.c 2005-03-09 16:28:24 -08:00
@@ -302,7 +302,7 @@
static int __init genhd_device_init(void)
{
- bdev_map = kobj_map_init(base_probe, &block_subsys);
+ bdev_map = kobj_map_init(base_probe, &block_subsys_sem);
blk_dev_init();
subsystem_register(&block_subsys);
return 0;
diff -Nru a/fs/char_dev.c b/fs/char_dev.c
--- a/fs/char_dev.c 2005-03-09 16:28:24 -08:00
+++ b/fs/char_dev.c 2005-03-09 16:28:24 -08:00
@@ -29,7 +29,7 @@
/* degrade to linked list for small systems */
#define MAX_PROBE_HASH (CONFIG_BASE_SMALL ? 1 : 255)
-static DEFINE_RWLOCK(chrdevs_lock);
+static DECLARE_MUTEX(chrdevs_lock);
static struct char_device_struct {
struct char_device_struct *next;
@@ -55,13 +55,13 @@
len = sprintf(page, "Character devices:\n");
- read_lock(&chrdevs_lock);
+ down(&chrdevs_lock);
for (i = 0; i < ARRAY_SIZE(chrdevs) ; i++) {
for (cd = chrdevs[i]; cd; cd = cd->next)
len += sprintf(page+len, "%3d %s\n",
cd->major, cd->name);
}
- read_unlock(&chrdevs_lock);
+ up(&chrdevs_lock);
return len;
}
@@ -91,7 +91,7 @@
memset(cd, 0, sizeof(struct char_device_struct));
- write_lock_irq(&chrdevs_lock);
+ down(&chrdevs_lock);
/* temporary */
if (major == 0) {
@@ -126,10 +126,10 @@
}
cd->next = *cp;
*cp = cd;
- write_unlock_irq(&chrdevs_lock);
+ up(&chrdevs_lock);
return cd;
out:
- write_unlock_irq(&chrdevs_lock);
+ up(&chrdevs_lock);
kfree(cd);
return ERR_PTR(ret);
}
@@ -140,7 +140,7 @@
struct char_device_struct *cd = NULL, **cp;
int i = major_to_index(major);
- write_lock_irq(&chrdevs_lock);
+ up(&chrdevs_lock);
for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next)
if ((*cp)->major == major &&
(*cp)->baseminor == baseminor &&
@@ -150,7 +150,7 @@
cd = *cp;
*cp = cd->next;
}
- write_unlock_irq(&chrdevs_lock);
+ up(&chrdevs_lock);
return cd;
}
@@ -381,8 +381,6 @@
}
-static decl_subsys(cdev, NULL, NULL);
-
static void cdev_default_release(struct kobject *kobj)
{
struct cdev *p = container_of(kobj, struct cdev, kobj);
@@ -435,13 +433,7 @@
void __init chrdev_init(void)
{
-/*
- * Keep cdev_subsys around because (and only because) the kobj_map code
- * depends on the rwsem it contains. We don't make it public in sysfs,
- * however.
- */
- subsystem_init(&cdev_subsys);
- cdev_map = kobj_map_init(base_probe, &cdev_subsys);
+ cdev_map = kobj_map_init(base_probe, &chrdevs_lock);
}
diff -Nru a/include/linux/kobj_map.h b/include/linux/kobj_map.h
--- a/include/linux/kobj_map.h 2005-03-09 16:28:24 -08:00
+++ b/include/linux/kobj_map.h 2005-03-09 16:28:24 -08:00
@@ -7,6 +7,6 @@
kobj_probe_t *, int (*)(dev_t, void *), void *);
void kobj_unmap(struct kobj_map *, dev_t, unsigned long);
struct kobject *kobj_lookup(struct kobj_map *, dev_t, int *);
-struct kobj_map *kobj_map_init(kobj_probe_t *, struct subsystem *);
+struct kobj_map *kobj_map_init(kobj_probe_t *, struct semaphore *);
#endif
next prev parent reply other threads:[~2005-03-10 0:55 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-03-10 0:34 [BK PATCH] Driver core and kobject updates for 2.6.11 Greg KH
2005-03-10 0:34 ` [PATCH] Kobject: remove some unneeded exports Greg KH
2005-03-10 0:34 ` [PATCH] Add 2.4.x cpufreq /proc and sysctl interface removal feature-removal-schedule Greg KH
2005-03-10 0:34 ` [PATCH] cpufreq 2.4 interface removal schedule Greg KH
2005-03-10 0:34 ` [PATCH] driver core: Separate platform device name from platform device number Greg KH
2005-03-10 0:34 ` [PATCH] class core: export MAJOR/MINOR to the hotplug env Greg KH
2005-03-10 0:34 ` [PATCH] block " Greg KH
2005-03-10 0:34 ` [PATCH] class_simple: pass dev_t to the class core Greg KH
2005-03-10 0:34 ` [PATCH] usb: class driver " Greg KH
2005-03-10 0:34 ` [PATCH] i2c: " Greg KH
2005-03-10 0:34 ` [PATCH] videodev: " Greg KH
2005-03-10 0:34 ` [PATCH] driver core: clean driver unload Greg KH
2005-03-10 0:34 ` [PATCH] Driver core: add "bus" symlink to class/block devices Greg KH
2005-03-10 0:34 ` [PATCH] floppy.c: pass physical device to device registration Greg KH
2005-03-10 0:34 ` [PATCH] kset: make ksets have a spinlock, and use that to lock their lists Greg KH
2005-03-10 0:34 ` [PATCH] sysdev: make system_subsys static as no one else needs access to it Greg KH
2005-03-10 0:34 ` [PATCH] kref: make kref_put return if this was the last put call Greg KH
2005-03-10 0:34 ` [PATCH] USB: move usb core to use class_simple instead of it's own class functions Greg KH
2005-03-10 0:34 ` Greg KH [this message]
2005-03-10 0:34 ` [PATCH] sysdev: fix the name of the list of drivers to be a sane name Greg KH
2005-03-10 0:34 ` [PATCH] sysdev: remove the rwsem usage from this subsystem Greg KH
2005-03-10 0:34 ` [PATCH] class: add a semaphore to struct class, and use that instead of the subsystem rwsem Greg KH
2005-03-25 18:01 ` [PATCH] driver core: Separate platform device name from platform device number Paul Mundt
2005-03-25 18:10 ` Greg KH
2005-03-25 18:35 ` Paul Mundt
2005-03-25 19:38 ` Kyle Moffett
2005-03-25 19:58 ` Paul Mundt
2005-03-25 20:17 ` Kyle Moffett
2005-03-25 20:25 ` Russell King
2005-03-25 20:56 ` Paul Mundt
2005-03-25 21:03 ` Russell King
2005-03-25 22:15 ` Paul Mundt
2005-03-10 2:23 ` [PATCH] Add 2.4.x cpufreq /proc and sysctl interface removal feature-removal-schedule Dave Jones
2005-03-10 4:56 ` Dominik Brodowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11104148863225@kroah.com \
--to=greg@kroah.com \
--cc=gregkh@suse.de \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox