[NEUS7920-477] wlbt: prevent simultaneous gdb monitor clients
authorIvan Priest <i.priest@samsung.com>
Thu, 2 May 2019 16:16:05 +0000 (17:16 +0100)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:46:07 +0000 (23:46 +0900)
No more than one gdb client allowed per node at a time.
Multiple mmap clients are permitted as they are read only

Change-Id: I9e734c776ea13479c9191f6f8eca55ac15b00a3e
SCSC-Bug-Id: SSB-52259
Signed-off-by: Ivan Priest <i.priest@samsung.com>
drivers/misc/samsung/scsc/mx_mmap.c

index 72caddcddc01bb30dd96eacc35c1429c0a1f455f..10b32f5636c411d0ea68d965f39be391c45082c1 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/poll.h>
 
 #include <linux/kernel.h>
+#include <linux/bitops.h>
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/errno.h>
@@ -67,6 +68,8 @@ struct mx_mmap_dev {
        struct kfifo         fifo;
        /* Associated read_wait queue.*/
        wait_queue_head_t    read_wait;
+       /* User count */
+       volatile unsigned long lock;
 };
 
 /**
@@ -150,6 +153,11 @@ int mx_gdb_open(struct inode *inode, struct file *filp)
 
        SCSC_TAG_INFO(MX_MMAP, "open %p\n", filp);
 
+       if (test_and_set_bit_lock(0, &mx_dev->lock)) {
+               SCSC_TAG_ERR(MX_MMAP, "already open %p\n", filp);
+               return -EBUSY;
+       }
+
        filp->private_data = mx_dev;
        mx_dev->filp = filp;
        ret = kfifo_alloc(&mx_dev->fifo, GDB_TRANSPORT_BUF_LENGTH, GFP_KERNEL);
@@ -276,6 +284,8 @@ int mx_gdb_release(struct inode *inode, struct file *filp)
                return -EIO;
        }
 
+       clear_bit_unlock(0, &mx_dev->lock);
+
        filp->private_data = NULL;
        mx_dev->filp = NULL;
        kfifo_free(&mx_dev->fifo);