From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 43E3C3E7BDE for ; Thu, 21 May 2026 14:26:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373570; cv=none; b=QdkbuDZM09SQENWdUOC6rUzu2B8hwz5Vm8jKs/ypD70UQHhp1XaU2VkcmuzNitTLJHZrjllQVt4PZgNG8afCLqGMW25M87+jhE0IGRgIm91u2ENhh18dYu1zrHOVTxWbw+CJ4NKqi6ssCyJYzrDvOcjxQ3RnGWcuxQr42Wdgn98= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373570; c=relaxed/simple; bh=SAE06UKnCu+BvGDpmoo8KwBdutZAS2XSRuglaL35LKU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mK9JagC0VxPgoGZrJuzo7PtfSP3U9D5jZi8FhO5Ux9cvy+FPvP7JMhqtJOx2Mqs4H6HYtI3X9UcgZ8D4fmDDQOIqXffTFRHFiT/39fmUl9w3xAvVk+Al/zmpIh3UbsMLWR5UkFNZPEfai2ukHtJfTVHfKHt0Mk60myvwRK9uIlE= 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=PmbyTEZ5; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=jrp40CIe; arc=none smtp.client-ip=205.220.180.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="PmbyTEZ5"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="jrp40CIe" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64L99ns03009484 for ; Thu, 21 May 2026 14:26:08 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= SmDMLd3PxcBCoEGL1ZcB7hUI/xAqZMoM8+/DMqsYvOQ=; b=PmbyTEZ54tYcnEu7 mrWiyDKJoGeKzxLPCrMKq4eZUmUsq60d1qLpcBOVjkffUOMSSGOF+l6zGg+OzoW0 33yfted8qaao3mLkewhLmD9arrJANxRLolFSXm/xMidSZz+S+Yd0dGwxId7xNGDT TarT9BAefvUYdz2D9u0wvES6zCjO8xLQ1FUQIQnAdzmY4ASIa8qFq+Lc5eH9+ewD EQq+38piygRcwshROx34tW7RHQlmSEwQEUMseHdhk/T0zkwbuxIJoioZM3K266UU K4tGJDTBT7+yAtgBDGQEIygeabVZkIzIHjvsSInnfC9xhci8siPQquIrLJ5ByBRK dD7gEw== Received: from mail-oo1-f70.google.com (mail-oo1-f70.google.com [209.85.161.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e9sr32n8r-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 21 May 2026 14:26:08 +0000 (GMT) Received: by mail-oo1-f70.google.com with SMTP id 006d021491bc7-6963482e03dso7952031eaf.3 for ; Thu, 21 May 2026 07:26:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779373568; x=1779978368; 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=SmDMLd3PxcBCoEGL1ZcB7hUI/xAqZMoM8+/DMqsYvOQ=; b=jrp40CIeSop8ll1dbiwTTNCDkjpgrOOFexTBe7Al33p+oHSXU0CDfZ/ha9NdoTYm8b KD/kL2sNPmbFpTSbVByfm8YAuD1eiCa81W/JWXPxwRzlQ+bCMthGsr/YBe5YnPIlAJ2g ugZ8C5cnx1SdPyia2iWTcnAFHT0eSo73qEGV27a+yO7sOH59CjNjl14PU1yQjRHLaWMS /K1dveTauWTHeb+MRDcCFlpDmH3UA0w5v/yDG221N1luenevbZdHQPd0X3RaTXPm4N// Z6BcU6qeHJDqh2hDchXlNghqVIHzP2VOod2wnGdwxX7mi0faaOvDZ9V3TYZvQPpEYEhD Wp7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779373568; x=1779978368; 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=SmDMLd3PxcBCoEGL1ZcB7hUI/xAqZMoM8+/DMqsYvOQ=; b=ETjolrdYz2pdjNVPTZKW25LfTMy79oVFLlq0uCpHfqVMfsNv19cIVaqjbGjq6MAHDc ouuNDL6O5VBQM1yIVfSOBkXdYlqLM6PMiaXDAmADOfztAr7HkgIC8fG8kIDm7y4rknOn ARXquRHNVEO/YhXPz3b1PK3+nQywStOApBTO9FYZtq5NHsJVRcJ+iEYz6hND4syi8/aC 0+L9O1aT+tI1TX5nr+vc8dXdEy0E1upDufsFlfqFRKxk6M9DJ7n+JiKHmNiFbmQXQbql 5L4IspsZD4hs6mkCKtDwCkscKzvu7nOLXlE9sKwPyi3zC265lEodM6lHPadfF2LBgry9 B8PA== X-Gm-Message-State: AOJu0YxLk6Ck25e78n2jGMhlk8bH0nFZrpHNPGCbGBSYzzl1KnFz6SfJ AXUlO2rrJfoHj/sRRv7kTYj1P7SOu8DvPgPt/GV1vQA5Deb+hVF9BsTwz/9wIzgyzAXHTstuJRY 5ZjGD3Ay8uZvGlJWNtatjywoU40peet6jMm6QijVGy5O2/w8I5RK42zsZiVvbPkI+7xk= X-Gm-Gg: Acq92OFhaBWKq8ZJTU9LlfloOYfsVNfZqeWdDIRBdhs4a7n3yo84XOlbXV/wBG0wGy2 7beWXIR3vTRK4n8RKQiEIHRKNkHLvasoZnnPqTUuEzn1O6n5NjY75qklZafmgByLephb7RKQajQ yMUSPYB0us+k3wv/bYk9drEn3NmAo2CC8+W0c2bCOvsWrXMe79ossSgixkesM/n46gq0cfvrLIC +5/VhkCT5Kjximfp7kse+mimGuX3DwBqWq2hLWuaxy3oKw1hHLLLGsP5juEMS8rsBqGtDBaXJSV xU7ZgE7S4yT24+U2fjPKtFu4e8NFt2V1C1DvFUeP47GupYib0BXjCesq5pDongK0n38RVDc7lLY lwj/oPhjHoR9qKtmAb5sZP+EAo18SON5QTznCbZTcdaeRw98+zuw= X-Received: by 2002:a05:6820:2982:b0:696:23f5:7702 with SMTP id 006d021491bc7-69d6ef68240mr1366220eaf.60.1779373567629; Thu, 21 May 2026 07:26:07 -0700 (PDT) X-Received: by 2002:a05:6820:2982:b0:696:23f5:7702 with SMTP id 006d021491bc7-69d6ef68240mr1366202eaf.60.1779373567224; Thu, 21 May 2026 07:26:07 -0700 (PDT) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:bb10:ae82:b7c3:d15a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4903c9abbadsm30441925e9.8.2026.05.21.07.26.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 May 2026 07:26:06 -0700 (PDT) From: Bartosz Golaszewski Date: Thu, 21 May 2026 16:25:42 +0200 Subject: [PATCH v4 09/10] nvmem: remove duplicated reference counting 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: <20260521-nvmem-unbind-v4-9-7fa136759491@oss.qualcomm.com> References: <20260521-nvmem-unbind-v4-0-7fa136759491@oss.qualcomm.com> In-Reply-To: <20260521-nvmem-unbind-v4-0-7fa136759491@oss.qualcomm.com> To: Srinivas Kandagatla , Bartosz Golaszewski , Johan Hovold , Loic Poulain 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=5743; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=SAE06UKnCu+BvGDpmoo8KwBdutZAS2XSRuglaL35LKU=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBqDxXtVfGjOjw3xJ4E3iu8Q8h4yVvBaVJZ1WrgE N3V83TB7CCJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCag8V7QAKCRAFnS7L/zaE w0wcD/99M1xo11Hc0PfIIkcKTexG9clLIkY4Mr/XR6//+73jUF548+A0fy0uk0iHRC6TlAYp2w7 n2ZlJPduTc4RDKZ/NQPfA0OYe2TrJlqYDu1OtxgKdEpt/hoh7regZGCPFMxceLjNQq8ZilmBYTF eIWOG4f/DdJkGljrYHh/S8C629FAjy6Jwj4LZ4YydYZ9LTvCYtYNuaOBaFxXdBs/XdGPece8QTK Jiu3oBUdHQHujCIEttsi4P0MH2CpaeFMS0DfII9KsC41D/0PytzlLn1uhR/MZ05yJS94sJkrOWz MaWv7Soht3KXtYGOan3unifrqr5Q2csbZFcZHl8Zwyr4mE9T7kKOGm1StWaI6yfgTbjJRb9k6w9 72Kn8VVZGaHurRC3ppBzI2BeT1XcU8h/jz7CgsFciOPPryL4UZBiHIDNxvfhTR+Myg0f9BfZnv3 FMhMlc+bRsG+6Sp6rEn/1yQSbu7aVkYk9Vwi9+9s8A3cKDBY2BsKo9LmH3PaDDBcHPT3lE9h4qt jPMx3Ys8l+6xeO+gcvvQuXKmiWzTJOopQAISG7DrZKH84cp6ITpL5LWaQ2Aon3bBNOV3QviT6YY 9tEd41cwIvxCxJkjQU1itt0PmIE0w+SqaS960gkp7w6RsBM4ouvjuEbP4UgOJwBW5GUlWRSM5G+ NgTKPkfzsCTsoPg== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-GUID: S39BletJ7Z365qzs90iCp4EIie3a_isD X-Proofpoint-ORIG-GUID: S39BletJ7Z365qzs90iCp4EIie3a_isD X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0NCBTYWx0ZWRfX05zm9GnM/9T1 C8RFDwL/r8zXHGAFkTdz4MQcnYxOiV8els/H9U1WrOIRYs3GblNdprRizPYT4lYFO680FaU7oBP PYZJoN5laOrhVEbb8L17T8vAmhqqMQPw891+LaiBUOU0QA4sYucFzBkExmLvz4JRgq3K8mLNH/N Oz9dmxGoEstrLAglzIkivUhM/PdXSH5c4m5wX9VswtU0RLk6D4vSiGeaxOu4dxEHOH5lzPxbipg wgj/1WBeakV8Unt6+nmM4aUkdzsRkK4xf3d/kAMHNK1ac+cu7fYNQEUw4ZNBaVdaelZS4KD54WV rp42r8hPs+aYZKF3aMToiEZ0Pg9BIAyRRIIgjVM4oDU4lDBtBo5n6IZzODi1rBenGKi/gwomcZK SeirB483ei+F/I1eI5EEcu5f3K+JKY8dkK88SHkmFx+0N+wZ9jpib6wPLRuoGYFt0dRhmkkdeQs mVA4YvkghoPOTw+h73Q== X-Authority-Analysis: v=2.4 cv=L+YtheT8 c=1 sm=1 tr=0 ts=6a0f1600 cx=c_pps a=lkkFf9KBb43tY3aOjL++dA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=IOj402APi-VxR199s-4A:9 a=QEXdDO2ut3YA:10 a=k4UEASGLJojhI9HsvVT1:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 priorityscore=1501 malwarescore=0 bulkscore=0 lowpriorityscore=0 phishscore=0 clxscore=1015 adultscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210144 Commit c1de7f43bd84 ("nvmem: use kref") introduced reference counting with kref to an already reference counted nvmem_device structure. We only need one refcount so use the one provded by device's kobject and drop the kref field from struct nvmem_device. Signed-off-by: Bartosz Golaszewski --- drivers/nvmem/core.c | 82 ++++++++++++++++++++--------------------------- drivers/nvmem/internals.h | 1 - 2 files changed, 35 insertions(+), 48 deletions(-) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index c59c5f0e8a253eaedc0c6b180c7273a6c53ee1ac..2c6d058a20d97e039f42e45c7b8d4305344c4ba0 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -535,24 +535,6 @@ static void nvmem_sysfs_remove_compat(struct nvmem_device *nvmem) #endif /* CONFIG_NVMEM_SYSFS */ -static void nvmem_release(struct device *dev) -{ - struct nvmem_device *nvmem = to_nvmem_device(dev); - - ida_free(&nvmem_ida, nvmem->id); - gpiod_put(nvmem->wp_gpio); - kfree(nvmem->ops); - kfree(nvmem); -} - -static const struct device_type nvmem_provider_type = { - .release = nvmem_release, -}; - -static const struct bus_type nvmem_bus_type = { - .name = "nvmem", -}; - static void nvmem_cell_entry_drop(struct nvmem_cell_entry *cell) { blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell); @@ -571,6 +553,25 @@ static void nvmem_device_remove_all_cells(const struct nvmem_device *nvmem) nvmem_cell_entry_drop(cell); } +static void nvmem_release(struct device *dev) +{ + struct nvmem_device *nvmem = to_nvmem_device(dev); + + gpiod_put(nvmem->wp_gpio); + nvmem_device_remove_all_cells(nvmem); + ida_free(&nvmem_ida, nvmem->id); + kfree(nvmem->ops); + kfree(nvmem); +} + +static const struct device_type nvmem_provider_type = { + .release = nvmem_release, +}; + +static const struct bus_type nvmem_bus_type = { + .name = "nvmem", +}; + static void nvmem_cell_entry_add(struct nvmem_cell_entry *cell) { scoped_guard(mutex, &nvmem_mutex) @@ -934,6 +935,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) nvmem->dev.type = &nvmem_provider_type; nvmem->dev.bus = &nvmem_bus_type; nvmem->dev.parent = config->dev; + INIT_LIST_HEAD(&nvmem->cells); nvmem->ops = ops; device_initialize(&nvmem->dev); @@ -947,8 +949,6 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) goto err_put_device; } - kref_init(&nvmem->refcnt); - INIT_LIST_HEAD(&nvmem->cells); nvmem->fixup_dt_cell_info = config->fixup_dt_cell_info; ops->reg_read = config->reg_read; @@ -1009,24 +1009,24 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) if (config->cells) { rval = nvmem_add_cells(nvmem, config->cells, config->ncells); if (rval) - goto err_remove_cells; + goto err_remove_compat; } if (config->add_legacy_fixed_of_cells) { rval = nvmem_add_cells_from_legacy_of(nvmem); if (rval) - goto err_remove_cells; + goto err_remove_compat; } rval = nvmem_add_cells_from_fixed_layout(nvmem); if (rval) - goto err_remove_cells; + goto err_remove_compat; dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name); rval = device_add(&nvmem->dev); if (rval) - goto err_remove_cells; + goto err_remove_compat; rval = nvmem_populate_layout(nvmem); if (rval) @@ -1048,8 +1048,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) #endif err_remove_dev: device_del(&nvmem->dev); -err_remove_cells: - nvmem_device_remove_all_cells(nvmem); +err_remove_compat: nvmem_sysfs_remove_compat(nvmem); err_put_device: put_device(&nvmem->dev); @@ -1058,21 +1057,6 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) } EXPORT_SYMBOL_GPL(nvmem_register); -static void nvmem_device_release(struct kref *kref) -{ - struct nvmem_device *nvmem; - - nvmem = container_of(kref, struct nvmem_device, refcnt); - - blocking_notifier_call_chain(&nvmem_notifier, NVMEM_REMOVE, nvmem); - - nvmem_sysfs_remove_compat(nvmem); - - nvmem_device_remove_all_cells(nvmem); - nvmem_destroy_layout(nvmem); - device_unregister(&nvmem->dev); -} - /** * nvmem_unregister() - Unregister previously registered nvmem device * @@ -1080,8 +1064,15 @@ static void nvmem_device_release(struct kref *kref) */ void nvmem_unregister(struct nvmem_device *nvmem) { - if (nvmem) - kref_put(&nvmem->refcnt, nvmem_device_release); + if (!nvmem) + return; + + blocking_notifier_call_chain(&nvmem_notifier, NVMEM_REMOVE, nvmem); + + nvmem_sysfs_remove_compat(nvmem); + nvmem_destroy_layout(nvmem); + + device_unregister(&nvmem->dev); } EXPORT_SYMBOL_GPL(nvmem_unregister); @@ -1142,8 +1133,6 @@ static struct nvmem_device *nvmem_device_match(void *data, return ERR_PTR(-EINVAL); } - kref_get(&nvmem->refcnt); - return nvmem; } @@ -1259,9 +1248,8 @@ EXPORT_SYMBOL_GPL(devm_nvmem_device_put); */ void nvmem_device_put(struct nvmem_device *nvmem) { - put_device(&nvmem->dev); module_put(nvmem->owner); - kref_put(&nvmem->refcnt, nvmem_device_release); + put_device(&nvmem->dev); } EXPORT_SYMBOL_GPL(nvmem_device_put); diff --git a/drivers/nvmem/internals.h b/drivers/nvmem/internals.h index 070eef89ffca78fe033aaaada0f91c257fe2f166..60daa79c404dc915872481bd3b02de2258d33406 100644 --- a/drivers/nvmem/internals.h +++ b/drivers/nvmem/internals.h @@ -19,7 +19,6 @@ struct nvmem_device { int stride; int word_size; int id; - struct kref refcnt; size_t size; bool read_only; bool root_only; -- 2.47.3