uml: kill big kernel lock
authorArnd Bergmann <arnd@arndb.de>
Sat, 11 Sep 2010 16:38:03 +0000 (18:38 +0200)
committerArnd Bergmann <arnd@arndb.de>
Tue, 19 Oct 2010 09:29:42 +0000 (11:29 +0200)
Three uml device drivers still use the big kernel lock,
but all of them can be safely converted to using
a per-driver mutex instead. Most likely this is not
even necessary, so after further review these can
and should be removed as well.

The exec system call no longer requires the BKL either,
so remove it from there, too.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: user-mode-linux-devel@lists.sourceforge.net
arch/um/drivers/harddog_kern.c
arch/um/drivers/hostaudio_kern.c
arch/um/drivers/ubd_kern.c
arch/um/kernel/exec.c

index cfcac1ff4cf20276d19ee8fb137dfc84a6cf8abb..86036276020f82e586143d55f59ad0bee653c874 100644 (file)
@@ -42,7 +42,7 @@
 #include <linux/miscdevice.h>
 #include <linux/watchdog.h>
 #include <linux/reboot.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/init.h>
 #include <linux/spinlock.h>
 #include <asm/uaccess.h>
@@ -50,6 +50,7 @@
 
 MODULE_LICENSE("GPL");
 
+static DEFINE_MUTEX(harddog_mutex);
 static DEFINE_SPINLOCK(lock);
 static int timer_alive;
 static int harddog_in_fd = -1;
@@ -66,7 +67,7 @@ static int harddog_open(struct inode *inode, struct file *file)
        int err = -EBUSY;
        char *sock = NULL;
 
-       lock_kernel();
+       mutex_lock(&harddog_mutex);
        spin_lock(&lock);
        if(timer_alive)
                goto err;
@@ -83,11 +84,11 @@ static int harddog_open(struct inode *inode, struct file *file)
 
        timer_alive = 1;
        spin_unlock(&lock);
-       unlock_kernel();
+       mutex_unlock(&harddog_mutex);
        return nonseekable_open(inode, file);
 err:
        spin_unlock(&lock);
-       unlock_kernel();
+       mutex_unlock(&harddog_mutex);
        return err;
 }
 
@@ -153,9 +154,9 @@ static long harddog_ioctl(struct file *file,
 {
        long ret;
 
-       lock_kernel();
+       mutex_lock(&harddog_mutex);
        ret = harddog_ioctl_unlocked(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&harddog_mutex);
 
        return ret;
 }
index 0c46e398cd8f313d89a3ff07187916aa6021b93f..d92ff6d602972a3865e456c7ac6f6d67a3179901 100644 (file)
@@ -8,7 +8,7 @@
 #include "linux/slab.h"
 #include "linux/sound.h"
 #include "linux/soundcard.h"
-#include "linux/smp_lock.h"
+#include "linux/mutex.h"
 #include "asm/uaccess.h"
 #include "init.h"
 #include "os.h"
@@ -67,6 +67,8 @@ MODULE_PARM_DESC(mixer, MIXER_HELP);
 
 #endif
 
+static DEFINE_MUTEX(hostaudio_mutex);
+
 /* /dev/dsp file operations */
 
 static ssize_t hostaudio_read(struct file *file, char __user *buffer,
@@ -202,9 +204,9 @@ static int hostaudio_open(struct inode *inode, struct file *file)
                w = 1;
 
        kparam_block_sysfs_write(dsp);
-       lock_kernel();
+       mutex_lock(&hostaudio_mutex);
        ret = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0);
-       unlock_kernel();
+       mutex_unlock(&hostaudio_mutex);
        kparam_unblock_sysfs_write(dsp);
 
        if (ret < 0) {
@@ -263,9 +265,9 @@ static int hostmixer_open_mixdev(struct inode *inode, struct file *file)
                w = 1;
 
        kparam_block_sysfs_write(mixer);
-       lock_kernel();
+       mutex_lock(&hostaudio_mutex);
        ret = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0);
-       unlock_kernel();
+       mutex_unlock(&hostaudio_mutex);
        kparam_unblock_sysfs_write(mixer);
 
        if (ret < 0) {
index 1bcd208c459f609ab3634f951e1c11b3b2e50038..0c053607ce98b63362f6ac75b7e1e9df9d11f189 100644 (file)
@@ -33,7 +33,7 @@
 #include "linux/mm.h"
 #include "linux/slab.h"
 #include "linux/vmalloc.h"
-#include "linux/smp_lock.h"
+#include "linux/mutex.h"
 #include "linux/blkpg.h"
 #include "linux/genhd.h"
 #include "linux/spinlock.h"
@@ -100,6 +100,7 @@ static inline void ubd_set_bit(__u64 bit, unsigned char *data)
 #define DRIVER_NAME "uml-blkdev"
 
 static DEFINE_MUTEX(ubd_lock);
+static DEFINE_MUTEX(ubd_mutex); /* replaces BKL, might not be needed */
 
 static int ubd_open(struct block_device *bdev, fmode_t mode);
 static int ubd_release(struct gendisk *disk, fmode_t mode);
@@ -1099,7 +1100,7 @@ static int ubd_open(struct block_device *bdev, fmode_t mode)
        struct ubd *ubd_dev = disk->private_data;
        int err = 0;
 
-       lock_kernel();
+       mutex_lock(&ubd_mutex);
        if(ubd_dev->count == 0){
                err = ubd_open_dev(ubd_dev);
                if(err){
@@ -1118,7 +1119,7 @@ static int ubd_open(struct block_device *bdev, fmode_t mode)
                err = -EROFS;
        }*/
 out:
-       unlock_kernel();
+       mutex_unlock(&ubd_mutex);
        return err;
 }
 
@@ -1126,10 +1127,10 @@ static int ubd_release(struct gendisk *disk, fmode_t mode)
 {
        struct ubd *ubd_dev = disk->private_data;
 
-       lock_kernel();
+       mutex_lock(&ubd_mutex);
        if(--ubd_dev->count == 0)
                ubd_close_dev(ubd_dev);
-       unlock_kernel();
+       mutex_unlock(&ubd_mutex);
        return 0;
 }
 
index cd145eda357950b66b1ad2f05f55bd0094df6006..460ce86f4019d11791da552c22b4292ebda3ed00 100644 (file)
@@ -78,13 +78,11 @@ long sys_execve(const char __user *file, char __user *__user *argv,
        long error;
        char *filename;
 
-       lock_kernel();
        filename = getname(file);
        error = PTR_ERR(filename);
        if (IS_ERR(filename)) goto out;
        error = execve1(filename, argv, env);
        putname(filename);
  out:
-       unlock_kernel();
        return error;
 }