coresight: Communicate perf event to sink buffer allocation functions
authorMathieu Poirier <mathieu.poirier@linaro.org>
Thu, 25 Apr 2019 19:53:01 +0000 (13:53 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Apr 2019 20:00:17 +0000 (22:00 +0200)
Make struct perf_event available to sink buffer allocation functions in
order to use the pid they carry to allocate and free buffer memory along
with regimenting access to what source a sink can collect data for.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Tested-by: Leo Yan <leo.yan@linaro.org>
Tested-by: Robert Walker <robert.walker@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-etb10.c
drivers/hwtracing/coresight/coresight-etm-perf.c
drivers/hwtracing/coresight/coresight-tmc-etf.c
drivers/hwtracing/coresight/coresight-tmc-etr.c
include/linux/coresight.h

index 00d664c..eeae375 100644 (file)
@@ -343,10 +343,11 @@ static int etb_disable(struct coresight_device *csdev)
        return 0;
 }
 
-static void *etb_alloc_buffer(struct coresight_device *csdev, int cpu,
-                             void **pages, int nr_pages, bool overwrite)
+static void *etb_alloc_buffer(struct coresight_device *csdev,
+                             struct perf_event *event, void **pages,
+                             int nr_pages, bool overwrite)
 {
-       int node;
+       int node, cpu = event->cpu;
        struct cs_buffers *buf;
 
        if (cpu == -1)
index 806b3dd..3c62944 100644 (file)
@@ -277,7 +277,7 @@ static void *etm_setup_aux(struct perf_event *event, void **pages,
 
        /* Allocate the sink buffer for this session */
        event_data->snk_config =
-                       sink_ops(sink)->alloc_buffer(sink, cpu, pages,
+                       sink_ops(sink)->alloc_buffer(sink, event, pages,
                                                     nr_pages, overwrite);
        if (!event_data->snk_config)
                goto err;
index a38ad2b..1df1f8f 100644 (file)
@@ -350,10 +350,11 @@ static void tmc_disable_etf_link(struct coresight_device *csdev,
        dev_dbg(drvdata->dev, "TMC-ETF disabled\n");
 }
 
-static void *tmc_alloc_etf_buffer(struct coresight_device *csdev, int cpu,
-                                 void **pages, int nr_pages, bool overwrite)
+static void *tmc_alloc_etf_buffer(struct coresight_device *csdev,
+                                 struct perf_event *event, void **pages,
+                                 int nr_pages, bool overwrite)
 {
-       int node;
+       int node, cpu = event->cpu;
        struct cs_buffers *buf;
 
        if (cpu == -1)
index 9a0b346..55ee0ac 100644 (file)
@@ -1167,13 +1167,18 @@ out:
  * reaches a minimum limit (1M), beyond which we give up.
  */
 static struct etr_perf_buffer *
-tmc_etr_setup_perf_buf(struct tmc_drvdata *drvdata, int node, int nr_pages,
-                      void **pages, bool snapshot)
+tmc_etr_setup_perf_buf(struct tmc_drvdata *drvdata, struct perf_event *event,
+                      int nr_pages, void **pages, bool snapshot)
 {
+       int node, cpu = event->cpu;
        struct etr_buf *etr_buf;
        struct etr_perf_buffer *etr_perf;
        unsigned long size;
 
+       if (cpu == -1)
+               cpu = smp_processor_id();
+       node = cpu_to_node(cpu);
+
        etr_perf = kzalloc_node(sizeof(*etr_perf), GFP_KERNEL, node);
        if (!etr_perf)
                return ERR_PTR(-ENOMEM);
@@ -1211,16 +1216,13 @@ done:
 
 
 static void *tmc_alloc_etr_buffer(struct coresight_device *csdev,
-                                 int cpu, void **pages, int nr_pages,
-                                 bool snapshot)
+                                 struct perf_event *event, void **pages,
+                                 int nr_pages, bool snapshot)
 {
        struct etr_perf_buffer *etr_perf;
        struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
-       if (cpu == -1)
-               cpu = smp_processor_id();
-
-       etr_perf = tmc_etr_setup_perf_buf(drvdata, cpu_to_node(cpu),
+       etr_perf = tmc_etr_setup_perf_buf(drvdata, event,
                                          nr_pages, pages, snapshot);
        if (IS_ERR(etr_perf)) {
                dev_dbg(drvdata->dev, "Unable to allocate ETR buffer\n");
index 189cc6d..62a520d 100644 (file)
@@ -193,8 +193,9 @@ struct coresight_device {
 struct coresight_ops_sink {
        int (*enable)(struct coresight_device *csdev, u32 mode, void *data);
        int (*disable)(struct coresight_device *csdev);
-       void *(*alloc_buffer)(struct coresight_device *csdev, int cpu,
-                             void **pages, int nr_pages, bool overwrite);
+       void *(*alloc_buffer)(struct coresight_device *csdev,
+                             struct perf_event *event, void **pages,
+                             int nr_pages, bool overwrite);
        void (*free_buffer)(void *config);
        unsigned long (*update_buffer)(struct coresight_device *csdev,
                              struct perf_output_handle *handle,