coresight-etm4x: Support context-ID tracing when PID namespace is enabled
authorChunyan Zhang <zhang.chunyan@linaro.org>
Fri, 31 Jul 2015 15:37:28 +0000 (09:37 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Aug 2015 20:30:15 +0000 (13:30 -0700)
Like ETTv3, ETMv4 also needs the similar modifications to support Context
ID tracing when PID namespace is enabled.

Signed-off-by: Chunyan Zhang <zhang.chunyan@linaro.org>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-etm4x.c
drivers/hwtracing/coresight/coresight-etm4x.h

index 9afbda5..254a81a 100644 (file)
@@ -506,8 +506,11 @@ static ssize_t reset_store(struct device *dev,
        }
 
        drvdata->ctxid_idx = 0x0;
-       for (i = 0; i < drvdata->numcidc; i++)
+       for (i = 0; i < drvdata->numcidc; i++) {
                drvdata->ctxid_pid[i] = 0x0;
+               drvdata->ctxid_vpid[i] = 0x0;
+       }
+
        drvdata->ctxid_mask0 = 0x0;
        drvdata->ctxid_mask1 = 0x0;
 
@@ -1825,7 +1828,7 @@ static ssize_t ctxid_pid_show(struct device *dev,
 
        spin_lock(&drvdata->spinlock);
        idx = drvdata->ctxid_idx;
-       val = (unsigned long)drvdata->ctxid_pid[idx];
+       val = (unsigned long)drvdata->ctxid_vpid[idx];
        spin_unlock(&drvdata->spinlock);
        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 }
@@ -1835,7 +1838,7 @@ static ssize_t ctxid_pid_store(struct device *dev,
                               const char *buf, size_t size)
 {
        u8 idx;
-       unsigned long val;
+       unsigned long vpid, pid;
        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 
        /*
@@ -1845,12 +1848,15 @@ static ssize_t ctxid_pid_store(struct device *dev,
         */
        if (!drvdata->ctxid_size || !drvdata->numcidc)
                return -EINVAL;
-       if (kstrtoul(buf, 16, &val))
+       if (kstrtoul(buf, 16, &vpid))
                return -EINVAL;
 
+       pid = coresight_vpid_to_pid(vpid);
+
        spin_lock(&drvdata->spinlock);
        idx = drvdata->ctxid_idx;
-       drvdata->ctxid_pid[idx] = (u64)val;
+       drvdata->ctxid_pid[idx] = (u64)pid;
+       drvdata->ctxid_vpid[idx] = (u64)vpid;
        spin_unlock(&drvdata->spinlock);
        return size;
 }
@@ -2513,8 +2519,11 @@ static void etm4_init_default_data(struct etmv4_drvdata *drvdata)
                drvdata->addr_type[1] = ETM_ADDR_TYPE_RANGE;
        }
 
-       for (i = 0; i < drvdata->numcidc; i++)
+       for (i = 0; i < drvdata->numcidc; i++) {
                drvdata->ctxid_pid[i] = 0x0;
+               drvdata->ctxid_vpid[i] = 0x0;
+       }
+
        drvdata->ctxid_mask0 = 0x0;
        drvdata->ctxid_mask1 = 0x0;
 
index 1e8fb36..c341002 100644 (file)
  * @ctxid_idx: Context ID index selector.
  * @ctxid_size:        Size of the context ID field to consider.
  * @ctxid_pid: Value of the context ID comparator.
+ * @ctxid_vpid:        Virtual PID seen by users if PID namespace is enabled, otherwise
+ *             the same value of ctxid_pid.
  * @ctxid_mask0:Context ID comparator mask for comparator 0-3.
  * @ctxid_mask1:Context ID comparator mask for comparator 4-7.
  * @vmid_idx:  VM ID index selector.
@@ -353,6 +355,7 @@ struct etmv4_drvdata {
        u8                              ctxid_idx;
        u8                              ctxid_size;
        u64                             ctxid_pid[ETMv4_MAX_CTXID_CMP];
+       u64                             ctxid_vpid[ETMv4_MAX_CTXID_CMP];
        u32                             ctxid_mask0;
        u32                             ctxid_mask1;
        u8                              vmid_idx;