lkml.org 
[lkml]   [2023]   [Jan]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v16 1/8] coresight: core: Use IDR for non-cpu bound sources' paths.
    Date
    Except stm, there could be other sources which are not associated
    with cpus. Use IDR to store and search these sources' paths.

    Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    Reviewed-by: Mike Leach <mike.leach@linaro.org>
    Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
    ---
    drivers/hwtracing/coresight/coresight-core.c | 37 ++++++++++++++------
    1 file changed, 26 insertions(+), 11 deletions(-)

    diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c
    index ce3aa845ecc2..5eb013f49a0d 100644
    --- a/drivers/hwtracing/coresight/coresight-core.c
    +++ b/drivers/hwtracing/coresight/coresight-core.c
    @@ -8,6 +8,7 @@
    #include <linux/types.h>
    #include <linux/device.h>
    #include <linux/io.h>
    +#include <linux/idr.h>
    #include <linux/err.h>
    #include <linux/export.h>
    #include <linux/slab.h>
    @@ -26,6 +27,13 @@
    static DEFINE_MUTEX(coresight_mutex);
    static DEFINE_PER_CPU(struct coresight_device *, csdev_sink);

    +/*
    + * Use IDR to map the hash of the source's device name
    + * to the pointer of path for the source. The idr is for
    + * the sources which aren't associated with CPU.
    + */
    +static DEFINE_IDR(path_idr);
    +
    /**
    * struct coresight_node - elements of a path, from source to sink
    * @csdev: Address of an element.
    @@ -42,14 +50,6 @@ struct coresight_node {
    */
    static DEFINE_PER_CPU(struct list_head *, tracer_path);

    -/*
    - * As of this writing only a single STM can be found in CS topologies. Since
    - * there is no way to know if we'll ever see more and what kind of
    - * configuration they will enact, for the time being only define a single path
    - * for STM.
    - */
    -static struct list_head *stm_path;
    -
    /*
    * When losing synchronisation a new barrier packet needs to be inserted at the
    * beginning of the data collected in a buffer. That way the decoder knows that
    @@ -1075,6 +1075,7 @@ int coresight_enable(struct coresight_device *csdev)
    struct coresight_device *sink;
    struct list_head *path;
    enum coresight_dev_subtype_source subtype;
    + u32 hash;

    subtype = csdev->subtype.source_subtype;

    @@ -1129,7 +1130,14 @@ int coresight_enable(struct coresight_device *csdev)
    per_cpu(tracer_path, cpu) = path;
    break;
    case CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE:
    - stm_path = path;
    + /*
    + * Use the hash of source's device name as ID
    + * and map the ID to the pointer of the path.
    + */
    + hash = hashlen_hash(hashlen_string(NULL, dev_name(&csdev->dev)));
    + ret = idr_alloc_u32(&path_idr, path, &hash, hash, GFP_KERNEL);
    + if (ret)
    + goto err_source;
    break;
    default:
    /* We can't be here */
    @@ -1153,6 +1161,7 @@ void coresight_disable(struct coresight_device *csdev)
    {
    int cpu, ret;
    struct list_head *path = NULL;
    + u32 hash;

    mutex_lock(&coresight_mutex);

    @@ -1170,14 +1179,20 @@ void coresight_disable(struct coresight_device *csdev)
    per_cpu(tracer_path, cpu) = NULL;
    break;
    case CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE:
    - path = stm_path;
    - stm_path = NULL;
    + hash = hashlen_hash(hashlen_string(NULL, dev_name(&csdev->dev)));
    + /* Find the path by the hash. */
    + path = idr_find(&path_idr, hash);
    + if (path == NULL) {
    + pr_err("Path is not found for %s\n", dev_name(&csdev->dev));
    + goto out;
    + }
    break;
    default:
    /* We can't be here */
    break;
    }

    + idr_remove(&path_idr, hash);
    coresight_disable_path(path);
    coresight_release_path(path);

    --
    2.39.0
    \
     
     \ /
      Last update: 2023-03-26 23:29    [W:3.028 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site