From nobody Thu Oct 2 06:33:07 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0986B30DD1D for ; Mon, 22 Sep 2025 13:40:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758548443; cv=none; b=CN4/+XQaxueNQ/STRDDGNZEB58WurBOqbu0HntZpugSaoAbef9t7RX+N+kOgjKIXaNAef/sdn6zbEzICSEn4y0/fqAscyoqKpnbFCBBVDwQR4/hV1z8ah4+2dWlQfTZfMPBj1suFTRBoSDWbhhsOaf7z1I2w0nPlHfMdxeENWm0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758548443; c=relaxed/simple; bh=+LF5Rl/5f5znpMQv1GLZ4NG0dpObtQwZ7SckbxZ5OJg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DfaaDKZgGkJlXixFgLfK2To0jIn3uESFKuLjQvOR6L0wInusRhTGgslzqjG+G1DTGY2tp9c9Pjq/j74WUGzuTHcC9q1oGi8tt0Qp0mPA95V0dSyZ5ad9N7SlXz/CsNDrpmV+0YkKUiji9If4NbNZOhE7DAqSd9hUxNnPXYOCHlo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=NYGtS06H; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="NYGtS06H" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 58M9G3Zt022695 for ; Mon, 22 Sep 2025 13:40:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= wck1RFL3Etc5iANJFBisnl6A9QEEqYSWtMuEcnVHG7E=; b=NYGtS06HtujpjOy7 EaoMP5NEqsjM5+zsN1ce45OXw/3Z9TlNtgIumlgKxHX//KFHHzHW+xmQr28/ArdH 0Whc8vUWcy0pgIrlBvaqAsDmfJfyv7WciT6wvZeROXDrRCyEr8BpIzr7tm4PRsGy +7S9JnKlXrX68Y5kTbKezzUPPCoDQJh9cHAUTIrX+fdDAfZ8RRD379r8TVhkknKD aGpDMz1l9xnB6/sKJa6gFskwBkXQaKVAKbjBBasf+CizCXLByRl+tUcFAvfLX2pA TlYTDfdaY8+NFfq2nNxMzjosgWykffDR3DrQIPYRA8iembPFe4H1EkHlK7Pv7xvO n/T50A== Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 49b3ny8pvq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 22 Sep 2025 13:40:41 +0000 (GMT) Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-25bdf8126ceso88703465ad.3 for ; Mon, 22 Sep 2025 06:40:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758548440; x=1759153240; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wck1RFL3Etc5iANJFBisnl6A9QEEqYSWtMuEcnVHG7E=; b=lXQ7xlg24JqNA2gMpiKE08AuPrLDbkpepuTWmZT/5oG+N6FDy44L5HEXhp0zoXX2MY 0fIf/dR+k8wLsa/QRb0fAvOSxFv5cwPzmhUgIILjbu859AymsNXAFUqqoUGK+miMBaxT AnegB/SXPbAhLxXx8UbGsHsrwS1NEfZQAatvEkfrFxAfwY+X6spyIrJWvwYqdea5MnEB i+ae+1gocLGf/vWuRILQGss4YbI3DWoniK8sTiupk4uIraVpoKIcFUsWsYg1Al6NKQYs 3OMU+T14WDQOk97knBtG4lFyE2YY1BaLXolcZUxTV2BpFYR9ojlsAl+dOFQqRJ1hERNH oyzA== X-Forwarded-Encrypted: i=1; AJvYcCWRkU7TYR9vqWpfkYU994ntoyzMOxq5YfJGOLw0ldBxuU2MVjPpjnlUQlMRTRoHyJnVohV5rhsHtvKnB4c=@vger.kernel.org X-Gm-Message-State: AOJu0YxzgZpCRfiwoD5scuaxxOZVvOWwxLnNM3Q6nzptbf7CDbgYx06T ChVICYbydM/q/GpQXwIpIRlaxghIteiFl5YSO4FNH7MtOHUxNJcEVqpgbS7+f1i3ofPKqogearf llneu27BzS6gsajhgbKfgdYC1WP7YmXcULPwQDCyB4+hUBLH8teDmSaUcovwr5xP1D9c= X-Gm-Gg: ASbGnctceK1olZeS01JU4FitwtikveO6D3iaB48fqfU8N7K2MY+9ypUWgZ6f2e6seZo cxPMlJRLZLPU+66iZdJbn63ThoqvpFdEW+EEigmP/KMIVcccWfpAp5cizK92H/3cW1rFfVTvYIl 4Na5EW/KtkJY1E5q9zJyd9rEbeT7FWz0iLk4Yw+e6rfhBLjrytC/NeY/OignOJU5yCwjQmxMFZg PoJ8Z5frd2xRzRHZO00xNpAs4Qh1HFLkpD0kj0sHIXJd3zfW2Am7YGqRPcagddg7IRT7M36tqK0 CGbl5i7k88M/ZeYuQ+odPU01UGvZIICjY6F1MNx4BxYniNgIu3vDOnlZ3oQM47ApdAul8QUjW3c J X-Received: by 2002:a17:903:2342:b0:265:982a:d450 with SMTP id d9443c01a7336-269ba533c6cmr153441385ad.40.1758548440166; Mon, 22 Sep 2025 06:40:40 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHo2/a4BVdjp6tjYR2Y07Siikp43uvotxG3p+AwbYTvOOPwZqz5VaSP3wBnmdNsJoZXYNxiFg== X-Received: by 2002:a17:903:2342:b0:265:982a:d450 with SMTP id d9443c01a7336-269ba533c6cmr153440945ad.40.1758548439664; Mon, 22 Sep 2025 06:40:39 -0700 (PDT) Received: from hu-spratap-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2698016c13asm134246755ad.46.2025.09.22.06.40.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Sep 2025 06:40:39 -0700 (PDT) From: Shivendra Pratap Date: Mon, 22 Sep 2025 19:10:11 +0530 Subject: [PATCH v15 01/14] power: reset: reboot-mode: Synchronize list traversal Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250922-arm-psci-system_reset2-vendor-reboots-v15-1-7ce3a08878f1@oss.qualcomm.com> References: <20250922-arm-psci-system_reset2-vendor-reboots-v15-0-7ce3a08878f1@oss.qualcomm.com> In-Reply-To: <20250922-arm-psci-system_reset2-vendor-reboots-v15-0-7ce3a08878f1@oss.qualcomm.com> To: Bartosz Golaszewski , Bjorn Andersson , Sebastian Reichel , Rob Herring , Sudeep Holla , Souvik Chakravarty , Krzysztof Kozlowski , Conor Dooley , Andy Yan , Mark Rutland , Lorenzo Pieralisi , Arnd Bergmann , Konrad Dybcio , cros-qcom-dts-watchers@chromium.org, Vinod Koul , Catalin Marinas , Will Deacon , Florian Fainelli , Moritz Fischer , John Stultz , Matthias Brugger , Krzysztof Kozlowski Cc: Dmitry Baryshkov , Mukesh Ojha , Stephen Boyd , Andre Draszik , Kathiravan Thirumoorthy , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, Elliot Berman , Shivendra Pratap , Srinivas Kandagatla X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758548419; l=5404; i=shivendra.pratap@oss.qualcomm.com; s=20250710; h=from:subject:message-id; bh=+LF5Rl/5f5znpMQv1GLZ4NG0dpObtQwZ7SckbxZ5OJg=; b=yzvvk3xOQzGRIfbypo337GvXrt2u9sEAEj3aA6MIS0LHEOylzx77NGaQMiaatRSoiCZG1XFdY RBTwjziAxJgBmHAO5r5GKKjyxKj4zbZtbDfuYZM8V2wAKDMIVJwAOq8 X-Developer-Key: i=shivendra.pratap@oss.qualcomm.com; a=ed25519; pk=CpsuL7yZ8NReDPhGgq6Xn/SRoa59mAvzWOW0QZoo4gw= X-Authority-Analysis: v=2.4 cv=EuPSrTcA c=1 sm=1 tr=0 ts=68d151d9 cx=c_pps a=MTSHoo12Qbhz2p7MsH1ifg==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=EUspDBNiAAAA:8 a=gP18aZtcJwKeVuiPoooA:9 a=QEXdDO2ut3YA:10 a=GvdueXVYPmCkWapjIL-Q:22 X-Proofpoint-GUID: 1rCCp9HKJ17EtAt-cD6HZrlDFgclrHpo X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTIyMDA5MCBTYWx0ZWRfXxcOkaXTkCgN8 QYeBBDIhLqq4VIPGFE1Ze8Sw2mlP3/4RDKlKSum1lK5JSfrnCKeL0LLPKGyDKedGJ/+WPCXg7vQ wLX+UUR00X05VbeZEwlpOmirTBpe4Ac789xZA5KYsI3+EtO+OCFR8DP/D7avXGkSz+MComEaUxY fGoB+92joPjrNk7dK8sxnDkvvv4Hi1+ewnfYz7FnKQcUfhMC/3b+JBiJq74rqZ1PESi2sGH5cDy X45yWbF4aMzNn/zCJMtLt11Nx5GfHtXV2+NAozSuFmEoxdxdj5Is8jrTYRcLhzlaH4C+SqVwrEL NvRyM96B/0ArAL9hzw3pb4VFt2HNz1LnhK7ssaZNQWflJZJPda5nD7hgWR3TDsxgg+sjuxW0j19 U7uu/wEz X-Proofpoint-ORIG-GUID: 1rCCp9HKJ17EtAt-cD6HZrlDFgclrHpo X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-22_01,2025-09-22_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 malwarescore=0 spamscore=0 adultscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509220090 List traversals must be synchronized to prevent race conditions and data corruption. The reboot-mode list is not protected by a lock currently, which can lead to concurrent access and race. Introduce a mutex lock to guard all operations on the reboot-mode list and ensure thread-safe access. The change prevents unsafe concurrent access on reboot-mode list. Fixes: 4fcd504edbf7 ("power: reset: add reboot mode driver") Fixes: ca3d2ea52314 ("power: reset: reboot-mode: better compatibility with = DT (replace ' ,/')") Signed-off-by: Shivendra Pratap --- drivers/power/reset/reboot-mode.c | 96 +++++++++++++++++++++--------------= ---- include/linux/reboot-mode.h | 4 ++ 2 files changed, 57 insertions(+), 43 deletions(-) diff --git a/drivers/power/reset/reboot-mode.c b/drivers/power/reset/reboot= -mode.c index fba53f638da04655e756b5f8b7d2d666d1379535..8fc3e14638ea757c8dc3808c240= ff569cbd74786 100644 --- a/drivers/power/reset/reboot-mode.c +++ b/drivers/power/reset/reboot-mode.c @@ -29,9 +29,11 @@ static unsigned int get_reboot_mode_magic(struct reboot_= mode_driver *reboot, if (!cmd) cmd =3D normal; =20 - list_for_each_entry(info, &reboot->head, list) - if (!strcmp(info->mode, cmd)) - return info->magic; + scoped_guard(mutex, &reboot->rb_lock) { + list_for_each_entry(info, &reboot->head, list) + if (!strcmp(info->mode, cmd)) + return info->magic; + } =20 /* try to match again, replacing characters impossible in DT */ if (strscpy(cmd_, cmd, sizeof(cmd_)) =3D=3D -E2BIG) @@ -41,9 +43,11 @@ static unsigned int get_reboot_mode_magic(struct reboot_= mode_driver *reboot, strreplace(cmd_, ',', '-'); strreplace(cmd_, '/', '-'); =20 - list_for_each_entry(info, &reboot->head, list) - if (!strcmp(info->mode, cmd_)) - return info->magic; + scoped_guard(mutex, &reboot->rb_lock) { + list_for_each_entry(info, &reboot->head, list) + if (!strcmp(info->mode, cmd_)) + return info->magic; + } =20 return 0; } @@ -78,46 +82,50 @@ int reboot_mode_register(struct reboot_mode_driver *reb= oot) =20 INIT_LIST_HEAD(&reboot->head); =20 - for_each_property_of_node(np, prop) { - if (strncmp(prop->name, PREFIX, len)) - continue; - - info =3D devm_kzalloc(reboot->dev, sizeof(*info), GFP_KERNEL); - if (!info) { - ret =3D -ENOMEM; - goto error; - } - - if (of_property_read_u32(np, prop->name, &info->magic)) { - dev_err(reboot->dev, "reboot mode %s without magic number\n", - info->mode); - devm_kfree(reboot->dev, info); - continue; - } - - info->mode =3D kstrdup_const(prop->name + len, GFP_KERNEL); - if (!info->mode) { - ret =3D -ENOMEM; - goto error; - } else if (info->mode[0] =3D=3D '\0') { - kfree_const(info->mode); - ret =3D -EINVAL; - dev_err(reboot->dev, "invalid mode name(%s): too short!\n", - prop->name); - goto error; + mutex_init(&reboot->rb_lock); + + scoped_guard(mutex, &reboot->rb_lock) { + for_each_property_of_node(np, prop) { + if (strncmp(prop->name, PREFIX, len)) + continue; + + info =3D devm_kzalloc(reboot->dev, sizeof(*info), GFP_KERNEL); + if (!info) { + ret =3D -ENOMEM; + goto error; + } + + if (of_property_read_u32(np, prop->name, &info->magic)) { + dev_err(reboot->dev, "reboot mode %s without magic number\n", + info->mode); + devm_kfree(reboot->dev, info); + continue; + } + + info->mode =3D kstrdup_const(prop->name + len, GFP_KERNEL); + if (!info->mode) { + ret =3D -ENOMEM; + goto error; + } else if (info->mode[0] =3D=3D '\0') { + kfree_const(info->mode); + ret =3D -EINVAL; + dev_err(reboot->dev, "invalid mode name(%s): too short!\n", + prop->name); + goto error; + } + + list_add_tail(&info->list, &reboot->head); } =20 - list_add_tail(&info->list, &reboot->head); - } - - reboot->reboot_notifier.notifier_call =3D reboot_mode_notify; - register_reboot_notifier(&reboot->reboot_notifier); + reboot->reboot_notifier.notifier_call =3D reboot_mode_notify; + register_reboot_notifier(&reboot->reboot_notifier); =20 - return 0; + return 0; =20 error: - list_for_each_entry(info, &reboot->head, list) - kfree_const(info->mode); + list_for_each_entry(info, &reboot->head, list) + kfree_const(info->mode); + } =20 return ret; } @@ -133,8 +141,10 @@ int reboot_mode_unregister(struct reboot_mode_driver *= reboot) =20 unregister_reboot_notifier(&reboot->reboot_notifier); =20 - list_for_each_entry(info, &reboot->head, list) - kfree_const(info->mode); + scoped_guard(mutex, &reboot->rb_lock) { + list_for_each_entry(info, &reboot->head, list) + kfree_const(info->mode); + } =20 return 0; } diff --git a/include/linux/reboot-mode.h b/include/linux/reboot-mode.h index 4a2abb38d1d612ec0fdf05eb18c98b210f631b7f..b73f80708197677db8dc2e43aff= c519782b7146e 100644 --- a/include/linux/reboot-mode.h +++ b/include/linux/reboot-mode.h @@ -2,11 +2,15 @@ #ifndef __REBOOT_MODE_H__ #define __REBOOT_MODE_H__ =20 +#include + struct reboot_mode_driver { struct device *dev; struct list_head head; int (*write)(struct reboot_mode_driver *reboot, unsigned int magic); struct notifier_block reboot_notifier; + /*Protects access to reboot mode list*/ + struct mutex rb_lock; }; =20 int reboot_mode_register(struct reboot_mode_driver *reboot); --=20 2.34.1