linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Tingwei Zhang <tingwei@codeaurora.org>
Cc: tsoni@codeaurora.org,
	Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>,
	Kim Phillips <kim.phillips@arm.com>,
	Mao Jinlong <jinlmao@codeaurora.org>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	coresight@lists.linaro.org, Randy Dunlap <rdunlap@infradead.org>,
	Mian Yousaf Kaukab <ykaukab@suse.de>,
	Russell King <linux@armlinux.org.uk>,
	Leo Yan <leo.yan@linaro.org>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v1 19/21] coresight: disable trace path with device being removed
Date: Mon, 13 Jul 2020 16:11:23 -0600	[thread overview]
Message-ID: <20200713221123.GA1277971@xps15> (raw)
In-Reply-To: <20200701071427.10477-20-tingwei@codeaurora.org>

Good day Tingwei,

On Wed, Jul 01, 2020 at 03:14:25PM +0800, Tingwei Zhang wrote:
> Coresight trace path holds the reference to devices on the path.
> Disable trace path before really remove coresight device.
> 
> Signed-off-by: Tingwei Zhang <tingwei@codeaurora.org>
> ---
>  drivers/hwtracing/coresight/coresight.c | 137 ++++++++++++++++++++++++
>  1 file changed, 137 insertions(+)
> 
> diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c
> index cf7079f4b99c..0870316ec4c4 100644
> --- a/drivers/hwtracing/coresight/coresight.c
> +++ b/drivers/hwtracing/coresight/coresight.c
> @@ -490,6 +490,138 @@ void coresight_disable_path(struct list_head *path)
>  }
>  EXPORT_SYMBOL_GPL(coresight_disable_path);
>  
> +/*
> + *  coresight_dev_on_path - Check if device is on trace path.
> + *
> + *  @path - The trace path to check with.
> + *  @csdev - The coresight device to check
> + *
> + *  Returns true if the device is on trace path.
> + */
> +bool coresight_dev_on_path(struct list_head *path,
> +			struct coresight_device *csdev)
> +{
> +	struct coresight_node *nd;
> +
> +	list_for_each_entry(nd, path, link) {
> +		if (csdev == nd->csdev)
> +			return true;
> +	}
> +	return false;
> +}
> +
> +/*
> + *  coresight_disable_path_with - Disable trace path
> + *  if trace path has concerned device on it.
> + *
> + *  @path - The trace path to check.
> + *  @csdev - Concerned coresight device
> + *
> + *  Returns true if the device is on trace path.
> + */
> +static bool coresight_disable_path_with(struct list_head *path,
> +				struct coresight_device *csdev)
> +{
> +	struct coresight_node *src_nd;
> +	struct coresight_device *srcdev;
> +	bool ret;
> +
> +	ret = coresight_dev_on_path(path, csdev);
> +	if (ret) {
> +		src_nd = list_first_entry(path, struct coresight_node, link);
> +		srcdev = src_nd->csdev;
> +		if (source_ops(srcdev)->disable)
> +			source_ops(srcdev)->disable(srcdev, NULL);
> +		srcdev->enable = false;
> +		coresight_disable_path(path);
> +		coresight_release_path(path);
> +	}
> +
> +	return ret;
> +}
> +
> +/*
> + *  __coresight_disable_with - Check cpu trace path and
> + *  stm trace path. Disable any path with conerned device.
> + *
> + *  @csdev - Concerned coresight device
> + *
> + */
> +static void __coresight_disable_with(struct coresight_device *csdev)
> +{
> +	int cpu;
> +	struct list_head *path = NULL;
> +
> +	for_each_possible_cpu(cpu) {
> +		path = per_cpu(tracer_path, cpu);
> +		if (path) {
> +			if (coresight_disable_path_with(path, csdev))
> +				per_cpu(tracer_path, cpu) = NULL;
> +		}
> +	}
> +	if (stm_path) {
> +		path = stm_path;
> +		if (coresight_disable_path_with(path, csdev))
> +			stm_path = NULL;
> +	}
> +}
> +
> +static int coresight_disable_match(struct device *dev, void *data)
> +{
> +	int i;
> +	struct coresight_device *csdev, *iterator;
> +	struct coresight_connection *conn;
> +
> +	csdev = data;
> +	iterator = to_coresight_device(dev);
> +
> +	/* No need to check oneself */
> +	if (csdev == iterator)
> +		return 0;
> +
> +	/*
> +	 * Circle throuch all the connection of that component.  If we find
> +	 * a connection whose name matches @csdev, disable path with it.
> +	 */
> +	for (i = 0; i < iterator->pdata->nr_outport; i++) {
> +		conn = &iterator->pdata->conns[i];
> +
> +		if (conn->child_dev == NULL)
> +			continue;
> +
> +		if (csdev->dev.fwnode == conn->child_fwnode) {
> +			__coresight_disable_with(iterator);
> +
> +			/* No need to continue */
> +			break;
> +		}
> +	}
> +
> +	/*
> +	 * Returning '0' ensures that all known components on the
> +	 * bus will be checked.
> +	 */
> +	return 0;
> +}
> +
> +/**
> + * coresight_disable_with - disable any path with @csdev.
> + * @csdev:	The device to check.
> + *
> + * Search for all the active paths. If @csdev is part of that path,
> + * disable the whole path. Device with CORESIGHT_DEV_TYPE_HELPER type
> + * is not part of path. Search for its parent device and disable any
> + * path with that device.
> + */
> +void coresight_disable_with(struct coresight_device *csdev)
> +{
> +	if (csdev->type != CORESIGHT_DEV_TYPE_HELPER)
> +		return __coresight_disable_with(csdev);

The main problem is indeed to take care of ongoing sessions which, other than the
module mechanic, is the bulk of the code added in this set.

I've been thinking about this problem while reviewing an unrelated patchset and
the solution I see is to let the driver core work for us.  Since there is no
implicit relation between modules, all we need is to introduce one using
try_module_get() and module_put().  The module for each csdev can be accessed
via csdev->dev->parent->driver->module.

From looking at the code if we call try_module_get() in coresight_grab_device()
and module_put() in coresight_drop_device(), the driver core won't let users
remove modules for as long as a session is using the driver.  That way all you
need is the loop below and that is quite simple.

Let me know what you think,
Mathieu

> +	if (csdev->pdata->nr_inport)
> +		bus_for_each_dev(&coresight_bustype, NULL,
> +				 csdev, coresight_disable_match);
> +}
> +
>  int coresight_enable_path(struct list_head *path, u32 mode, void *sink_data)
>  {
>  
> @@ -1243,6 +1375,7 @@ void coresight_release_platform_data(struct coresight_platform_data *pdata)
>  
>  	for (i = 0; i < pdata->nr_outport; i++) {
>  		if (pdata->conns[i].child_fwnode) {
> +			pdata->conns[i].child_dev = NULL;
>  			fwnode_handle_put(pdata->conns[i].child_fwnode);
>  			pdata->conns[i].child_fwnode = NULL;
>  		}
> @@ -1349,9 +1482,13 @@ EXPORT_SYMBOL_GPL(coresight_register);
>  void coresight_unregister(struct coresight_device *csdev)
>  {
>  	etm_perf_del_symlink_sink(csdev);
> +
> +	mutex_lock(&coresight_mutex);
> +	coresight_disable_with(csdev);
>  	/* Remove references of that device in the topology */
>  	coresight_remove_conns(csdev);
>  	coresight_release_platform_data(csdev->pdata);
> +	mutex_unlock(&coresight_mutex);
>  	device_unregister(&csdev->dev);
>  }
>  EXPORT_SYMBOL_GPL(coresight_unregister);
> -- 
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2020-07-13 22:13 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-01  7:14 [PATCH v1 00/21] coresight: allow to build coresight as modules Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 01/21] coresight: cpu_debug: add module name in Kconfig Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 02/21] coresight: cpu_debug: define MODULE_DEVICE_TABLE Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 03/21] coresight: use IS_ENABLED for CONFIGs that may be modules Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 04/21] coresight: add coresight prefix to barrier_pkt Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 05/21] coresight: export global symbols Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 06/21] Allow to build coresight-stm as a module, for ease of development Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 07/21] coresight: allow etm3x to be built as a module Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 08/21] coresight: allow etm4x " Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 09/21] coresight: allow etb " Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 10/21] coresight: allow tpiu " Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 11/21] coresight: allow tmc " Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 12/21] coresight: remove multiple init calls from funnel driver Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 13/21] coresight: remove multiple init calls from replicator driver Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 14/21] coresight: allow funnel and replicator drivers to be built as modules Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 15/21] coresight: cti: add function to register cti associate ops Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 16/21] coresight: allow cti to be built as a module Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 17/21] coresight: tmc-etr: add function to register catu ops Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 18/21] coresight: allow catu drivers to be built as modules Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 19/21] coresight: disable trace path with device being removed Tingwei Zhang
2020-07-13 22:11   ` Mathieu Poirier [this message]
2020-07-14  1:10     ` tingwei
2020-07-01  7:14 ` [PATCH v1 20/21] coresight: allow the coresight core driver to be built as a module Tingwei Zhang
2020-07-01  7:14 ` [PATCH v1 21/21] coresight: perf: clean up perf event on device unregister path Tingwei Zhang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200713221123.GA1277971@xps15 \
    --to=mathieu.poirier@linaro.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=coresight@lists.linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jinlmao@codeaurora.org \
    --cc=kim.phillips@arm.com \
    --cc=leo.yan@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux@armlinux.org.uk \
    --cc=rdunlap@infradead.org \
    --cc=saiprakash.ranjan@codeaurora.org \
    --cc=suzuki.poulose@arm.com \
    --cc=tingwei@codeaurora.org \
    --cc=tsoni@codeaurora.org \
    --cc=ykaukab@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).