All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaud POULIQUEN <arnaud.pouliquen@st.com>
To: Mathieu Poirier <mathieu.poirier@linaro.org>,
	"ohad@wizery.com" <ohad@wizery.com>,
	"bjorn.andersson@linaro.org" <bjorn.andersson@linaro.org>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>
Cc: "linux-remoteproc@vger.kernel.org"
	<linux-remoteproc@vger.kernel.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v4 17/17] remoteproc: Refactor rproc delete and cdev release path
Date: Wed, 27 Jan 2021 09:56:10 +0100	[thread overview]
Message-ID: <1c8a1395-8621-31ab-3ded-768bc83e6f9f@st.com> (raw)
In-Reply-To: <20201218173228.2277032-18-mathieu.poirier@linaro.org>


look good to me
Reviewed-by: Arnaud Pouliquen <arnaud.pouliquen@st.com>

On 12/18/20 6:32 PM, Mathieu Poirier wrote:
> Refactor function rproc_del() and rproc_cdev_release() to take
> into account the policy specified in the device tree.
> 
> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> ---
>  drivers/remoteproc/remoteproc_cdev.c | 18 +++++++++++---
>  drivers/remoteproc/remoteproc_core.c | 36 ++++++++++++++++++++++++----
>  include/linux/remoteproc.h           |  4 ++++
>  3 files changed, 51 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/remoteproc/remoteproc_cdev.c b/drivers/remoteproc/remoteproc_cdev.c
> index f7645f289563..9b2fb6fbf8e7 100644
> --- a/drivers/remoteproc/remoteproc_cdev.c
> +++ b/drivers/remoteproc/remoteproc_cdev.c
> @@ -87,11 +87,23 @@ static long rproc_device_ioctl(struct file *filp, unsigned int ioctl, unsigned l
>  static int rproc_cdev_release(struct inode *inode, struct file *filp)
>  {
>  	struct rproc *rproc = container_of(inode->i_cdev, struct rproc, cdev);
> +	int ret;
>  
> -	if (rproc->cdev_put_on_release && rproc->state == RPROC_RUNNING)
> -		rproc_shutdown(rproc);
> +	if (!rproc->cdev_put_on_release)
> +		return 0;
>  
> -	return 0;
> +	/*
> +	 * The application has crashed or is releasing its file handle.  Detach
> +	 * or shutdown the remote processor based on the policy specified in the
> +	 * DT.  No need to check rproc->state right away, it will be done
> +	 * in either rproc_detach() or rproc_shutdown().
> +	 */
> +	if (rproc->autonomous_on_core_shutdown)
> +		ret = rproc_detach(rproc);
> +	else
> +		ret = rproc_shutdown(rproc);
> +
> +	return ret;
>  }
>  
>  static const struct file_operations rproc_fops = {
> diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
> index 2fe42ac7ca89..9f47a4ec0ec6 100644
> --- a/drivers/remoteproc/remoteproc_core.c
> +++ b/drivers/remoteproc/remoteproc_core.c
> @@ -2254,6 +2254,22 @@ static int rproc_alloc_ops(struct rproc *rproc, const struct rproc_ops *ops)
>  	return 0;
>  }
>  
> +static void rproc_set_automation_flags(struct rproc *rproc)
> +{
> +	struct device *dev = rproc->dev.parent;
> +	struct device_node *np = dev->of_node;
> +	bool core_shutdown;
> +
> +	/*
> +	 * When function rproc_cdev_release() or rproc_del() are called and
> +	 * the remote processor has been attached to, it will be detached from
> +	 * (rather than turned off) if "autonomous-on-core-shutdown is specified
> +	 * in the DT.
> +	 */
> +	core_shutdown = of_property_read_bool(np, "autonomous-on-core-shutdown");
> +	rproc->autonomous_on_core_shutdown = core_shutdown;
> +}
> +
>  /**
>   * rproc_alloc() - allocate a remote processor handle
>   * @dev: the underlying device
> @@ -2312,6 +2328,8 @@ struct rproc *rproc_alloc(struct device *dev, const char *name,
>  	if (rproc_alloc_ops(rproc, ops))
>  		goto put_device;
>  
> +	rproc_set_automation_flags(rproc);
> +
>  	/* Assign a unique device index and name */
>  	rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL);
>  	if (rproc->index < 0) {
> @@ -2388,15 +2406,25 @@ EXPORT_SYMBOL(rproc_put);
>   * of the outstanding reference created by rproc_alloc. To decrement that
>   * one last refcount, one still needs to call rproc_free().
>   *
> - * Returns 0 on success and -EINVAL if @rproc isn't valid.
> + * Returns 0 on success and a negative error code on failure.
>   */
>  int rproc_del(struct rproc *rproc)
>  {
> +	int ret;
> +
>  	if (!rproc)
>  		return -EINVAL;
>  
> -	/* TODO: make sure this works with rproc->power > 1 */
> -	rproc_shutdown(rproc);
> +	/*
> +	 * TODO: make sure this works with rproc->power > 1
> +	 *
> +	 * No need to check rproc->state right away, it will be done in either
> +	 * rproc_detach() or rproc_shutdown().
> +	 */
> +	if (rproc->autonomous_on_core_shutdown)
> +		ret = rproc_detach(rproc);
> +	else
> +		ret = rproc_shutdown(rproc);
>  
>  	mutex_lock(&rproc->lock);
>  	rproc->state = RPROC_DELETED;
> @@ -2415,7 +2443,7 @@ int rproc_del(struct rproc *rproc)
>  
>  	device_del(&rproc->dev);
>  
> -	return 0;
> +	return ret;
>  }
>  EXPORT_SYMBOL(rproc_del);
>  
> diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
> index aa5bceb72015..012bebbd324b 100644
> --- a/include/linux/remoteproc.h
> +++ b/include/linux/remoteproc.h
> @@ -519,6 +519,9 @@ struct rproc_dump_segment {
>   * @nb_vdev: number of vdev currently handled by rproc
>   * @char_dev: character device of the rproc
>   * @cdev_put_on_release: flag to indicate if remoteproc should be shutdown on @char_dev release
> + * @autonomous_on_core_shutdown: true if the remote processor should be detached
> + *				 from (rather than turned off) when the remoteproc
> + *				 core goes away.
>   */
>  struct rproc {
>  	struct list_head node;
> @@ -557,6 +560,7 @@ struct rproc {
>  	u16 elf_machine;
>  	struct cdev cdev;
>  	bool cdev_put_on_release;
> +	bool autonomous_on_core_shutdown;
>  };
>  
>  /**
> 

  reply	other threads:[~2021-01-27  8:59 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-18 17:32 [PATCH v4 00/17] remoteproc: Add support for detaching a rproc Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 01/17] dt-bindings: remoteproc: Add bindind to support autonomous processors Mathieu Poirier
2021-01-20 15:53   ` Rob Herring
2020-12-18 17:32 ` [PATCH v4 02/17] remoteproc: Re-check state in rproc_shutdown() Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 03/17] remoteproc: Remove useless check in rproc_del() Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 04/17] remoteproc: Rename function rproc_actuate() Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 05/17] remoteproc: Add new get_loaded_rsc_table() remoteproc operation Mathieu Poirier
2021-01-27  8:44   ` Arnaud POULIQUEN
2021-01-29 21:37     ` Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 06/17] remoteproc: stm32: Move resource table setup to rproc_ops Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 07/17] remoteproc: Add new RPROC_ATTACHED state Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 08/17] remoteproc: Properly represent the attached state Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 09/17] remoteproc: Properly deal with a kernel panic when attached Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 10/17] remoteproc: Add new detach() remoteproc operation Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 11/17] remoteproc: Introduce function __rproc_detach() Mathieu Poirier
2021-01-27  8:46   ` Arnaud POULIQUEN
2021-01-29 22:17     ` Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 12/17] remoteproc: Introduce function rproc_detach() Mathieu Poirier
2021-01-27  8:50   ` Arnaud POULIQUEN
2021-01-29 22:31     ` Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 13/17] remoteproc: Add return value to function rproc_shutdown() Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 14/17] remoteproc: Properly deal with a stop request when attached Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 15/17] remoteproc: Properly deal with a start " Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 16/17] remoteproc: Properly deal with detach request Mathieu Poirier
2020-12-18 17:32 ` [PATCH v4 17/17] remoteproc: Refactor rproc delete and cdev release path Mathieu Poirier
2021-01-27  8:56   ` Arnaud POULIQUEN [this message]
2021-01-27  9:21 ` [PATCH v4 00/17] remoteproc: Add support for detaching a rproc Arnaud POULIQUEN
2021-02-02  0:49   ` Mathieu Poirier
2021-02-02  8:54     ` Arnaud POULIQUEN
2021-02-02 22:42       ` Mathieu Poirier
2021-02-03  7:58         ` Arnaud POULIQUEN
2021-02-08 23:43           ` Mathieu Poirier

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=1c8a1395-8621-31ab-3ded-768bc83e6f9f@st.com \
    --to=arnaud.pouliquen@st.com \
    --cc=bjorn.andersson@linaro.org \
    --cc=devicetree@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=mathieu.poirier@linaro.org \
    --cc=ohad@wizery.com \
    --cc=robh+dt@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.