Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp5599095pxb; Tue, 16 Feb 2021 02:44:34 -0800 (PST) X-Google-Smtp-Source: ABdhPJw8QO9KDc4M2Rf/SZVYLFmWSWThnVFbnO/orpp122e9PK/B1yb+qxUuaZSFXkrPxuRkfxVa X-Received: by 2002:a17:907:94d4:: with SMTP id dn20mr19921606ejc.397.1613472274484; Tue, 16 Feb 2021 02:44:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613472274; cv=none; d=google.com; s=arc-20160816; b=TjelnTxTlzdDPl/1cEshL6ARccp10SLiItJJKv2Pmhk5RTjlHsrHzJY7N5vQfU5BOm cdlnSLGjSPGeoZTST0ZDPH7vzsP/0cVLqS3Xqk+XAV9V8ySfJQLlt4mnt8ZJLtGBzWwE UmVbT1VNBn0WJ7J2kQEF6Gi0kNZYZCEkNrP0cByU3G2YHMFCdZV12kxJD3fY/nO+uks9 9kiKveyd7rP530/Mltrm+/aTh5zjkHzX8+zDQi615UC7QVOMJcKIk/fA0SSJeFrgJxLF bU4ZqZ7IARMTtDBVBF9t7+0c+qgAEKk04SnEjoYEeTOklbam2FWadTOITEIW0KmzCkgF U3KA== 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=ZEBYRXoStSTAKsaTYh8fHTcWbm61ORdXwLKUloTIJVs=; b=w3tw+gm6HqWDYAKT1ZSwMY8VIvdcX5XPuz3SOS4s/YN7A51dtRlf44PcSzzAt7q3Bm eC9/LxqpEqydfdxojPNgKHCwdOzMIxpdmeSsF1ikFG1PkZ8c7yEvW7S5uYRR84UnDmVf bOlSzUfm2AbqWAtDNTELxBgSK3PWY2Z8cSC85bYI6LyyoGO014SE9iCvk/MmBF6nMzFp Q2DQYjZW27dKHfaTLqlxmu17Giqu2ar9P5Xn8Z4rFh8L7cw4ZhjEgmMT4WvNGJ1nRmgP hGyj3GZLZTD11Aiq91f6z6B0eLZHs09hdlnSJA7j2f1hfbiCdXPTgid9hl1IuwSPf+tl XsFg== 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 de12si8857501edb.433.2021.02.16.02.44.11; Tue, 16 Feb 2021 02:44:34 -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 S229903AbhBPKk5 (ORCPT + 99 others); Tue, 16 Feb 2021 05:40:57 -0500 Received: from foss.arm.com ([217.140.110.172]:60314 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230060AbhBPKkq (ORCPT ); Tue, 16 Feb 2021 05:40:46 -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 7F5831FB; Tue, 16 Feb 2021 02:40:00 -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 3C9BE3F73B; Tue, 16 Feb 2021 02:39:57 -0800 (PST) Subject: Re: [PATCH V3 08/14] coresight: core: Add support for dedicated percpu sinks To: Mathieu Poirier , Suzuki K Poulose Cc: linux-arm-kernel@lists.infradead.org, coresight@lists.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> <20210204183446.GA1636242@xps15> From: Anshuman Khandual Message-ID: <72bd5139-a6e1-64c0-c111-818bc04a81b8@arm.com> Date: Tue, 16 Feb 2021 16:10:18 +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: <20210204183446.GA1636242@xps15> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2/5/21 12:04 AM, Mathieu Poirier wrote: > On Thu, Jan 28, 2021 at 09:16:34AM +0000, 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); > > The return value for _coresight_build_path() needs to be checked. Otherwise a > failure to allocate a node for the sink will go unoticed and make for a very > hard problem to debug. How about this instead ? diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c index 4795e28..e93e669 100644 --- a/drivers/hwtracing/coresight/coresight-core.c +++ b/drivers/hwtracing/coresight/coresight-core.c @@ -787,9 +787,10 @@ static int _coresight_build_path(struct coresight_device *csdev, 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; + if (_coresight_build_path(sink, sink, path) == 0) { + found = true; + goto out; + } } /* Not a sink - recursively explore each port found on this element */ > >>> + 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, > > Do we absolutely need to add a new sink type? It is only used in > _coresight_build_path() and that code could be: > > if (coresight_is_percpu_source(csdev)) { > sink == per_cpu(csdev_sink, source_ops(csdev)->cpu_id(csdev)); Do you mean if (sink == per_cpu(...)) above ? > if (sink && sink == csdev) { How could the sink fetched from the source csdev be the same ? I would still suggest keeping CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM for logical separation between source and sink, which also improves clarity and readability.