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
This commit is contained in:
@ -24,7 +24,6 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/adb.h>
|
||||
#include <linux/cuda.h>
|
||||
#include <linux/pmu.h>
|
||||
@ -55,6 +54,7 @@ extern struct adb_driver adb_iop_driver;
|
||||
extern struct adb_driver via_pmu_driver;
|
||||
extern struct adb_driver macio_adb_driver;
|
||||
|
||||
static DEFINE_MUTEX(adb_mutex);
|
||||
static struct adb_driver *adb_driver_list[] = {
|
||||
#ifdef CONFIG_ADB_MACII
|
||||
&via_macii_driver,
|
||||
@ -647,7 +647,7 @@ static int adb_open(struct inode *inode, struct file *file)
|
||||
struct adbdev_state *state;
|
||||
int ret = 0;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&adb_mutex);
|
||||
if (iminor(inode) > 0 || adb_controller == NULL) {
|
||||
ret = -ENXIO;
|
||||
goto out;
|
||||
@ -665,7 +665,7 @@ static int adb_open(struct inode *inode, struct file *file)
|
||||
state->inuse = 1;
|
||||
|
||||
out:
|
||||
unlock_kernel();
|
||||
mutex_unlock(&adb_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -674,7 +674,7 @@ static int adb_release(struct inode *inode, struct file *file)
|
||||
struct adbdev_state *state = file->private_data;
|
||||
unsigned long flags;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&adb_mutex);
|
||||
if (state) {
|
||||
file->private_data = NULL;
|
||||
spin_lock_irqsave(&state->lock, flags);
|
||||
@ -687,7 +687,7 @@ static int adb_release(struct inode *inode, struct file *file)
|
||||
spin_unlock_irqrestore(&state->lock, flags);
|
||||
}
|
||||
}
|
||||
unlock_kernel();
|
||||
mutex_unlock(&adb_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user