From nobody Mon Feb 9 09:33:03 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 60790368264 for ; Fri, 16 Jan 2026 11:01:34 +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=1768561296; cv=none; b=WE4bN3MiWaH0hljQnYYsF8ABwzKguIc8LuG8uYwpLy9A8Xrzv4HdoOozs05ZH9z2/QVJMTis0te8WGURTLjo/OEXCuJ65veeXVzDjrNMrFjeIHB7S8tu5Sjx6JYBTS52BVUz/TVUGmdggIHvI8TDVKuZxqwqlogRRMuXF5n2rMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768561296; c=relaxed/simple; bh=g+yD8o+2gVQjUiYEpHiBQF7ASL0OkhzgVD7q84WldJQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nL0Gfzqa2MosNfBNt+daYUUXLqCyUd1HidmYBAn0QXNonAmtQcBVggOE56LUyBNkKzCEy/SCOhM9WYe2L50AxwwpmfRqZB1i1c3Y++W9/f7pol8GROF9+klZntELqJw4wUYbWdqOe5gF/Fb1GC6VVGX6UnSUAiphkoT/HrHwsB8= 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=InD9MQ6B; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=GYCJ8maF; 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="InD9MQ6B"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="GYCJ8maF" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 60G8pA9E3596382 for ; Fri, 16 Jan 2026 11:01:33 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= ovduUETZ2fgJqjXFUzboacKNYuA1eanpnCkGfbo7VWE=; b=InD9MQ6BQI46HtMk SsAHBYRmn46PHaAX29rotkgJOBDCoqr4mCTVrzPVuRwAhxS/qjKaCbAXVjm+mAlC 3dnMlMdSzUzX8HjjPwaaw15MKZlWBtPg77xOsGik/3VXoOjAS9dMoh11OqOb6TyZ 6u1PG0hYIdvG6nnqW928H98AMJXBBYCYapm7T+/E7qC9A1zZEGYMXZSDAYlmioS8 uQpZ0oMWMMN04+7uCihSHLr+ppc0m2WZrDexmyay7xw2kTKjiGRPugHnkC9iAhiG Lg/DRx+uGwi84EA4C1EzPtf13NHDodhZq2jF6BhPfamxYXOvWz7RCVTwzmixr9JM tSwmtQ== Received: from mail-vs1-f71.google.com (mail-vs1-f71.google.com [209.85.217.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bq96rsvyg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 16 Jan 2026 11:01:33 +0000 (GMT) Received: by mail-vs1-f71.google.com with SMTP id ada2fe7eead31-5ed0924e15fso1447441137.0 for ; Fri, 16 Jan 2026 03:01:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1768561292; x=1769166092; 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=ovduUETZ2fgJqjXFUzboacKNYuA1eanpnCkGfbo7VWE=; b=GYCJ8maFXUcQuzIwW32l/rN6i9tLWLxwe1m/41mDRaUTj2fPdvCx8fMreGUs2e9/q2 /ZGoSaARoDjNQueeWoso3YyZhU4DPiHVHegUxUL4gluyp8n93PTD+sCNYuFGaKz9OBsa S5vb8Ko/W1Bwp3RseX1/3Y9BlbWlgTpzgzL33wiQ2Mv5nFq0C92rNdP3Lm94v5nf+H3C fjaZCI93IkoV41xBY9WUxKr8xfcXoR78CAS7fFO9tpg//+Xb0ryg+4mOJCuIgjykZP/Z N2iD076rIt04VLq9ZjhEd8JbOWW2yR2BGTYC/rtGiQazmKfhSb1nkzJIc+vt3Veb3o4r k8pQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768561292; x=1769166092; 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=ovduUETZ2fgJqjXFUzboacKNYuA1eanpnCkGfbo7VWE=; b=cH/W++EWtsOMfDuziHNj1Jnc/LM1zWVtRtay/8L7fAsx/LuhiRiZDzbviyrpEY+yE9 V326T9bnedP56IS6/rZCghYKWp4wKMAb8oAqwkWY5Vx2uANsfi+mdSb04z0rPIjxWSf8 +042mT4cr7ZGbYW8OfVdfsyHhZUBA8xi8MCSbSO0ZB4ry/MDJMwQncgrzGgD6efBWacI 7OiRwVV7yrIfwvQBo5vOzi+AEjezn7bIzxCMfESphb/gU9X4EOv0g0qFRhqCl1S/kbpI uaoPJiCXf9oBV0WtaxFYu+Am57sqGmOXlSXpoenNvGIJFXe/30Pfi0sEqr1a1IFQy99G j3uQ== X-Gm-Message-State: AOJu0YygIPl8LqcgEeT6LGgrFvEZnyGD015c6rnPJt1WrBy8PiirGQmK wz6FRFgSKel7plSHjwLHx+r/Jr7vAcGAEVmZtaTshYAFi/EVx2UW8ugGOsZ5bu4tNUaGoWir8W5 X8eFDANJ+OYp9GvqicJNjfrCNJHpUlV7O5lHqS2eowqJEm75mVmfUKnji661W1YBhZKwJ5G2oth w= X-Gm-Gg: AY/fxX42jSBtCtJJbrnEa8hsXJMoLshoHXWA8k6OCDqdkBrFeHt+fs6Ed/LthH/UvhM EdwA/8YwD9cOh5rWCTa48Oeu7Gq4wTJH+Oe5PrLHosoPV73VuqyYIkz+m0rOG8qIe09Lf+mWEwd rPR8hl4bqEPByAGIPPwxBIVcPduPgR38F6rvdq3gIaFKM981Hfxgm1QF4iYmpFCgUcbnupkdcSc QqiSpamDtlS0ZlS8aiKDRLH+gvo3kIYUzK0rj2ImpsKHSvtJ3QB/CtMFyWsPV4O8AJewKFfUARh T3lx7yqESVr+gCkfcN59AJXgfRpWpSehM8JSD/OASeYYY5if9IquVVYLjtGVCjAqh7Vv/A3NJfe RDd//1/Q3j/PWTKKIvtA7TGp6QR+1vaigHdPuY6Q= X-Received: by 2002:a05:6102:162a:b0:521:b9f2:a5ca with SMTP id ada2fe7eead31-5f1a538917dmr799859137.13.1768561292296; Fri, 16 Jan 2026 03:01:32 -0800 (PST) X-Received: by 2002:a05:6102:162a:b0:521:b9f2:a5ca with SMTP id ada2fe7eead31-5f1a538917dmr799846137.13.1768561291596; Fri, 16 Jan 2026 03:01:31 -0800 (PST) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:d1c:5bb0:db13:fc7d]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47f4289b789sm93512975e9.1.2026.01.16.03.01.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Jan 2026 03:01:31 -0800 (PST) From: Bartosz Golaszewski Date: Fri, 16 Jan 2026 12:01:13 +0100 Subject: [PATCH 6/7] nvmem: split struct nvmem_device into refcounted and provider-owned data 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: <20260116-nvmem-unbind-v1-6-7bb401ab19a8@oss.qualcomm.com> References: <20260116-nvmem-unbind-v1-0-7bb401ab19a8@oss.qualcomm.com> In-Reply-To: <20260116-nvmem-unbind-v1-0-7bb401ab19a8@oss.qualcomm.com> To: Srinivas Kandagatla , Bartosz Golaszewski Cc: linux-kernel@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6031; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=g+yD8o+2gVQjUiYEpHiBQF7ASL0OkhzgVD7q84WldJQ=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpahqBeuZprjD0fyFe6lKmlI4dv+UjfKJHGeiyx 3lgiUEH3NyJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaWoagQAKCRAFnS7L/zaE w1dLD/9NVg1cn3N0/c0j8CLTDTyPZUnGRz7Bum36gY47J2F++hJxmfX8HtkustupU0rQF+keDiZ cSgPwUZucj1Jk8R/WSDApvMqr/tUV6FXIYBo3L0Egg6fLumRFoEMkh9IvynCWg5pGldKis/E/E7 lk/X4A+6UPVUopI+YvMD0eD7/0VzanCqnFhzpjc1V/7XCDW6h+bX63QDctbW74QiLBfkkKYaz7X C17scm0FuqM6gJCZNqbw6RnWObVDR4Ur8KKZjXKZRIWimSThi6du+DWxFqS7zQRhkpVRscgt+J6 q40f1+4n0rJ9ldj7c8iheP+9ZkXsaetE58xPHi8/xVG0aPcGZqf/yBb6A5pQ9kyhRlCebE2UIZg VWQuQ9TffDWojUtXGjFxgJ/vssGYyhKO9VIZNmjwTQ4EwpHZ/eRPSS1o6EAmbj1Rb8y6TnGZaeA /qKqjZR3Y5YgZg0nnBQV3adN6GzjPaV8pyFt3vb/rjunhoeF7PCe8dWPOwBexIwlp7UEMMvySxz pKtufeflQkvpX1S4CriskHXjfFGvfo1hDMEjWxAqXRuVXR+95t1bpCNSt25OBtrFohKHtlsPAh1 kcKEZcHW37grfGf4UWGiLKHOitayQnjZhyU+QMW4f6hu5Uy1AHPGRiRunqMYD8L83+eofT1SEeQ l0c+/qovCjPHPSA== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTE2MDA4MCBTYWx0ZWRfXyYAp5AOi6ahU isZYcvKreN59FSmrZX0n1tAmXRRtIu6rIjLXQ4dJ6S/H7GZU+wYzimXJMYVw1MXdxqAgVoHlXMr ltK/SVVzBdYFN8kWriQGPpkLg/2vBrpXUlpRMeIDkF5MPpPamb33IsGYcCDntmNzb9g6ugMM3Ox Ux79cuin2pW2S9E64fMvRcG+r6KIulnC2n9IUI7+ywZhQpXkE1HttjXW/z3srMZ3znzzQk65fj+ yj+Qwj8bdNdx2wsAQI0qYQ/+iRTLk5AkfquGx2p+zmjxPjblx3EK2eMubwNL3kwSo6shBJRzF1R g92QZGCvxBszjBUrM8lgFoikK6k1V9PvVUwWmCqTuN8f40q4cNNAdXHQkG8Tm8TJKoHcohxRzzL JSdb4uo0hWyIszkXiGnTT+EIEbLU5AZ/Pds0ZutoBdnR986k2FvYBHWi1WrKskN+RdTApIspgRT jBKXJpgDcyzgyW4V1rw== X-Proofpoint-ORIG-GUID: ggUj_eYPG8GlNOqbQftaqX41mRLJIyMF X-Proofpoint-GUID: ggUj_eYPG8GlNOqbQftaqX41mRLJIyMF X-Authority-Analysis: v=2.4 cv=TsTrRTXh c=1 sm=1 tr=0 ts=696a1a8d cx=c_pps a=P2rfLEam3zuxRRdjJWA2cw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=pIqL1rwnkotILNDKPM8A:9 a=QEXdDO2ut3YA:10 a=ODZdjJIeia2B_SHc_B0f:22 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-16_03,2026-01-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 impostorscore=0 malwarescore=0 phishscore=0 priorityscore=1501 bulkscore=0 suspectscore=0 adultscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601160080 Data owned by the nvmem provider must not be part of the reference-counted struct nvmem_device. Ahead of protecting that data with SRCU, move it into a separate structure the address of which is stored in nvmem_device. Signed-off-by: Bartosz Golaszewski --- drivers/nvmem/core.c | 39 ++++++++++++++++++++++++++++----------- drivers/nvmem/internals.h | 14 +++++++++++--- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index e3e15fa462567872718b9262a039202c6961deea..f6892af8ace52d033846f405272= 2289c2aa826df 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -57,25 +57,28 @@ static BLOCKING_NOTIFIER_HEAD(nvmem_notifier); static int __nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offse= t, void *val, size_t bytes) { - if (!nvmem->reg_read) + struct nvmem_impl *impl =3D nvmem->impl; + + if (!impl->reg_read) return -EOPNOTSUPP; =20 - return nvmem->reg_read(nvmem->priv, offset, val, bytes); + return impl->reg_read(impl->priv, offset, val, bytes); } =20 static int __nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offs= et, void *val, size_t bytes) { + struct nvmem_impl *impl =3D nvmem->impl; int ret, written; =20 - if (!nvmem->reg_write) + if (!impl->reg_write) return -EOPNOTSUPP; =20 ret =3D gpiod_set_value_cansleep(nvmem->wp_gpio, 0); if (ret) return ret; =20 - written =3D nvmem->reg_write(nvmem->priv, offset, val, bytes); + written =3D impl->reg_write(impl->priv, offset, val, bytes); =20 ret =3D gpiod_set_value_cansleep(nvmem->wp_gpio, 1); if (ret) @@ -286,6 +289,8 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, = struct kobject *kobj, =20 static umode_t nvmem_bin_attr_get_umode(struct nvmem_device *nvmem) { + struct nvmem_impl *impl =3D nvmem->impl; + umode_t mode =3D 0400; =20 if (!nvmem->root_only) @@ -294,10 +299,10 @@ static umode_t nvmem_bin_attr_get_umode(struct nvmem_= device *nvmem) if (!nvmem->read_only) mode |=3D 0200; =20 - if (!nvmem->reg_write) + if (!impl->reg_write) mode &=3D ~0200; =20 - if (!nvmem->reg_read) + if (!impl->reg_read) mode &=3D ~0444; =20 return mode; @@ -328,6 +333,7 @@ static umode_t nvmem_attr_is_visible(struct kobject *ko= bj, { struct device *dev =3D kobj_to_dev(kobj); struct nvmem_device *nvmem =3D to_nvmem_device(dev); + struct nvmem_impl *impl =3D nvmem->impl; =20 /* * If the device has no .reg_write operation, do not allow @@ -336,7 +342,7 @@ static umode_t nvmem_attr_is_visible(struct kobject *ko= bj, * can be forced into read-write mode using the 'force_ro' * attribute. */ - if (attr =3D=3D &dev_attr_force_ro.attr && !nvmem->reg_write) + if (attr =3D=3D &dev_attr_force_ro.attr && !impl->reg_write) return 0; /* Attribute not visible */ =20 return attr->mode; @@ -537,6 +543,7 @@ static void nvmem_release(struct device *dev) =20 ida_free(&nvmem_ida, nvmem->id); gpiod_put(nvmem->wp_gpio); + kfree(nvmem->impl); kfree(nvmem); } =20 @@ -901,6 +908,7 @@ EXPORT_SYMBOL_GPL(nvmem_layout_unregister); struct nvmem_device *nvmem_register(const struct nvmem_config *config) { struct nvmem_device *nvmem; + struct nvmem_impl *impl; int rval; =20 if (!config->dev) @@ -913,8 +921,15 @@ struct nvmem_device *nvmem_register(const struct nvmem= _config *config) if (!nvmem) return ERR_PTR(-ENOMEM); =20 + impl =3D kzalloc_obj(*impl, GFP_KERNEL); + if (!impl) { + kfree(nvmem); + return ERR_PTR(-ENOMEM); + } + rval =3D ida_alloc(&nvmem_ida, GFP_KERNEL); if (rval < 0) { + kfree(impl); kfree(nvmem); return ERR_PTR(rval); } @@ -940,6 +955,11 @@ struct nvmem_device *nvmem_register(const struct nvmem= _config *config) INIT_LIST_HEAD(&nvmem->cells); nvmem->fixup_dt_cell_info =3D config->fixup_dt_cell_info; =20 + impl->priv =3D config->priv; + impl->reg_read =3D config->reg_read; + impl->reg_write =3D config->reg_write; + + nvmem->impl =3D impl; nvmem->owner =3D config->owner; if (!nvmem->owner && config->dev->driver) nvmem->owner =3D config->dev->driver->owner; @@ -947,10 +967,7 @@ struct nvmem_device *nvmem_register(const struct nvmem= _config *config) nvmem->word_size =3D config->word_size ?: 1; nvmem->size =3D config->size; nvmem->root_only =3D config->root_only; - nvmem->priv =3D config->priv; nvmem->type =3D config->type; - nvmem->reg_read =3D config->reg_read; - nvmem->reg_write =3D config->reg_write; nvmem->keepout =3D config->keepout; nvmem->nkeepout =3D config->nkeepout; if (config->of_node) @@ -976,7 +993,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_= config *config) goto err_put_device; =20 nvmem->read_only =3D device_property_present(config->dev, "read-only") || - config->read_only || !nvmem->reg_write; + config->read_only || !impl->reg_write; =20 #ifdef CONFIG_NVMEM_SYSFS nvmem->dev.groups =3D nvmem_dev_groups; diff --git a/drivers/nvmem/internals.h b/drivers/nvmem/internals.h index 7cbc55f40259fc4315c41979ad8bf75c36bcb056..05197074799ff3e2a6720f65528= 78a9e1354a5c3 100644 --- a/drivers/nvmem/internals.h +++ b/drivers/nvmem/internals.h @@ -7,9 +7,20 @@ #include #include =20 +/* + * Holds data owned by the provider of the nvmem implementation. This goes + * away immediately the moment nvmem_unregister() is called. + */ +struct nvmem_impl { + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + void *priv; +}; + struct nvmem_device { struct module *owner; struct device dev; + struct nvmem_impl *impl; int stride; int word_size; int id; @@ -26,11 +37,8 @@ struct nvmem_device { struct nvmem_cell_info *cell); const struct nvmem_keepout *keepout; unsigned int nkeepout; - nvmem_reg_read_t reg_read; - nvmem_reg_write_t reg_write; struct gpio_desc *wp_gpio; struct nvmem_layout *layout; - void *priv; bool sysfs_cells_populated; }; =20 --=20 2.47.3