Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp663109rwr; Wed, 3 May 2023 04:36:39 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ65q5IoOKqE8+2N3UdF5vCh2n9MmugiMJ7rtE1u9oyGzf79aNjC++ZYQ1ocW+XzCgY6tD1R X-Received: by 2002:a05:6a20:7d91:b0:f2:eb8b:779e with SMTP id v17-20020a056a207d9100b000f2eb8b779emr26376805pzj.41.1683113798877; Wed, 03 May 2023 04:36:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683113798; cv=none; d=google.com; s=arc-20160816; b=nuQQ7sYPn+65cExqlzn0PH7llMbuMuZTTsREOTG9M55V3XZAMvPlRpCflP33O9mu+J GyLVt1OFVmfVXgYhYOyXk3Z6ZK9q/gwBAIhG0a1GAxfI2voOurkwB7VU9tH079UADSAv QwPnDiWKsqX/Wh84+E/BH2MYyZ0M+4kn0JRGm0Hu8wJlD/eem+7y16srMolUbEwSY8Tl BUcwCyJMGDVLwJWACheiJL2GGJkBPwXzFEQt3Y8w5B1cARUyyBPhiT5/Te8gwABM+HVo S3UjRc7EjXHdaDsY4Mnys5n1/B5N/Pdhmg1HENJ/6/judk4w1p/ovkzOB6hp5CJWXPOe IzDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=RnmmewGb1Pl8NWJfFyEtpf5HldKRQSR7S3tnug/G4x4=; b=NcFp6T36+dtuvxVIJ2zaOPxqrAslUcskqrDzcImuWy4R92fEfksSLb5CmqICjqLFrc fdvZEYNl3aRD2G3wPRDFm6UdEZiQWNMCCwfLuP3h01HJBUS6qy0sO0gzs+5qyw7YO3wK nCLdub6KpZ7+2ER7gq6FfwXtauln8UF7GwYF2sGaZw9FhcYCyVombQTETLcbPZobiVNu dpbkkxZ4OBxdlx2hLk/WIC8HkybWqkTTFtX00i/wLGC00o3Q4mrNqv58LvgV8xLA1TUA TDAGFQhlsKzaKcACpBkUj7NXS6B+ZX9fbXW7NYFrlWzILfJQhq33k8Nncas+Qxsu9U9z nZqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=c0a35vD6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w20-20020a63fb54000000b0052c4c02c5adsi3018587pgj.756.2023.05.03.04.36.23; Wed, 03 May 2023 04:36:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=c0a35vD6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230087AbjECL1G (ORCPT + 99 others); Wed, 3 May 2023 07:27:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43210 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229717AbjECL1F (ORCPT ); Wed, 3 May 2023 07:27:05 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EBB474EEE; Wed, 3 May 2023 04:26:56 -0700 (PDT) Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 343Axp19015333; Wed, 3 May 2023 11:26:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : to : cc : references : from : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=RnmmewGb1Pl8NWJfFyEtpf5HldKRQSR7S3tnug/G4x4=; b=c0a35vD6KvICCtmtiGdQcdmT75znX2j+8/P8tu7PYtTm9qMYZmwS41TxXohtQF4b6fgn Hl/T1dDBqjEOMYP9GHvA2fMwyVoORP4OCMSZkZmT0VDz5lf5aoTOtz4ZCDaYtM2+OqYb Yet+QJuht7EREJstyBYVMwn3uf5iC1sJFZeehb8XPlTdr8ooyP5Lfe0ezep/EJJi0J8F 00rYVyYQo9S/v9Y2X14DoBSQ7Mn1zneysRJFV129NMtad8sXvcUg821VUzyk+druCsBQ 7I9DYdjHBi93iSbeQgxH32p8X7GBMfFaxrKQNIAX0sWLTDcup2N5/dtqQa5OBhXtRPhn LA== Received: from nasanppmta03.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3qawak3hun-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 03 May 2023 11:26:53 +0000 Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA03.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 343BQq8T026598 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 3 May 2023 11:26:52 GMT Received: from [10.214.66.81] (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.42; Wed, 3 May 2023 04:26:48 -0700 Message-ID: Date: Wed, 3 May 2023 16:56:45 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 Subject: Re: [PATCH] remoteproc: qcom: Add NOTIFY_FATAL event type to SSR subdevice Content-Language: en-US To: Vignesh Viswanathan , , , , , , , CC: , , , , References: <20230503062146.3891-1-quic_viswanat@quicinc.com> From: Mukesh Ojha In-Reply-To: <20230503062146.3891-1-quic_viswanat@quicinc.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: GHvq7MsptYOqU_18ojE5RoGyMhR1U6BB X-Proofpoint-ORIG-GUID: GHvq7MsptYOqU_18ojE5RoGyMhR1U6BB X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-05-03_07,2023-05-03_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 bulkscore=0 suspectscore=0 lowpriorityscore=0 clxscore=1015 malwarescore=0 priorityscore=1501 impostorscore=0 mlxlogscore=999 phishscore=0 spamscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303200000 definitions=main-2305030096 X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A,RCVD_IN_DNSWL_LOW, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 5/3/2023 11:51 AM, Vignesh Viswanathan wrote: > 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. > > 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. This was one of valid use case we encounter in android, We have some other way of doing the same thing without core kernel change with something called early notifiers. https://git.codelinaro.org/clo/la/kernel/msm-5.15/-/commit/7583d24de337aa1bf7c375a7da706af9b995b9a1#a840754ebb0e24e88adbf48177e1abd0830b72d2 https://git.codelinaro.org/clo/la/kernel/msm-5.15/-/commit/257de41c63a5a51a081cc7887cdaa4a46e4d1744 But good to address this if possible. -Mukesh > > Signed-off-by: Vignesh Viswanathan > --- > 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(+) > > diff --git a/drivers/remoteproc/qcom_common.c b/drivers/remoteproc/qcom_common.c > index a0d4238492e9..76542229aeb6 100644 > --- a/drivers/remoteproc/qcom_common.c > +++ b/drivers/remoteproc/qcom_common.c > @@ -84,6 +84,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; > }; > > @@ -366,6 +367,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); > @@ -417,6 +419,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 > + * @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); > @@ -467,6 +514,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 > @@ -493,6 +552,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 695cce218e8c..3de0ece158ea 100644 > --- a/drivers/remoteproc/remoteproc_core.c > +++ b/drivers/remoteproc/remoteproc_core.c > @@ -1139,6 +1139,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 > @@ -2687,6 +2697,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 fe8978eb69f1..f3c0e0103e81 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; > +} > + > +static inline int qcom_unregister_ssr_atomic_notifier(void *notify, > + struct notifier_block *nb) > +{ > + return 0; > +} > #endif > > #endif