mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Vignesh Viswanathan <vignesh.viswanathan@oss.qualcomm.com>
To: Jeff Johnson <jeff.johnson@oss.qualcomm.com>,
	Gokul Sriram Palanisamy <quic_gokulsri@quicinc.com>,
	andersson@kernel.org, linux-arm-msm@vger.kernel.org,
	linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: quic_varada@quicinc.com, quic_srichara@quicinc.com,
	quic_viswanat@quicinc.com, quic_mojha@quicinc.com
Subject: Re: [PATCH V2 1/1] remoteproc: qcom: Add NOTIFY_FATAL event type to SSR subdevice
Date: Fri, 5 Jun 2026 09:50:23 +0530	[thread overview]
Message-ID: <b83f7fa5-346d-4795-bbe0-bc17772321fa@oss.qualcomm.com> (raw)
In-Reply-To: <8612d109-dc49-403d-9499-9c0319930cca@oss.qualcomm.com>



On 6/5/2026 2:42 AM, Jeff Johnson wrote:
> On 8/19/2024 11:09 PM, Gokul Sriram Palanisamy wrote:
>> From: Vignesh Viswanathan <quic_viswanat@quicinc.com>
>>
>> Currently the SSR subdevice notifies the client driver on crash of the
>> rproc from the recovery workqueue using the BEFORE_SHUTDOWN event.
>> However, the client driver might be interested to know that the device
>> has crashed immediately to pause any further transactions with the
>> rproc. This calls for an event to be sent to the driver in the IRQ
>> context as soon as the rproc crashes.
>>
>> Add NOTIFY_FATAL event to SSR subdevice to atomically notify rproc has
>> crashed to the client driver. The client driver in this scenario is a
>> ath Wi-Fi driver which is continuously queuing data to the remoteproc and
>> needs to know if remoteproc crashes as soon as possible to stop queuing
>> further data and also dump some debug statistics on the driver side that
>> could potentially help in debug of why the remoteproc crashed.
>>
>> Validated the event in IPQ9574 and IPQ5332 by forcing the rproc to crash
>> and ensuring the registered notifier function receives the notification
>> in IRQ context.
>>
>> The client driver in this scenario is a Wi-Fi driver which is continuously
>> queuing data to the remoteproc and needs to know if remoteproc crashes
>> as soon as possible to stop queuing further data and also dump some 
>> debug statistics on the driver side that could potentially help in
>> debug of why the remoteproc crashed.
>>
>> Signed-off-by: Vignesh Viswanathan <quic_viswanat@quicinc.com>
>> Acked-by: Mukesh Ojha <quic_mojha@quicinc.com>
>> Signed-off-by: Gokul Sriram Palanisamy <quic_gokulsri@quicinc.com>
>> ---
>> changes since v1:
>> 	- No changes. Rebased on top of linux-next.
>> 	- We will now have a user for this notifier, ath12k.
>>
>>  drivers/remoteproc/qcom_common.c      | 60 +++++++++++++++++++++++++++
>>  drivers/remoteproc/remoteproc_core.c  | 12 ++++++
>>  include/linux/remoteproc.h            |  3 ++
>>  include/linux/remoteproc/qcom_rproc.h | 17 ++++++++
>>  4 files changed, 92 insertions(+)
> 
> Core review comments below assisted by Claude:claude-sonnet-4-6
>>
>> diff --git a/drivers/remoteproc/qcom_common.c b/drivers/remoteproc/qcom_common.c
>> index 8c8688f99f0a..6efee422cc23 100644
>> --- a/drivers/remoteproc/qcom_common.c
>> +++ b/drivers/remoteproc/qcom_common.c
>> @@ -86,6 +86,7 @@ struct minidump_global_toc {
>>  struct qcom_ssr_subsystem {
>>  	const char *name;
>>  	struct srcu_notifier_head notifier_list;
>> +	struct atomic_notifier_head atomic_notifier_list;
>>  	struct list_head list;
>>  };
>>  
>> @@ -377,6 +378,7 @@ static struct qcom_ssr_subsystem *qcom_ssr_get_subsys(const char *name)
>>  	}
>>  	info->name = kstrdup_const(name, GFP_KERNEL);
>>  	srcu_init_notifier_head(&info->notifier_list);
>> +	ATOMIC_INIT_NOTIFIER_HEAD(&info->atomic_notifier_list);
>>  
>>  	/* Add to global notification list */
>>  	list_add_tail(&info->list, &qcom_ssr_subsystem_list);
>> @@ -428,6 +430,51 @@ int qcom_unregister_ssr_notifier(void *notify, struct notifier_block *nb)
>>  }
>>  EXPORT_SYMBOL_GPL(qcom_unregister_ssr_notifier);
>>  
>> +/**
>> + * qcom_register_ssr_atomic_notifier() - register SSR Atomic notification
>> + *					 handler
>> + * @name:	Subsystem's SSR name
>> + * @nb:	notifier_block to be invoked upon subsystem's state change
>> + *
>> + * This registers the @nb notifier block as part the atomic notifier
>> + * chain for a remoteproc associated with @name. The notifier block's callback
>> + * will be invoked when the remote processor crashes in atomic context before
>> + * the recovery process is queued.
>> + *
>> + * Return: a subsystem cookie on success, ERR_PTR on failure.
>> + */
>> +void *qcom_register_ssr_atomic_notifier(const char *name,
>> +					struct notifier_block *nb)
>> +{
>> +	struct qcom_ssr_subsystem *info;
>> +
>> +	info = qcom_ssr_get_subsys(name);
>> +	if (IS_ERR(info))
>> +		return info;
>> +
>> +	atomic_notifier_chain_register(&info->atomic_notifier_list, nb);
>> +
>> +	return &info->atomic_notifier_list;
>> +}
>> +EXPORT_SYMBOL_GPL(qcom_register_ssr_atomic_notifier);
>> +
>> +/**
>> + * qcom_unregister_ssr_atomic_notifier() - unregister SSR Atomic notification
>> + *					   handler
>> + * @notify:	subsystem cookie returned from qcom_register_ssr_notifier
> 
> @notify kdoc parameter references wrong function name
> 
> Should be qcom_register_ssr_atomic_notifier. The two notifier chains are
> independent; notify from qcom_register_ssr_notifier points to
> &info->notifier_list (SRCU), while notify from
> qcom_register_ssr_atomic_notifier points to &info->atomic_notifier_list.
> Passing the wrong cookie to atomic_notifier_chain_unregister would corrupt the
> wrong list. The doc misleads callers about which cookie to pass.

Ack.

> 
>> + * @nb:		notifier_block to unregister
>> + *
>> + * This function will unregister the notifier from the atomic notifier
>> + * chain.
>> + *
>> + * Return: 0 on success, %ENOENT otherwise.
>> + */
>> +int qcom_unregister_ssr_atomic_notifier(void *notify, struct notifier_block *nb)
>> +{
>> +	return atomic_notifier_chain_unregister(notify, nb);
>> +}
>> +EXPORT_SYMBOL_GPL(qcom_unregister_ssr_atomic_notifier);
>> +
>>  static int ssr_notify_prepare(struct rproc_subdev *subdev)
>>  {
>>  	struct qcom_rproc_ssr *ssr = to_ssr_subdev(subdev);
>> @@ -478,6 +525,18 @@ static void ssr_notify_unprepare(struct rproc_subdev *subdev)
>>  				 QCOM_SSR_AFTER_SHUTDOWN, &data);
>>  }
>>  
>> +static void ssr_notify_crash(struct rproc_subdev *subdev)
>> +{
>> +	struct qcom_rproc_ssr *ssr = to_ssr_subdev(subdev);
>> +	struct qcom_ssr_notify_data data = {
>> +		.name = ssr->info->name,
>> +		.crashed = true,
>> +	};
>> +
>> +	atomic_notifier_call_chain(&ssr->info->atomic_notifier_list,
>> +				   QCOM_SSR_NOTIFY_CRASH, &data);
>> +}
>> +
>>  /**
>>   * qcom_add_ssr_subdev() - register subdevice as restart notification source
>>   * @rproc:	rproc handle
>> @@ -504,6 +563,7 @@ void qcom_add_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr,
>>  	ssr->subdev.start = ssr_notify_start;
>>  	ssr->subdev.stop = ssr_notify_stop;
>>  	ssr->subdev.unprepare = ssr_notify_unprepare;
>> +	ssr->subdev.notify_crash = ssr_notify_crash;
>>  
>>  	rproc_add_subdev(rproc, &ssr->subdev);
>>  }
>> diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
>> index f276956f2c5c..1828831e0e77 100644
>> --- a/drivers/remoteproc/remoteproc_core.c
>> +++ b/drivers/remoteproc/remoteproc_core.c
>> @@ -1140,6 +1140,16 @@ static void rproc_unprepare_subdevices(struct rproc *rproc)
>>  	}
>>  }
>>  
>> +static void rproc_notify_crash_subdevices(struct rproc *rproc)
>> +{
>> +	struct rproc_subdev *subdev;
>> +
>> +	list_for_each_entry_reverse(subdev, &rproc->subdevs, node) {
>> +		if (subdev->notify_crash)
>> +			subdev->notify_crash(subdev);
>> +	}
>> +}
>> +
>>  /**
>>   * rproc_alloc_registered_carveouts() - allocate all carveouts registered
>>   * in the list
>> @@ -2712,6 +2722,8 @@ void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type)
>>  	dev_err(&rproc->dev, "crash detected in %s: type %s\n",
>>  		rproc->name, rproc_crash_to_string(type));
>>  
>> +	rproc_notify_crash_subdevices(rproc);
>> +
>>  	queue_work(rproc_recovery_wq, &rproc->crash_handler);
>>  }
>>  EXPORT_SYMBOL(rproc_report_crash);
>> diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
>> index b4795698d8c2..5101a7ec01bb 100644
>> --- a/include/linux/remoteproc.h
>> +++ b/include/linux/remoteproc.h
>> @@ -596,6 +596,8 @@ struct rproc {
>>   * @stop: stop function, called before the rproc is stopped; the @crashed
>>   *	    parameter indicates if this originates from a recovery
>>   * @unprepare: unprepare function, called after the rproc has been stopped
>> + * @notify_crash: notify_crash function, called in atomic context to notify
>> + *		  rproc has crashed and recovery is about to start
>>   */
>>  struct rproc_subdev {
>>  	struct list_head node;
>> @@ -604,6 +606,7 @@ struct rproc_subdev {
>>  	int (*start)(struct rproc_subdev *subdev);
>>  	void (*stop)(struct rproc_subdev *subdev, bool crashed);
>>  	void (*unprepare)(struct rproc_subdev *subdev);
>> +	void (*notify_crash)(struct rproc_subdev *subdev);
>>  };
>>  
>>  /* we currently support only two vrings per rvdev */
>> diff --git a/include/linux/remoteproc/qcom_rproc.h b/include/linux/remoteproc/qcom_rproc.h
>> index 82b211518136..f3d06900f297 100644
>> --- a/include/linux/remoteproc/qcom_rproc.h
>> +++ b/include/linux/remoteproc/qcom_rproc.h
>> @@ -11,12 +11,14 @@ struct notifier_block;
>>   * @QCOM_SSR_AFTER_POWERUP:	Remoteproc is running (start stage)
>>   * @QCOM_SSR_BEFORE_SHUTDOWN:	Remoteproc crashed or shutting down (stop stage)
>>   * @QCOM_SSR_AFTER_SHUTDOWN:	Remoteproc is down (unprepare stage)
>> + * @QCOM_SSR_NOTIFY_CRASH:	Remoteproc crashed
>>   */
>>  enum qcom_ssr_notify_type {
>>  	QCOM_SSR_BEFORE_POWERUP,
>>  	QCOM_SSR_AFTER_POWERUP,
>>  	QCOM_SSR_BEFORE_SHUTDOWN,
>>  	QCOM_SSR_AFTER_SHUTDOWN,
>> +	QCOM_SSR_NOTIFY_CRASH,
>>  };
>>  
>>  struct qcom_ssr_notify_data {
>> @@ -29,6 +31,10 @@ struct qcom_ssr_notify_data {
>>  void *qcom_register_ssr_notifier(const char *name, struct notifier_block *nb);
>>  int qcom_unregister_ssr_notifier(void *notify, struct notifier_block *nb);
>>  
>> +void *qcom_register_ssr_atomic_notifier(const char *name,
>> +					struct notifier_block *nb);
>> +int qcom_unregister_ssr_atomic_notifier(void *notify,
>> +					struct notifier_block *nb);
>>  #else
>>  
>>  static inline void *qcom_register_ssr_notifier(const char *name,
>> @@ -43,6 +49,17 @@ static inline int qcom_unregister_ssr_notifier(void *notify,
>>  	return 0;
>>  }
>>  
>> +static inline void *qcom_register_ssr_atomic_notifier(const char *name,
>> +						      struct notifier_block *nb)
>> +{
>> +	return 0;
> 
> qcom_register_ssr_atomic_notifier disabled stub returns integer 0 instead of NULL
> 
> The function return type is void *. Returning integer 0 rather than NULL will
> trigger a -Wint-conversion compiler warning in kernel builds (return makes
> pointer from integer without a cast). The immediately preceding sibling stub
> qcom_register_ssr_notifier correctly returns NULL.
> 
> Fix: return NULL;

Ack.

Thanks,
Vignesh
> 
> 
>> +}
>> +
>> +static inline int qcom_unregister_ssr_atomic_notifier(void *notify,
>> +						      struct notifier_block *nb)
>> +{
>> +	return 0;
>> +}
>>  #endif
>>  
>>  #endif
> 
> 


      reply	other threads:[~2026-06-05  4:20 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-20  6:09 Gokul Sriram Palanisamy
2024-08-28 21:05 ` Dmitry Baryshkov
2026-06-04 21:02 ` Jeff Johnson
2026-06-05  4:19   ` Vignesh Viswanathan
2026-06-04 21:12 ` Jeff Johnson
2026-06-05  4:20   ` Vignesh Viswanathan [this message]

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=b83f7fa5-346d-4795-bbe0-bc17772321fa@oss.qualcomm.com \
    --to=vignesh.viswanathan@oss.qualcomm.com \
    --cc=andersson@kernel.org \
    --cc=jeff.johnson@oss.qualcomm.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=quic_gokulsri@quicinc.com \
    --cc=quic_mojha@quicinc.com \
    --cc=quic_srichara@quicinc.com \
    --cc=quic_varada@quicinc.com \
    --cc=quic_viswanat@quicinc.com \
    /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

all inboxes | Powered by JetHome®