coresight: etb10: moving to local atomic operations
authorMathieu Poirier <mathieu.poirier@linaro.org>
Thu, 18 Feb 2016 00:51:58 +0000 (17:51 -0700)
committerMathieu Poirier <mathieu.poirier@linaro.org>
Wed, 1 Jun 2016 21:31:25 +0000 (15:31 -0600)
Moving to use local atomic operations to take advantage of the
lockless implementation, something that will come handy when
the ETB is accessed from the Perf subsystem. Also changing the
name of the variable to something more meaningful.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 27b10da8fff27d74b755707e61637f6ab488c617)

drivers/hwtracing/coresight/coresight-etb10.c

index 917562ecf82a08a589ec791b0bb321688a0b83e3..162c9ccc8c330fc70e04ae9dfb47209d6226beab 100644 (file)
@@ -10,6 +10,7 @@
  * GNU General Public License for more details.
  */
 
+#include <asm/local.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -71,7 +72,7 @@
  * @csdev:     component vitals needed by the framework.
  * @miscdev:   specifics to handle "/dev/xyz.etb" entry.
  * @spinlock:  only one at a time pls.
- * @in_use:    synchronise user space access to etb buffer.
+ * @reading:   synchronise user space access to etb buffer.
  * @buf:       area of memory where ETB buffer content gets sent.
  * @buffer_depth: size of @buf.
  * @enable:    this ETB is being used.
@@ -84,7 +85,7 @@ struct etb_drvdata {
        struct coresight_device *csdev;
        struct miscdevice       miscdev;
        spinlock_t              spinlock;
-       atomic_t                in_use;
+       local_t                 reading;
        u8                      *buf;
        u32                     buffer_depth;
        bool                    enable;
@@ -277,7 +278,7 @@ static int etb_open(struct inode *inode, struct file *file)
        struct etb_drvdata *drvdata = container_of(file->private_data,
                                                   struct etb_drvdata, miscdev);
 
-       if (atomic_cmpxchg(&drvdata->in_use, 0, 1))
+       if (local_cmpxchg(&drvdata->reading, 0, 1))
                return -EBUSY;
 
        dev_dbg(drvdata->dev, "%s: successfully opened\n", __func__);
@@ -313,7 +314,7 @@ static int etb_release(struct inode *inode, struct file *file)
 {
        struct etb_drvdata *drvdata = container_of(file->private_data,
                                                   struct etb_drvdata, miscdev);
-       atomic_set(&drvdata->in_use, 0);
+       local_set(&drvdata->reading, 0);
 
        dev_dbg(drvdata->dev, "%s: released\n", __func__);
        return 0;