MIPS: Sibyte: Get rid of BKL.
authorRalf Baechle <ralf@linux-mips.org>
Mon, 28 Sep 2009 15:57:54 +0000 (16:57 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Wed, 30 Sep 2009 19:47:01 +0000 (21:47 +0200)
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/sibyte/common/sb_tbprof.c

index 637a194e5cd5f95e0ee2de2687ddbab05ac45cec..15ea778b5e6664c0f305681b3c9a0c3c2fad3f2e 100644 (file)
@@ -403,36 +403,31 @@ static int sbprof_zbprof_stop(void)
 static int sbprof_tb_open(struct inode *inode, struct file *filp)
 {
        int minor;
-       int err = 0;
 
-       lock_kernel();
        minor = iminor(inode);
-       if (minor != 0) {
-               err = -ENODEV;
-               goto out;
-       }
+       if (minor != 0)
+               return -ENODEV;
 
-       if (xchg(&sbp.open, SB_OPENING) != SB_CLOSED) {
-               err = -EBUSY;
-               goto out;
-       }
+       if (xchg(&sbp.open, SB_OPENING) != SB_CLOSED)
+               return -EBUSY;
 
        memset(&sbp, 0, sizeof(struct sbprof_tb));
        sbp.sbprof_tbbuf = vmalloc(MAX_TBSAMPLE_BYTES);
        if (!sbp.sbprof_tbbuf) {
-               err = -ENOMEM;
-               goto out;
+               sbp.open = SB_CLOSED;
+               wmb();
+               return -ENOMEM;
        }
+
        memset(sbp.sbprof_tbbuf, 0, MAX_TBSAMPLE_BYTES);
        init_waitqueue_head(&sbp.tb_sync);
        init_waitqueue_head(&sbp.tb_read);
        mutex_init(&sbp.lock);
 
        sbp.open = SB_OPEN;
+       wmb();
 
-  out:
-       unlock_kernel();
-       return err;
+       return 0;
 }
 
 static int sbprof_tb_release(struct inode *inode, struct file *filp)
@@ -440,7 +435,7 @@ static int sbprof_tb_release(struct inode *inode, struct file *filp)
        int minor;
 
        minor = iminor(inode);
-       if (minor != 0 || !sbp.open)
+       if (minor != 0 || sbp.open != SB_CLOSED)
                return -ENODEV;
 
        mutex_lock(&sbp.lock);
@@ -449,7 +444,8 @@ static int sbprof_tb_release(struct inode *inode, struct file *filp)
                sbprof_zbprof_stop();
 
        vfree(sbp.sbprof_tbbuf);
-       sbp.open = 0;
+       sbp.open = SB_CLOSED;
+       wmb();
 
        mutex_unlock(&sbp.lock);
 
@@ -583,7 +579,8 @@ static int __init sbprof_tb_init(void)
        }
        tb_dev = dev;
 
-       sbp.open = 0;
+       sbp.open = SB_CLOSED;
+       wmb();
        tb_period = zbbus_mhz * 10000LL;
        pr_info(DEVNAME ": initialized - tb_period = %lld\n",
                (long long) tb_period);