diff options
author | Arnd Bergmann <arnd@arndb.de> | 2010-06-02 08:28:52 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2010-09-15 15:00:47 -0400 |
commit | d851b6e04ee978b0c1b187bee682592aa72f22ea (patch) | |
tree | 1150757f61e3f4391d058fe2efc171e9fbcf13e2 /drivers/macintosh/adb.c | |
parent | 5aa82940b23d0c6e4083d48e387a16b8ad530a47 (diff) |
mac: autoconvert trivial BKL users to private mutex
All these files use the big kernel lock in a trivial
way to serialize their private file operations,
typically resulting from an earlier semi-automatic
pushdown from VFS.
None of these drivers appears to want to lock against
other code, and they all use the BKL as the top-level
lock in their file operations, meaning that there
is no lock-order inversion problem.
Consequently, we can remove the BKL completely,
replacing it with a per-file mutex in every case.
Using a scripted approach means we can avoid
typos.
file=$1
name=$2
if grep -q lock_kernel ${file} ; then
if grep -q 'include.*linux.mutex.h' ${file} ; then
sed -i '/include.*<linux\/smp_lock.h>/d' ${file}
else
sed -i 's/include.*<linux\/smp_lock.h>.*$/include <linux\/mutex.h>/g' ${file}
fi
sed -i ${file} \
-e "/^#include.*linux.mutex.h/,$ {
1,/^\(static\|int\|long\)/ {
/^\(static\|int\|long\)/istatic DEFINE_MUTEX(${name}_mutex);
} }" \
-e "s/\(un\)*lock_kernel\>[ ]*()/mutex_\1lock(\&${name}_mutex)/g" \
-e '/[ ]*cycle_kernel_lock();/d'
else
sed -i -e '/include.*\<smp_lock.h\>/d' ${file} \
-e '/cycle_kernel_lock()/d'
fi
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: linuxppc-dev@ozlabs.org
Diffstat (limited to 'drivers/macintosh/adb.c')
-rw-r--r-- | drivers/macintosh/adb.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index 1c4ee6e77937..e75e3be50811 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/fs.h> | 24 | #include <linux/fs.h> |
25 | #include <linux/mm.h> | 25 | #include <linux/mm.h> |
26 | #include <linux/sched.h> | 26 | #include <linux/sched.h> |
27 | #include <linux/smp_lock.h> | ||
28 | #include <linux/adb.h> | 27 | #include <linux/adb.h> |
29 | #include <linux/cuda.h> | 28 | #include <linux/cuda.h> |
30 | #include <linux/pmu.h> | 29 | #include <linux/pmu.h> |
@@ -55,6 +54,7 @@ extern struct adb_driver adb_iop_driver; | |||
55 | extern struct adb_driver via_pmu_driver; | 54 | extern struct adb_driver via_pmu_driver; |
56 | extern struct adb_driver macio_adb_driver; | 55 | extern struct adb_driver macio_adb_driver; |
57 | 56 | ||
57 | static DEFINE_MUTEX(adb_mutex); | ||
58 | static struct adb_driver *adb_driver_list[] = { | 58 | static struct adb_driver *adb_driver_list[] = { |
59 | #ifdef CONFIG_ADB_MACII | 59 | #ifdef CONFIG_ADB_MACII |
60 | &via_macii_driver, | 60 | &via_macii_driver, |
@@ -647,7 +647,7 @@ static int adb_open(struct inode *inode, struct file *file) | |||
647 | struct adbdev_state *state; | 647 | struct adbdev_state *state; |
648 | int ret = 0; | 648 | int ret = 0; |
649 | 649 | ||
650 | lock_kernel(); | 650 | mutex_lock(&adb_mutex); |
651 | if (iminor(inode) > 0 || adb_controller == NULL) { | 651 | if (iminor(inode) > 0 || adb_controller == NULL) { |
652 | ret = -ENXIO; | 652 | ret = -ENXIO; |
653 | goto out; | 653 | goto out; |
@@ -665,7 +665,7 @@ static int adb_open(struct inode *inode, struct file *file) | |||
665 | state->inuse = 1; | 665 | state->inuse = 1; |
666 | 666 | ||
667 | out: | 667 | out: |
668 | unlock_kernel(); | 668 | mutex_unlock(&adb_mutex); |
669 | return ret; | 669 | return ret; |
670 | } | 670 | } |
671 | 671 | ||
@@ -674,7 +674,7 @@ static int adb_release(struct inode *inode, struct file *file) | |||
674 | struct adbdev_state *state = file->private_data; | 674 | struct adbdev_state *state = file->private_data; |
675 | unsigned long flags; | 675 | unsigned long flags; |
676 | 676 | ||
677 | lock_kernel(); | 677 | mutex_lock(&adb_mutex); |
678 | if (state) { | 678 | if (state) { |
679 | file->private_data = NULL; | 679 | file->private_data = NULL; |
680 | spin_lock_irqsave(&state->lock, flags); | 680 | spin_lock_irqsave(&state->lock, flags); |
@@ -687,7 +687,7 @@ static int adb_release(struct inode *inode, struct file *file) | |||
687 | spin_unlock_irqrestore(&state->lock, flags); | 687 | spin_unlock_irqrestore(&state->lock, flags); |
688 | } | 688 | } |
689 | } | 689 | } |
690 | unlock_kernel(); | 690 | mutex_unlock(&adb_mutex); |
691 | return 0; | 691 | return 0; |
692 | } | 692 | } |
693 | 693 | ||