Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp5590023pxb; Tue, 16 Feb 2021 02:25:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJz3YAfoIbbAGWyEltmNpp0UDsPjY5Sr41AxptKGnd8dmiEh/fmdEkqIX3NXoeyQZ1RE5W+/ X-Received: by 2002:a17:907:96aa:: with SMTP id hd42mr19629796ejc.526.1613471132011; Tue, 16 Feb 2021 02:25:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613471132; cv=none; d=google.com; s=arc-20160816; b=MMd1+a9z/QuIL1R/uiK2Bye18Ay3mIxTWiKzIIN3DW5Xfskmm18A9CS8DmN+UDSzAm gQIcTxgwEMqc//smW/MGCDUDOKUSj1Z5y30KlXEirhZYj6afrp1QGxDt5QFY/anzkA+i 00bo3dK3DcCGBngOoaYGItEry3EImXCMWQty8kaMVageivLD+Me5jXPA3qYoDdByfyj0 rgnlIiwc6nhHZc0uSYMSSIHRH4QP3AZYAF+yzFdPYY+2EFyVmXeVqIVuUIMmauFpa6kx 0i2ffUq7PtOT1mEAdW2MAT3SVVwTWBLawiUYe+VqLPq+AGDCvv668TrEt1z5DjuWqEK8 QbYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=dPW8IvCmdT21s/WsOConOPEzP73pL3JGvGYT+4HZucU=; b=bXgM4prhCvteBVSvaaIYo4X+vPQCgtHDpdtGojmMdM+P0rS05ox+jrRUdCxGcLOfdp oEDQ+Rqfb/nB0rQJ4owPjHMjOuAczybywnZloIRuSsRZcfQz6WyQYyBCnAVXa5W/w2Ku OTwIG4CFiW5gHlvQLy+j3iyDQpuSiDNe6HgkGivsZzjDOYC0rjI+xvc6fKNN2+ORnDjx 2iuns4Egk1QRmR1H47VHU1emWINTA0T3xPN3da0zais3s8VApD8sP/kd+z0+gp3guwa6 rDlvsgnXq5dfpXOBHBb8rZ4cZiGGzMO5Gr5nB3qYtraufvEPnzM4fZgAAgVtlKojm1WU bouA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o11si8505463eju.241.2021.02.16.02.25.08; Tue, 16 Feb 2021 02:25:31 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229662AbhBPKYR (ORCPT + 99 others); Tue, 16 Feb 2021 05:24:17 -0500 Received: from foss.arm.com ([217.140.110.172]:59892 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229703AbhBPKWE (ORCPT ); Tue, 16 Feb 2021 05:22:04 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 28754D6E; Tue, 16 Feb 2021 02:21:18 -0800 (PST) Received: from [192.168.0.130] (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id A60263F73B; Tue, 16 Feb 2021 02:21:15 -0800 (PST) Subject: Re: [PATCH V3 08/14] coresight: core: Add support for dedicated percpu sinks To: Suzuki K Poulose , linux-arm-kernel@lists.infradead.org, coresight@lists.linaro.org Cc: mathieu.poirier@linaro.org, mike.leach@linaro.org, lcherian@marvell.com, linux-kernel@vger.kernel.org References: <1611737738-1493-1-git-send-email-anshuman.khandual@arm.com> <1611737738-1493-9-git-send-email-anshuman.khandual@arm.com> From: Anshuman Khandual Message-ID: <14f558ff-25d0-8a64-f5b3-38422dbcd69b@arm.com> Date: Tue, 16 Feb 2021 15:51:38 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 1/28/21 2:46 PM, Suzuki K Poulose wrote: > On 1/27/21 8:55 AM, Anshuman Khandual wrote: >> Add support for dedicated sinks that are bound to individual CPUs. (e.g, >> TRBE). To allow quicker access to the sink for a given CPU bound source, >> keep a percpu array of the sink devices. Also, add support for building >> a path to the CPU local sink from the ETM. >> >> This adds a new percpu sink type CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM. >> This new sink type is exclusively available and can only work with percpu >> source type device CORESIGHT_DEV_SUBTYPE_SOURCE_PERCPU_PROC. >> >> This defines a percpu structure that accommodates a single coresight_device >> which can be used to store an initialized instance from a sink driver. As >> these sinks are exclusively linked and dependent on corresponding percpu >> sources devices, they should also be the default sink device during a perf >> session. >> >> Outwards device connections are scanned while establishing paths between a >> source and a sink device. But such connections are not present for certain >> percpu source and sink devices which are exclusively linked and dependent. >> Build the path directly and skip connection scanning for such devices. >> >> Cc: Mathieu Poirier >> Cc: Mike Leach >> Cc: Suzuki K Poulose >> Signed-off-by: Anshuman Khandual >> --- >> Changes in V3: >> >> - Updated coresight_find_default_sink() >> >>   drivers/hwtracing/coresight/coresight-core.c | 16 ++++++++++++++-- >>   include/linux/coresight.h                    | 12 ++++++++++++ >>   2 files changed, 26 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c >> index 0062c89..4795e28 100644 >> --- a/drivers/hwtracing/coresight/coresight-core.c >> +++ b/drivers/hwtracing/coresight/coresight-core.c >> @@ -23,6 +23,7 @@ >>   #include "coresight-priv.h" >>     static DEFINE_MUTEX(coresight_mutex); >> +DEFINE_PER_CPU(struct coresight_device *, csdev_sink); >>     /** >>    * struct coresight_node - elements of a path, from source to sink >> @@ -784,6 +785,13 @@ static int _coresight_build_path(struct coresight_device *csdev, >>       if (csdev == sink) >>           goto out; >>   +    if (coresight_is_percpu_source(csdev) && coresight_is_percpu_sink(sink) && >> +        sink == per_cpu(csdev_sink, source_ops(csdev)->cpu_id(csdev))) { >> +        _coresight_build_path(sink, sink, path); >> +        found = true; >> +        goto out; >> +    } >> + >>       /* Not a sink - recursively explore each port found on this element */ >>       for (i = 0; i < csdev->pdata->nr_outport; i++) { >>           struct coresight_device *child_dev; >> @@ -999,8 +1007,12 @@ coresight_find_default_sink(struct coresight_device *csdev) >>       int depth = 0; >>         /* look for a default sink if we have not found for this device */ >> -    if (!csdev->def_sink) >> -        csdev->def_sink = coresight_find_sink(csdev, &depth); >> +    if (!csdev->def_sink) { >> +        if (coresight_is_percpu_source(csdev)) >> +            csdev->def_sink = per_cpu(csdev_sink, source_ops(csdev)->cpu_id(csdev)); >> +        if (!csdev->def_sink) >> +            csdev->def_sink = coresight_find_sink(csdev, &depth); >> +    } >>       return csdev->def_sink; >>   } >>   diff --git a/include/linux/coresight.h b/include/linux/coresight.h >> index 976ec26..bc3a5ca 100644 >> --- a/include/linux/coresight.h >> +++ b/include/linux/coresight.h >> @@ -50,6 +50,7 @@ enum coresight_dev_subtype_sink { >>       CORESIGHT_DEV_SUBTYPE_SINK_PORT, >>       CORESIGHT_DEV_SUBTYPE_SINK_BUFFER, >>       CORESIGHT_DEV_SUBTYPE_SINK_SYSMEM, >> +    CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM, >>   }; >>     enum coresight_dev_subtype_link { >> @@ -428,6 +429,17 @@ static inline void csdev_access_write64(struct csdev_access *csa, u64 val, u32 o >>           csa->write(val, offset, false, true); >>   } >>   +static inline bool coresight_is_percpu_source(struct coresight_device *csdev) >> +{ >> +    return csdev && (csdev->type == CORESIGHT_DEV_TYPE_SOURCE) && >> +           csdev->subtype.source_subtype == CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; > > Please add () around the last line. Same below. Okay, will do. > >> +} >> + >> +static inline bool coresight_is_percpu_sink(struct coresight_device *csdev) >> +{ >> +    return csdev && (csdev->type == CORESIGHT_DEV_TYPE_SINK) && >> +           csdev->subtype.sink_subtype == CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM; Okay, will add here as well. >> +} >>   #else    /* !CONFIG_64BIT */ >>     static inline u64 csdev_access_relaxed_read64(struct csdev_access *csa, >> > > With the above : > > Tested-by: Suzuki K Poulose > Reviewed-by: Suzuki K Poulose