Re: [PATCH v9 3/6] Coresight: Introduce a new struct coresight_path

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 1/28/2025 7:54 PM, James Clark wrote:


On 24/01/2025 7:25 am, Jie Gan wrote:
Add 'struct coresight_path' to store the data that is needed by
coresight_enable_path/coresight_disable_path. The structure
will be transmitted to the helper and sink device to enable
related funcationalities.

Signed-off-by: Jie Gan <quic_jiegan@xxxxxxxxxxx>
---
  drivers/hwtracing/coresight/coresight-core.c  | 87 ++++++++++++++-----
  drivers/hwtracing/coresight/coresight-etb10.c |  3 +-
  .../hwtracing/coresight/coresight-etm-perf.c  | 52 ++++++-----
  .../hwtracing/coresight/coresight-etm-perf.h  |  2 +-
  drivers/hwtracing/coresight/coresight-priv.h  | 21 +++--
  drivers/hwtracing/coresight/coresight-sysfs.c | 32 +++----
  .../hwtracing/coresight/coresight-tmc-etf.c   |  3 +-
  .../hwtracing/coresight/coresight-tmc-etr.c   |  6 +-
  drivers/hwtracing/coresight/coresight-trbe.c  |  4 +-
  drivers/hwtracing/coresight/ultrasoc-smb.c    |  3 +-
  10 files changed, 137 insertions(+), 76 deletions(-)


[...]


      INIT_LIST_HEAD(path);
+    cs_path->path = path;
+    /*
+     * Since not all source devices have a defined trace_id function,
+     * make sure to check for it before use.
+     *
+     * Assert the mode is CS_MODE_SYSFS, the trace_id will be assigned
+     * again later if the mode is CS_MODE_PERF.
+     */
+    if (source_ops(source)->trace_id != NULL) {
+        rc = source_ops(source)->trace_id(source, CS_MODE_SYSFS, NULL);

I don't think we should do this. Doesn't this consume two trace IDs for each session? And I'm not even sure if it's released properly if it's overwritten.
Yes, you are right, we may waste our trace ID here.

It should be possible to consolidate the all the trace ID allocation to a single step when building the path, or another function that gets called just after the path is built. At the moment the ID can be allocated from about 5 different places and it's quite hard to understand, especially with these new changes. I have some of it coded up, let me finish it off and I can share it.
Waiting for your update. I am also looking forward to another solution.


+        if(IS_VALID_CS_TRACE_ID(rc))
+            cs_path->trace_id = rc;
+        else
+            cs_path->trace_id = 0;
+    }
+    else
+        cs_path->trace_id = 0;

[...]

+/**
+ * struct coresight_path - data needed by enable/disable path
+ * @handle:        perf aux handle for ETM.
+ * @path:        path from source to sink.
+ * @trace_id:        trace_id of the whole path.
+ */
+struct coresight_path {
+    struct perf_output_handle    *handle;

This is only needed to avoid adding *handle to the enable function call signature, but having it here implies it needs to be stored. And then we need to manage the lifecycle of it by nulling it on deletion. All of this can be avoided by just adding handle to enable().

Unrelated to this patch, but I'm not sure why we were passing around void* for handle either. It just makes the code hard to read and implies some flexibility that doesn't exist. It's always "struct perf_output_handle", so we can change void* to that in the enable functions. I also have a patch for this that I'll share in a bit.

Thanks for support. I am totally agree with you. It's not related to the patch series and it looks like a hack here.

Waiting for your update.

+    struct list_head        *path;
+    u8                trace_id;
+};
+
  static inline void coresight_insert_barrier_packet(void *buf)
  {
      if (buf)
@@ -132,16 +144,15 @@ static inline void CS_UNLOCK(void __iomem *addr)
      } while (0);
  }
-void coresight_disable_path(struct list_head *path);
-int coresight_enable_path(struct list_head *path, enum cs_mode mode,
-              void *sink_data);
+void coresight_disable_path(struct coresight_path *cs_path);
+int coresight_enable_path(struct coresight_path *cs_path, enum cs_mode mode);
  struct coresight_device *coresight_get_sink(struct list_head *path);

This needs to be exported otherwise the build fails because you use it in a module in another commit. I assume you are building as static?


Yes, you are right. I made a mistake here. I did not test it with build as module. Sorry about the mistake.

Thanks,
Jie






[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux