From mboxrd@z Thu Jan 1 00:00:00 1970 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 3B2E136164D for ; Mon, 23 Feb 2026 10:58:02 +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=1771844283; cv=none; b=Z3vvs+XOqRAC/NWcGir5JbLRB3PEWAdSA9JzePzLWqYgldwbPJkdsutIMuuMmam3R2Cz+rSxZUWwfa58Jr3+i3gW487y5ifltnbwkWbWqPNTu9ASBXmlqAQppExWf3ooIWj2UyABtv97EACaf13R1bgPc1NyCyPGcc8OPQtQFcA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771844283; c=relaxed/simple; bh=ooRoVE8/bILcm+MLgn4kEI6KarMtJzqF2BVfN0w3RDY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CYxhMp0rQCCIEwxXlF/OGbtS6yvQAxDZ5PAqGKYkzBhio0PnIAlLZ0JFvIfNVoq5Tq6RVQuu/M+u83S4IG/wdsjg/DDjo58KfP/yiKT8nZIZvy1u+cGibjQ+t8q+mH+UG4XtwYDaSQrSRED21e9m8ptGx/oZGnjA/wU8uTcPbTQ= 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=SmHTvxIf; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=aOpdeBfj; 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="SmHTvxIf"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="aOpdeBfj" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61N9GlVW2299144 for ; Mon, 23 Feb 2026 10:58:01 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= /IUSxpB/fzCFagSR5Ntc0ttYUMp4h/8G2XGZIXSm/hc=; b=SmHTvxIf55lK8z8F /jEL8K4bxRpWf6j6Kklvo6v+n2bc78Rbm/+fd2rZ6Ff7W94kdIw4X9Wb0kSwFqXk vpqps+0/OuBAaFx3kecCqz/A6SD9huMMQGxg7fZlEVpv1QFxZIToPg60hrf6ers/ uwjoWobH33bZgUax8nwEBqx+XJYJu9q9ao1v0aimN+xmCRFj9I7Gy65QFs7rtByq Wc2/xrFG5fHBKb6kDsN5hbmd/7S6pQf5HXNzC30Saun2h4jZmhH2UwYJxU+C6QzR oa8uvvw//p2qJrUvfj+DwPyVNBl73u+sWOZceffDhOz4Rc6Eksv2e4axqamWe5xG N4cnYA== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cf5wyveka-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 23 Feb 2026 10:58:01 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-8cb390a0c4eso1227556085a.1 for ; Mon, 23 Feb 2026 02:58:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1771844280; x=1772449080; 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=/IUSxpB/fzCFagSR5Ntc0ttYUMp4h/8G2XGZIXSm/hc=; b=aOpdeBfj+RqGLowUQkFuV7PddQCw7UHHdY+f5SqpWEJT6kIbchs4tTyGwqKMdJPXtI DpFyfP3pDVezgImMNdLE+Fc6JsJI0QShhfSXxYtPf3za1DheB+UOx1MdpIkDTM3x+q4x wPnTrTYIAICva2mPvvxjMlK/QUu5b0PFJw83B4vvz5YyOXvp1QXjAlSFnIEkL1zauZpl SFzDQ++8XoRKZjA2PEKb6RtOnwu4gjhQEHI+XVA6Q74N2eBjsfjCFejCfqCBUorO18vg X5/sXvcoQriC0kMGGX2QlDGqovPqUIcuigPuGS2uNeHAirgndxROqfaM7hcDC1VhA3VD JJXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771844280; x=1772449080; 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=/IUSxpB/fzCFagSR5Ntc0ttYUMp4h/8G2XGZIXSm/hc=; b=o5HuqxfNIDRwe0fOksXxPgHAZQlhlb9G0AL4tHmHLFwwT2SaP6vpljvlSeutohvyqE 6VVgfTWoFUz+bY8UIZTtdYRW3pmHLALjy+N43fZ203o0uocgH7KXgNM7ckkm++LRtIDG 9VBZbjy/LcVVBy91RTGJw1JTLIt1a7nfOLJt/gb8GzCanQKIfPGM2Stkq9tw1FSWouMS 7VavROGU1BZCH8BJVoUVA1VOn5EBOoz76lb1X8lCftUohdsezeV1sC73iPRMdorSvFcY QIHHW0k5k8ASK9///n+euS9BNfT5LOXcmYWatg1n2ulLYF3th9prj64lql8LYIq7KWxc bBOg== X-Gm-Message-State: AOJu0Yw0rtEMMGMlX5SG6cKtvjPCMseHxuSZF+aaKHa5hLyK62AAJHPY FqqdL4/39/oSFIjbJ+XXFcpErjRPbUWSx1w8Z3f/ek7Jtxb3rlYYcGjgiUFeEpvCW85ARE8tH7r pXHy8WmOxYZucPnyvG9miuqGRQlD8FS3DgrGRymzOSVFwh0lYR2JuisQ5nWwq4y6hrp8= X-Gm-Gg: AZuq6aIUf9LHNStzJ/uXcglnHRWRUN18QQA+f6LMMlLhvpqSMyRhmdUBdaA8Lul7GPA t2s25hXTtu4YNzXR3vcuEKBZqOjWlRIWY/9DMbC5+QzQqybIH5oTHlmaNSOUddr+h1jMb9lhSWG 8NQp8RdLKmJCHx7nLokLGlEZvRcmzEUWReUtYF8lnSwTjbzu4ets6SRwVT95B7TOg13xLSj1xW3 caIRwg4bi4dqTAYkJWeYV6wT9aUTcB+5+84AnWnu9+7x0+MD8wlakcVtzlzvHPPQJgRNE6h6cne rsbSKEFaATs/AADyT+svSzboEm5GZrD73pifUilcMOrDMlAdzPSL0m5imVS2p/DsPCp+m57p8pA GTuE2/EdZsdAd8xAXDjJ02CnaRja6665I1sFS7GaUwp/astFxzWLd X-Received: by 2002:a05:620a:1a8b:b0:8cb:4128:ec45 with SMTP id af79cd13be357-8cb8ca7fdf2mr967169085a.66.1771844280300; Mon, 23 Feb 2026 02:58:00 -0800 (PST) X-Received: by 2002:a05:620a:1a8b:b0:8cb:4128:ec45 with SMTP id af79cd13be357-8cb8ca7fdf2mr967168285a.66.1771844279886; Mon, 23 Feb 2026 02:57:59 -0800 (PST) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:bd71:422c:5e83:8b37]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43970c00c18sm18120002f8f.14.2026.02.23.02.57.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 02:57:59 -0800 (PST) From: Bartosz Golaszewski Date: Mon, 23 Feb 2026 11:57:07 +0100 Subject: [PATCH v2 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: 7bit Message-Id: <20260223-nvmem-unbind-v2-6-0df33a933dca@oss.qualcomm.com> References: <20260223-nvmem-unbind-v2-0-0df33a933dca@oss.qualcomm.com> In-Reply-To: <20260223-nvmem-unbind-v2-0-0df33a933dca@oss.qualcomm.com> To: Srinivas Kandagatla , Bartosz Golaszewski Cc: linux-kernel@vger.kernel.org, brgl@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=ooRoVE8/bILcm+MLgn4kEI6KarMtJzqF2BVfN0w3RDY=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpnDKtRQy4J5fNjL9C7g/gz3ZmuBJMROiFdrxY3 v94J/YWrleJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaZwyrQAKCRAFnS7L/zaE w3XZD/9nMPcaJOO3DgAcjOuqO4SoSzEObuA5F3zZ6iwQgAepGua6XninhG21RVCwJNDOess03is qTlxQJhg+v4Ub38b6nEwrQW5UdbxaVZvJ0XVBvFRyYSPL3TE+yjkKup3cAM5k03+sbHxkjCjrnr c4guJ5rdrQTFLlFVebgUDerCZhXd21mQuSVabqz1lMQ0XATLcbLLJ21unWb7H9NTnaU9lZWOqWk aJddqLfeEWkNo/E+UxEJGnflkzty/8JDudZRWxN1SzowdGiPe+sfTcsvMRcfJiDUeIM5vJQeOyV 4en3w6Vnu3NZKqUMJNk3+ThHReuHHUSjgrW3aNUTPr5hCN6+tZvvkJCaOjBdAFedBitTXD0eZmd njTJ3ziO3mXGxVhbyk31ZB8dq7KNwbB+AFyGtDsuoM27KxORtci64o169sRUS7qdCoD01PuWsnx 0rMXDRDeAl9xKQjLyRM06dt0gUYFfuO3ASR8UZXfWCFxbEp2l/3EKyHE+P2uCx8I7qCqYD917Qz yLqY0wHB10XGgyrgxs9nBFh72bsqVa5E5ZHprwRwrA2NPXhUfuC6wuaQSQfMrZmDrjLvWqS6lE+ MaIsutHxSEZE+7yNBQ+mga+sxwSOHku8VKDjRD4S5lsY11gxf1j+YNNh5SoA2u7z454SAP+Pixn vXWV6f6m04JPQPw== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjIzMDA5NCBTYWx0ZWRfXwf/SOfodAmsH lFXf0RhJxw0Ei0zXGVK9FTNKt/OiVPST5tzqLowE3BNo8SEzrcbIAGyuLM/ml50yje7QD9W7ZAz 7XPxUQUodh3Y705HpmJ8Az+Z8y5p4unwTlR+uOb0ZCCI/20IOWrJlW2bcxgTUv3/GxPdnno+Hzc X8QcaFcZcR4BIZUU4/3ZRMtXpIUMMLDkXn9WrcxaPybMIX2aLW9Zeh6uZBJH6VZWDg+kXrbOIbZ RmTsZh4juFYGpTT4pBFH7dUgqDev+Z4Hh9pWpSSOaGcI0phS+FM50Phr4jFyR6Tuc1X5Y/2OyjH /nFgX+2gjNeWikzJ00dwsxPEWJjl+KoJKV6IdNbnKD9ejaoDFpLQqW/ZnwLo2vKDxVmrxDXSBQv UjKVaehY4k9sVvVrdJJPvzwf5eUG8RmTbTVbM6PcHzyAurxmCVKAcFotTwgvyEgOtjOgBFnZsWV hgkTJJ8Hg75Qd1wglDg== X-Authority-Analysis: v=2.4 cv=UO/Q3Sfy c=1 sm=1 tr=0 ts=699c32b9 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=pIqL1rwnkotILNDKPM8A:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-GUID: FlD4XUJQ2sj946oK13qA0V1w_QVojoGQ X-Proofpoint-ORIG-GUID: FlD4XUJQ2sj946oK13qA0V1w_QVojoGQ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-23_02,2026-02-20_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 malwarescore=0 priorityscore=1501 bulkscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2602230094 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 30aee8089f1dc65b1fa07dac8fb35e1dbbcd0ce7..9ff97330682975ef724b542fee6089fa7cd5414a 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 offset, void *val, size_t bytes) { - if (!nvmem->reg_read) + struct nvmem_impl *impl = nvmem->impl; + + if (!impl->reg_read) return -EOPNOTSUPP; - return nvmem->reg_read(nvmem->priv, offset, val, bytes); + return impl->reg_read(impl->priv, offset, val, bytes); } static int __nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset, void *val, size_t bytes) { + struct nvmem_impl *impl = nvmem->impl; int ret, written; - if (!nvmem->reg_write) + if (!impl->reg_write) return -EOPNOTSUPP; ret = gpiod_set_value_cansleep(nvmem->wp_gpio, 0); if (ret) return ret; - written = nvmem->reg_write(nvmem->priv, offset, val, bytes); + written = impl->reg_write(impl->priv, offset, val, bytes); ret = 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, static umode_t nvmem_bin_attr_get_umode(struct nvmem_device *nvmem) { + struct nvmem_impl *impl = nvmem->impl; + umode_t mode = 0400; 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 |= 0200; - if (!nvmem->reg_write) + if (!impl->reg_write) mode &= ~0200; - if (!nvmem->reg_read) + if (!impl->reg_read) mode &= ~0444; return mode; @@ -328,6 +333,7 @@ static umode_t nvmem_attr_is_visible(struct kobject *kobj, { struct device *dev = kobj_to_dev(kobj); struct nvmem_device *nvmem = to_nvmem_device(dev); + struct nvmem_impl *impl = nvmem->impl; /* * If the device has no .reg_write operation, do not allow @@ -336,7 +342,7 @@ static umode_t nvmem_attr_is_visible(struct kobject *kobj, * can be forced into read-write mode using the 'force_ro' * attribute. */ - if (attr == &dev_attr_force_ro.attr && !nvmem->reg_write) + if (attr == &dev_attr_force_ro.attr && !impl->reg_write) return 0; /* Attribute not visible */ return attr->mode; @@ -537,6 +543,7 @@ static void nvmem_release(struct device *dev) ida_free(&nvmem_ida, nvmem->id); gpiod_put(nvmem->wp_gpio); + kfree(nvmem->impl); kfree(nvmem); } @@ -898,6 +905,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; if (!config->dev) @@ -910,8 +918,15 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) if (!nvmem) return ERR_PTR(-ENOMEM); + impl = kzalloc_obj(*impl, GFP_KERNEL); + if (!impl) { + kfree(nvmem); + return ERR_PTR(-ENOMEM); + } + rval = ida_alloc(&nvmem_ida, GFP_KERNEL); if (rval < 0) { + kfree(impl); kfree(nvmem); return ERR_PTR(rval); } @@ -937,6 +952,11 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) INIT_LIST_HEAD(&nvmem->cells); nvmem->fixup_dt_cell_info = config->fixup_dt_cell_info; + impl->priv = config->priv; + impl->reg_read = config->reg_read; + impl->reg_write = config->reg_write; + + nvmem->impl = impl; nvmem->owner = config->owner; if (!nvmem->owner && config->dev->driver) nvmem->owner = config->dev->driver->owner; @@ -944,10 +964,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) nvmem->word_size = config->word_size ?: 1; nvmem->size = config->size; nvmem->root_only = config->root_only; - nvmem->priv = config->priv; nvmem->type = config->type; - nvmem->reg_read = config->reg_read; - nvmem->reg_write = config->reg_write; nvmem->keepout = config->keepout; nvmem->nkeepout = config->nkeepout; if (config->of_node) @@ -973,7 +990,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) goto err_put_device; nvmem->read_only = device_property_present(config->dev, "read-only") || - config->read_only || !nvmem->reg_write; + config->read_only || !impl->reg_write; #ifdef CONFIG_NVMEM_SYSFS nvmem->dev.groups = nvmem_dev_groups; diff --git a/drivers/nvmem/internals.h b/drivers/nvmem/internals.h index 7cbc55f40259fc4315c41979ad8bf75c36bcb056..05197074799ff3e2a6720f6552878a9e1354a5c3 100644 --- a/drivers/nvmem/internals.h +++ b/drivers/nvmem/internals.h @@ -7,9 +7,20 @@ #include #include +/* + * 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; }; -- 2.47.3