Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=bc4809e939b91c9642f1ddaea732e2d432ee6af6
Commit:     bc4809e939b91c9642f1ddaea732e2d432ee6af6
Parent:     61dcc6f4d9ed5db71f4f0be9026bdd09f1a7dc06
Author:     Ralf Baechle <[EMAIL PROTECTED]>
AuthorDate: Thu Mar 15 17:13:47 2007 +0000
Committer:  Ralf Baechle <[EMAIL PROTECTED]>
CommitDate: Sat Mar 17 01:03:28 2007 +0000

    [MIPS] RTLX: Protect rtlx_{read,write} with mutex.
    
    Signed-off-by: Ralf Baechle <[EMAIL PROTECTED]>
---
 arch/mips/kernel/rtlx.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c
index 0441c7c..745649e 100644
--- a/arch/mips/kernel/rtlx.c
+++ b/arch/mips/kernel/rtlx.c
@@ -54,6 +54,7 @@ static struct chan_waitqueues {
        wait_queue_head_t rt_queue;
        wait_queue_head_t lx_queue;
        atomic_t in_open;
+       struct mutex mutex;
 } channel_wqs[RTLX_CHANNELS];
 
 static struct irqaction irq;
@@ -314,6 +315,7 @@ ssize_t rtlx_read(int index, void *buff, size_t count, int 
user)
 
        lx = &rtlx->channel[index];
 
+       mutex_lock(&channel_wqs[index].mutex);
        smp_rmb();
        lx_write = lx->lx_write;
 
@@ -334,6 +336,7 @@ ssize_t rtlx_read(int index, void *buff, size_t count, int 
user)
        smp_wmb();
        lx->lx_read = (lx->lx_read + count) % lx->buffer_size;
        smp_wmb();
+       mutex_unlock(&channel_wqs[index].mutex);
 
        return count;
 }
@@ -349,6 +352,7 @@ ssize_t rtlx_write(int index, void *buffer, size_t count, 
int user)
 
        rt = &rtlx->channel[index];
 
+       mutex_lock(&channel_wqs[index].mutex);
        smp_rmb();
        rt_read = rt->rt_read;
 
@@ -368,6 +372,7 @@ ssize_t rtlx_write(int index, void *buffer, size_t count, 
int user)
        smp_wmb();
        rt->rt_write = (rt->rt_write + count) % rt->buffer_size;
        smp_wmb();
+       mutex_unlock(&channel_wqs[index].mutex);
 
        return count;
 }
@@ -486,6 +491,7 @@ static int rtlx_module_init(void)
                init_waitqueue_head(&channel_wqs[i].rt_queue);
                init_waitqueue_head(&channel_wqs[i].lx_queue);
                atomic_set(&channel_wqs[i].in_open, 0);
+               mutex_init(&channel_wqs[i].mutex);
 
                dev = device_create(mt_class, NULL, MKDEV(major, i),
                                    "%s%d", module_name, i);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to