OSDN Git Service

coresight: etm: perf: Add default sink selection to etm perf
authorMike Leach <mike.leach@linaro.org>
Thu, 16 Jul 2020 17:57:45 +0000 (11:57 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 21 Jul 2020 13:48:40 +0000 (15:48 +0200)
Add default sink selection to the perf trace handling in the etm driver.
Uses the select default sink infrastructure to select a sink for the perf
session, if no other sink is specified.

Signed-off-by: Mike Leach <mike.leach@linaro.org>
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Link: https://lore.kernel.org/r/20200716175746.3338735-17-mathieu.poirier@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-etm-perf.c

index 84f1dcb..1a3169e 100644 (file)
@@ -226,9 +226,6 @@ static void *etm_setup_aux(struct perf_event *event, void **pages,
                sink = coresight_get_enabled_sink(true);
        }
 
-       if (!sink)
-               goto err;
-
        mask = &event_data->mask;
 
        /*
@@ -254,6 +251,16 @@ static void *etm_setup_aux(struct perf_event *event, void **pages,
                }
 
                /*
+                * No sink provided - look for a default sink for one of the
+                * devices. At present we only support topology where all CPUs
+                * use the same sink [N:1], so only need to find one sink. The
+                * coresight_build_path later will remove any CPU that does not
+                * attach to the sink, or if we have not found a sink.
+                */
+               if (!sink)
+                       sink = coresight_find_default_sink(csdev);
+
+               /*
                 * Building a path doesn't enable it, it simply builds a
                 * list of devices from source to sink that can be
                 * referenced later when the path is actually needed.
@@ -267,6 +274,10 @@ static void *etm_setup_aux(struct perf_event *event, void **pages,
                *etm_event_cpu_path_ptr(event_data, cpu) = path;
        }
 
+       /* no sink found for any CPU - cannot trace */
+       if (!sink)
+               goto err;
+
        /* If we don't have any CPUs ready for tracing, abort */
        cpu = cpumask_first(mask);
        if (cpu >= nr_cpu_ids)