From nobody Mon Feb 9 08:29:21 2026 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 1D0462D8768 for ; Mon, 5 Jan 2026 14:16:16 +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=1767622579; cv=none; b=XG46YB1nciCdIC9sOcTJqqAWjB3NoRkdZrbTHNdh/8HpLb9TjT/X30moT/b0j9o1N/p37caT/31+zPpGDfZdc7V06+8uRqUt+YldEAQsJAgxBJSrkCugpxm8wi5gmK7+uzdKugwWN9oDU9JOHZtvQJ35QOu7atJPWPmsAh6eO6A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767622579; c=relaxed/simple; bh=vS4dCZ0ew+RZihU4p9KI9IBT58rXDG7WlJOEy1M4W/s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ws/b1UPCO46NKPQ2+1p2NQHMTy4+gIoKzDKjAhJMdLEP7paI7F4qVjgDMZ0fZjzIizldtqgmODczdxJsMarC3nMsrGNqPDYv7x6P0kSOGbErH/30lLpVy8WggmM4OgvHYaHDvMZnZ8xf7913Sh8QPxL5kJ/FPbApc1S3SMtz2Yo= 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=DsBhEmGh; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=FkPx7d8J; 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="DsBhEmGh"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="FkPx7d8J" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6058wZN5594393 for ; Mon, 5 Jan 2026 14:16:16 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= 5QBvbBiocVB0zbkZIIoPv5mnjV/W5Y0yDBBG+/WOWAs=; b=DsBhEmGhQV+pc/7M pOsoXLPqOymqTo4WIZ7VWIsDX5InaoskLAAWiLrBnSmHnGU794aXmEJpoiAr7qG5 OnoS8Wc2DsxEFe0bUyp3GbmTau2TJrVaVCS688UsIpBXljXfePIXKlNz1Ht4ApN7 YUyfjh9SVliw14TgZ8fiYE6TQFHxNQnUQBWXFAFRx50742+mzPCqdezIE4ns8uf7 Gzm52kDEGogzqANuOfUgj/k8zGOeD8q9m1fyZDJhcpuvH9GdZN6bCLItWs5TJX9J b0QyLE7KP31sQljlxeCApgsZcxMsgIG5n1CRJzf6Au8w7Bxc3aCI+MjFWIBp9zwY LTTdOg== Received: from mail-vk1-f200.google.com (mail-vk1-f200.google.com [209.85.221.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bga8pgt8h-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 05 Jan 2026 14:16:16 +0000 (GMT) Received: by mail-vk1-f200.google.com with SMTP id 71dfb90a1353d-5597ace71e0so33857539e0c.1 for ; Mon, 05 Jan 2026 06:16:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767622575; x=1768227375; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=5QBvbBiocVB0zbkZIIoPv5mnjV/W5Y0yDBBG+/WOWAs=; b=FkPx7d8J8aG7ZjA8z0pgDXy3Abq1XaSv1oo2qEYA2rIBu5vc5XdTLGMd/VFSRNxnC8 5IVKV3VCt9l9uJ18Z/gOmJ9tKhOK4HDUfYRdQG1sUZZdK8cOmGJZeyNGZ3xZsyJwfEzj mznOqiYck2CNB36fXAHJWhkdcUBZIgyjD9GCwl8yyf+xocXm4gtNSAkg+tvgVjB3q0ku jyNDSOvFo2riEHBTq5lzlxfAeeP2JZDpy7M6gia+H9t6sw/0s4r8ZZp7nPG0OcZNHMiI CVH9KEYU+YSkdkLjqNX3VFhkdSlpL2u3ecW2GDGZ+iUf9WaBT5gJqIOPfg6ei9u+MA89 g70Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767622575; x=1768227375; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=5QBvbBiocVB0zbkZIIoPv5mnjV/W5Y0yDBBG+/WOWAs=; b=XJElCK8YMR/FLrLoPl7+cR86/X2Gs/W+hkAp3pkNRcR3sOYtxivOZVITKOQ+mS5yNO F/RbumlZExs4kHENAOYn5nu08eyAX6ZJ6tK7RfOlMlYmzp/eqlTDusqYgdqqhnmMI8i4 BbzPQnNqSulBwQjdPGjP66pcrze1PcUiU6eyJN47bdaYKz0VGZaJIxobi/dV78e/jXUV f68sFxGOtAfSsjjwiaRKuD22JkZkb5yXfIKb77CAUOr6I0cGG09SddbfgeXWzidsLVsf n7vJXqTbSanP8UVhGLq22+TaPSPWgzrqhoc41B972yKCvqNKzrilTww5exj6tYWeS+hF itgQ== X-Gm-Message-State: AOJu0Yx+wc7ayRxxo7ZP2m0WMWdzjNj6kkIK2C4fjMiJFfyNV8V8g2IG 7O5N9Pqd/UCZNgcoeJ/7oMVyTHejnIEb85K3B7rOgImPIgI48zGrBCFveObJeTU5kPOaGpRPnNC ICncVvIg+vnL0YIRsvNcdas/xj+4NhifKAWK3YQ9MYXaCAkEVLAI4nzvy/hGrzDXtwtU= X-Gm-Gg: AY/fxX5P8otfyC+e6F4+tjV7N+xHXAlP8kEM8+GRLK8KpvQGEGZftng4v+k4kZxo50M AISYeReOCZMr0yH+VHvcu3/x81XIc2YssiPZ2zXj2w1Tl/dk9RYhwzTDYPcuiVxbLwP0fWqhOcp bN8CYOzssZJKlv6h7EFVacZVKHNbSa9K19JQZOQSLJ3ZpqeKozlGSIdA3XfOwDYZNGu8e+7nXY0 yBVmHqX1zbzQdxSp8iWIjPpX0wE3b42Itjks62Bb4TkcDP62JLcwcK97t527w9b7VXZfk3vwJw0 NlP+2E1V+dsyw9n1FR2BDah8uavM3pxmXAvNMwOnRFppbuTjS8Lst3Ye7YfanMnJyc0VFaasj/a jzgN9hEqnqsWzmU40b7x/HAp6Arxgi1yZ7SIv3X0= X-Received: by 2002:a05:6122:925:b0:55b:305b:51b4 with SMTP id 71dfb90a1353d-5615befdb8amr16226302e0c.17.1767622575138; Mon, 05 Jan 2026 06:16:15 -0800 (PST) X-Google-Smtp-Source: AGHT+IGHu9VlxOWk51Ztjr3ONU8KNlo7HCHvq3VHAVQ+H7q3VLfuM+Zt8pZ+qQLUpv+5Gf9j0g1toA== X-Received: by 2002:a05:6122:925:b0:55b:305b:51b4 with SMTP id 71dfb90a1353d-5615befdb8amr16226262e0c.17.1767622574500; Mon, 05 Jan 2026 06:16:14 -0800 (PST) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:dd3b:c635:dd06:9574]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4324ea1aef7sm100774703f8f.7.2026.01.05.06.16.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 06:16:14 -0800 (PST) From: Bartosz Golaszewski Date: Mon, 05 Jan 2026 15:15:30 +0100 Subject: [PATCH 11/15] reset: protect struct reset_control with its own mutex 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: <20260105-reset-core-refactor-v1-11-ac443103498d@oss.qualcomm.com> References: <20260105-reset-core-refactor-v1-0-ac443103498d@oss.qualcomm.com> In-Reply-To: <20260105-reset-core-refactor-v1-0-ac443103498d@oss.qualcomm.com> To: Krzysztof Kozlowski , Philipp Zabel Cc: linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5041; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=vS4dCZ0ew+RZihU4p9KI9IBT58rXDG7WlJOEy1M4W/s=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpW8eePPDowHGP/lslg3knZuwg+fVR0j7fKIvl1 pciba95fqqJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaVvHngAKCRAFnS7L/zaE w4vPD/9npgCFXizen9y4g+UZChlU9diWHNLEqxd0cohH/lq54sZ6+wX8m0X/2pbU0RXY0+8BMXh 3GlfT/7IYWtfqOWD2s90x5GYtsd9KP1uNuAfa2+As52/1z0c9nJYa7Qbg76xLkxccysxlI1xXnz N+sLkloJcle8pb/mhnInhrpICCU8Xnk8FdxcntQUO8vZXyKgZ/9MlV+5+GWnxLkWu4GSceIJYrS XKmkdqqVUGoOzXOpowSAq3YNncZhdMcNem4Sou83P87uz+K16a2Sjp+ICbinI0TovVhKXVZJiqS ubYMVI3U/oFnZOQvYH2HG+FXFuAS5LabKk0nMM/gpUCdJxWk1lB9Ku6qOFHFntwxpu8muuQSG0r mF5nZBu+UJMizb9ByesWQgPyqj1o/lxv225VgE2/6AK8gAJZwqEYJdhaqoz90zfTwQ4u/jGB/Dr tYP7DvFyqzoSAxhar+nbD2pRyLw9BY2j+FWqjNcpSaPZYGvJt60TXZIAhDx6M3S9HldIY+EiSuz zoyuZULHapCCqqSM+OGBLdGyZb/4tfEJEwUKXhElJqpR1qAGyyg3NkHs0yQvU7uO6jrua0w17Pd C1bR5lzJQVG0/b3GFWygB1o1wNwglfmB2iIglFrWm88aGS2olVb+5JXYPTChkUjdZ6VA6atl1tQ Nrk/FM7j6lF8yvA== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA1MDEyNSBTYWx0ZWRfXwAx8PDdfC1RP p/R0ogZ6UY1E1a0JO6uyn5Hb9pnybeHSlH97Fs+MzNh+oRjdD0/M4uBtkkHG0JNbBEd+8NiWc60 bZy4bDQ4n+zVGIwRrfw5K6V6gnZYoyoLOirA6zvBSlmV2XwywwmtzMVLUYmxJfese1vCKpARwXu K+w4FJSoqqxX7+dGW+FCHFmknKjTgxnzlFl6JJ4RmAseaPUM5WtQetlr/6HB5+AeBpqujYICz2T ndd6A1TRyaW7zyw/4Wx1CQQZb/QNojq8l33ydFLAe+bEFDVSj3GNMIwNPuOdVzclnxYYfS9S4uq AEpj+0mV4AvRzRh8IEgT+et0FdN59vP6MvGt2izVjCAWrEok8ZoVSicuPofQtmJJgyDXxwNC/tn IfXtngSRMEUMz+heB9abutUEVE6ovOM1S9oyBcyHGFzRPwrF7b3w2m89oOR+oApSvoNx3Vvlh5i TLpF7xapuDi1rqBiD8A== X-Authority-Analysis: v=2.4 cv=JfWxbEKV c=1 sm=1 tr=0 ts=695bc7b0 cx=c_pps a=wuOIiItHwq1biOnFUQQHKA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=dYSpPNroVltAtaK4QdUA:9 a=QEXdDO2ut3YA:10 a=XD7yVLdPMpWraOa8Un9W:22 X-Proofpoint-ORIG-GUID: LDiY5hpeev2yyLjQa86ehnc289Tota8v X-Proofpoint-GUID: LDiY5hpeev2yyLjQa86ehnc289Tota8v X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2026-01-05_01,2026-01-05_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 adultscore=0 suspectscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 lowpriorityscore=0 spamscore=0 impostorscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601050125 Currently we use a single, global mutex - misleadingly names reset_list_mutex - to protect the global list of reset devices, per-controller list of reset control handles and also internal fields of struct reset_control. Locking can be made a lot more fine-grained if we use a separate mutex for serializing operations on the list AND accessing the reset control handle. Signed-off-by: Bartosz Golaszewski --- drivers/reset/core.c | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/drivers/reset/core.c b/drivers/reset/core.c index a53d445fbbfc4601c062e7e5f17278417bd37836..d712cf4315477ada98ef81975fd= 9b535db477e9a 100644 --- a/drivers/reset/core.c +++ b/drivers/reset/core.c @@ -49,6 +49,7 @@ static DEFINE_IDA(reset_gpio_ida); * @triggered_count: Number of times this reset line has been reset. Curre= ntly * only used for shared resets, which means that the val= ue * will be either 0 or 1. + * @lock: Serializes access to other fields of this structure */ struct reset_control { struct reset_controller_dev __rcu *rcdev; @@ -61,6 +62,7 @@ struct reset_control { bool array; atomic_t deassert_count; atomic_t triggered_count; + struct mutex lock; }; =20 /** @@ -707,7 +709,7 @@ int reset_control_acquire(struct reset_control *rstc) if (reset_control_is_array(rstc)) return reset_control_array_acquire(rstc_to_array(rstc)); =20 - guard(mutex)(&reset_list_mutex); + guard(mutex)(&rstc->lock); =20 if (rstc->acquired) return 0; @@ -859,6 +861,7 @@ __reset_control_get_internal(struct reset_controller_de= v *rcdev, list_add(&rstc->list, &rcdev->reset_control_head); rstc->id =3D index; kref_init(&rstc->refcnt); + mutex_init(&rstc->lock); rstc->acquired =3D acquired; rstc->shared =3D shared; get_device(rcdev->dev); @@ -872,8 +875,6 @@ static void __reset_control_release(struct kref *kref) refcnt); struct reset_controller_dev *rcdev; =20 - lockdep_assert_held(&reset_list_mutex); - scoped_guard(srcu, &rstc->srcu) { rcdev =3D rcu_replace_pointer(rstc->rcdev, NULL, true); if (rcdev) { @@ -882,15 +883,14 @@ static void __reset_control_release(struct kref *kref) } } =20 + mutex_destroy(&rstc->lock); synchronize_srcu(&rstc->srcu); cleanup_srcu_struct(&rstc->srcu); kfree(rstc); } =20 -static void __reset_control_put_internal(struct reset_control *rstc) +static void reset_control_put_internal(struct reset_control *rstc) { - lockdep_assert_held(&reset_list_mutex); - if (IS_ERR_OR_NULL(rstc)) return; =20 @@ -1103,7 +1103,7 @@ __of_reset_control_get(struct device_node *node, cons= t char *id, int index, { bool optional =3D flags & RESET_CONTROL_FLAGS_BIT_OPTIONAL; bool gpio_fallback =3D false; - struct reset_control *rstc; + struct reset_control *rstc =3D ERR_PTR(-EINVAL); struct reset_controller_dev *rcdev; struct of_phandle_args args; int rstc_id; @@ -1168,8 +1168,8 @@ __of_reset_control_get(struct device_node *node, cons= t char *id, int index, =20 flags &=3D ~RESET_CONTROL_FLAGS_BIT_OPTIONAL; =20 - /* reset_list_mutex also protects the rcdev's reset_control list */ - rstc =3D __reset_control_get_internal(rcdev, rstc_id, flags); + scoped_guard(mutex, &rcdev->lock) + rstc =3D __reset_control_get_internal(rcdev, rstc_id, flags); =20 out_put: of_node_put(args.np); @@ -1212,10 +1212,8 @@ int __reset_control_bulk_get(struct device *dev, int= num_rstcs, return 0; =20 err: - guard(mutex)(&reset_list_mutex); - while (i--) - __reset_control_put_internal(rstcs[i].rstc); + reset_control_put_internal(rstcs[i].rstc); =20 return ret; } @@ -1225,10 +1223,8 @@ static void reset_control_array_put(struct reset_con= trol_array *resets) { int i; =20 - guard(mutex)(&reset_list_mutex); - for (i =3D 0; i < resets->num_rstcs; i++) - __reset_control_put_internal(resets->rstc[i]); + reset_control_put_internal(resets->rstc[i]); kfree(resets); } =20 @@ -1246,9 +1242,7 @@ void reset_control_put(struct reset_control *rstc) return; } =20 - guard(mutex)(&reset_list_mutex); - - __reset_control_put_internal(rstc); + reset_control_put_internal(rstc); } EXPORT_SYMBOL_GPL(reset_control_put); =20 @@ -1259,10 +1253,8 @@ EXPORT_SYMBOL_GPL(reset_control_put); */ void reset_control_bulk_put(int num_rstcs, struct reset_control_bulk_data = *rstcs) { - guard(mutex)(&reset_list_mutex); - while (num_rstcs--) - __reset_control_put_internal(rstcs[num_rstcs].rstc); + reset_control_put_internal(rstcs[num_rstcs].rstc); } EXPORT_SYMBOL_GPL(reset_control_bulk_put); =20 @@ -1481,10 +1473,8 @@ of_reset_control_array_get(struct device_node *np, e= num reset_control_flags flag return &resets->base; =20 err_rst: - guard(mutex)(&reset_list_mutex); - while (--i >=3D 0) - __reset_control_put_internal(resets->rstc[i]); + reset_control_put_internal(resets->rstc[i]); =20 kfree(resets); =20 --=20 2.47.3