[PATCH] PPC-BRIQ_PANEL: Remove BKL and replace with atomic variable.

From: John Kacur
Date: Sun Oct 18 2009 - 15:29:21 EST


There are no locks here except the bkl in briq_panel_open. It's only
purpose is to ensure single access. Remove the bkl and ensure single access
by making vfd_is_open an atomic_variable.

Signed-off-by: John Kacur <jkacur@xxxxxxxxxx>
---
drivers/char/briq_panel.c | 25 ++++++++-----------------
1 files changed, 8 insertions(+), 17 deletions(-)

diff --git a/drivers/char/briq_panel.c b/drivers/char/briq_panel.c
index d8cff90..5396df4 100644
--- a/drivers/char/briq_panel.c
+++ b/drivers/char/briq_panel.c
@@ -6,7 +6,6 @@

#include <linux/module.h>

-#include <linux/smp_lock.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/tty.h>
@@ -25,6 +24,7 @@
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/prom.h>
+#include <asm/atomic.h>

#define BRIQ_PANEL_MINOR 156
#define BRIQ_PANEL_VFD_IOPORT 0x0390
@@ -32,7 +32,7 @@
#define BRIQ_PANEL_VER "1.1 (04/20/2002)"
#define BRIQ_PANEL_MSG0 "Loading Linux"

-static int vfd_is_open;
+static atomic_t vfd_is_open = ATOMIC_INIT(0);
static unsigned char vfd[40];
static int vfd_cursor;
static unsigned char ledpb, led;
@@ -68,35 +68,26 @@ static void set_led(char state)

static int briq_panel_open(struct inode *ino, struct file *filep)
{
- lock_kernel();
- /* enforce single access, vfd_is_open is protected by BKL */
- if (vfd_is_open) {
- unlock_kernel();
+ /* enforce single access */
+ if (atomic_cmpxchg(vfd_is_open, 0, 1))
return -EBUSY;
- }
- vfd_is_open = 1;
-
- unlock_kernel();
return 0;
}

static int briq_panel_release(struct inode *ino, struct file *filep)
{
- if (!vfd_is_open)
+ if (!atomic_cmpxchg(vfd_is_open, 1, 0))
return -ENODEV;
-
- vfd_is_open = 0;
-
return 0;
}

-static ssize_t briq_panel_read(struct file *file, char __user *buf, size_t count,
- loff_t *ppos)
+static ssize_t briq_panel_read(struct file *file, char __user *buf,
+ size_t count, loff_t *ppos)
{
unsigned short c;
unsigned char cp;

- if (!vfd_is_open)
+ if (!atomic_read(vfd_is_open))
return -ENODEV;

c = (inb(BRIQ_PANEL_LED_IOPORT) & 0x000c) | (ledpb & 0x0003);
--
1.6.0.6

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/