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 00d664c6a40104a17705d4c27616bdfa4c54f344..eeae375c7aed0f5e78821738a470c57bca9d4652 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 806b3dd5872dbd4d476b0a8766f651c3839cda08..3c629443274876823918dd06e758fa5ccce00988 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 a38ad2b0d95a3fa0cf567f3d58338d6b8f501900..1df1f8fade71b161cba16d25d5659a2488d195a5 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 9a0b346be58bccc2b05a5fe1813bf0ea355958ec..55ee0aca321c6bd522422a073ddc06b3424ddf56 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 189cc6ddc92bd883842286422b241a97860fbdac..62a520df8addf3486fd9877bda63ef7a4d545e87 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,