{"id":2233019,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2233019/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-i2c/patch/20260505142547.795054-2-johan@kernel.org/","project":{"id":35,"url":"http://patchwork.ozlabs.org/api/1.2/projects/35/?format=json","name":"Linux I2C development","link_name":"linux-i2c","list_id":"linux-i2c.vger.kernel.org","list_email":"linux-i2c@vger.kernel.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260505142547.795054-2-johan@kernel.org>","list_archive_url":null,"date":"2026-05-05T14:25:40","name":"[1/8] i2c: core: fix hang on adapter registration failure","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"c695397debb098e4cdc7c1cd64c6cd7ff7700df0","submitter":{"id":64666,"url":"http://patchwork.ozlabs.org/api/1.2/people/64666/?format=json","name":"Johan Hovold","email":"johan@kernel.org"},"delegate":{"id":9049,"url":"http://patchwork.ozlabs.org/api/1.2/users/9049/?format=json","username":"wsa","first_name":"Wolfram","last_name":"Sang","email":"wolfram@the-dreams.de"},"mbox":"http://patchwork.ozlabs.org/project/linux-i2c/patch/20260505142547.795054-2-johan@kernel.org/mbox/","series":[{"id":502847,"url":"http://patchwork.ozlabs.org/api/1.2/series/502847/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-i2c/list/?series=502847","date":"2026-05-05T14:25:43","name":"i2c: core: adapter registration fixes","version":1,"mbox":"http://patchwork.ozlabs.org/series/502847/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2233019/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2233019/checks/","tags":{},"related":[],"headers":{"Return-Path":"\n <linux-i2c+bounces-17253-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-i2c@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=X027wd3Z;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c04:e001:36c::12fc:5321; helo=tor.lore.kernel.org;\n envelope-from=linux-i2c+bounces-17253-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"X027wd3Z\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from tor.lore.kernel.org (tor.lore.kernel.org\n [IPv6:2600:3c04:e001:36c::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g91HM52tWz1yJx\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 06 May 2026 00:34:23 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id C54853089F0E\n\tfor <incoming@patchwork.ozlabs.org>; Tue,  5 May 2026 14:28:41 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 17B6948094C;\n\tTue,  5 May 2026 14:28:35 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id A5E6848032A;\n\tTue,  5 May 2026 14:28:34 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id 65220C2BCF6;\n\tTue,  5 May 2026 14:28:34 +0000 (UTC)","from johan by xi.lan with local (Exim 4.98.2)\n\t(envelope-from <johan@kernel.org>)\n\tid 1wKGlE-00000003Kss-0PKb;\n\tTue, 05 May 2026 16:28:32 +0200"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1777991314; cv=none;\n b=faeIl1k9o56D/5J1s3x1udws6SDF8C1Q9E72jD5sYvc+5msanzjo51ukTv1Xr5svSiHcGfvBgwtZbYCcXwfIzLTraiVpd5orIvus4afugfVJHgDciCVT5jpHE1UuKmyo9IzlqjG75Kus8J3HXx1EW6EZB3oxMYT1N8MKB52mV4o=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1777991314; c=relaxed/simple;\n\tbh=RcSelwJi6o5XPQYFAlXWzdU/YR262F/UXpfNjyr1RgE=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=TDmV5TGYPkhmE/FPcX7BF46WmmQajDi5uIbpohdo9zfdAqKKdvcvNSZFJyErL//QXDUg3/uXDjPd07y5PZ88gTb2dwp2nxvNI6sWArOLm9UAJJLIT4d++WaGCLDdwsZ24qCrYdAfwK1SOMbPkYW1ZzZm3028xpO97C84AM8VFMI=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=X027wd3Z; arc=none smtp.client-ip=10.30.226.201","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1777991314;\n\tbh=RcSelwJi6o5XPQYFAlXWzdU/YR262F/UXpfNjyr1RgE=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=X027wd3Z3lGQRqvxJxidrx3NgvUesuXO4AxqXVRiOTPHXS9kTA9B7q39deT2WflXI\n\t 1+0wSCrfCN6cqYhCQ95TL+1oH31J5jjsdyKn7LR6TsqB8yspBPlZeWVz6bqv8mbY+W\n\t qs2n7TyWh1P8KbQGLj7cEn4CnJJjAO0tK1guwvqFYWACOJKE7lQFNEOhewANjU9ddR\n\t S8T6PReiIpefMOS2Yu9DXF5GbUw6cLiErWWgYoW9NJD6ttbN+gDJSZzeUuaawGFIha\n\t GdlB/Tud5oo5mNzD8K5FLtWtscMFXYgOhSSSPMgAueJDn52MYhYqVqHwGqV67/xxbP\n\t IqS+q+N2AN+sg==","From":"Johan Hovold <johan@kernel.org>","To":"Wolfram Sang <wsa+renesas@sang-engineering.com>","Cc":"Andi Shyti <andi.shyti@kernel.org>,\n\tlinux-i2c@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tJohan Hovold <johan@kernel.org>,\n\tstable@vger.kernel.org,\n\tPhil Reid <preid@electromag.com.au>","Subject":"[PATCH 1/8] i2c: core: fix hang on adapter registration failure","Date":"Tue,  5 May 2026 16:25:40 +0200","Message-ID":"<20260505142547.795054-2-johan@kernel.org>","X-Mailer":"git-send-email 2.53.0","In-Reply-To":"<20260505142547.795054-1-johan@kernel.org>","References":"<20260505142547.795054-1-johan@kernel.org>","Precedence":"bulk","X-Mailing-List":"linux-i2c@vger.kernel.org","List-Id":"<linux-i2c.vger.kernel.org>","List-Subscribe":"<mailto:linux-i2c+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-i2c+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit"},"content":"Clients may be registered from bus notifier callbacks when the adapter\nis registered. On a subsequent error during registration, the adapter\nreferences taken by such clients prevent the wait for the references to\nbe released from ever completing.\n\nFix this by refactoring client deregistration and deregistering also on\nlate adapter registration failures.\n\nFixes: f8756c67b3de (\"i2c: core: call of_i2c_setup_smbus_alert in i2c_register_adapter\")\nCc: stable@vger.kernel.org\t# 4.15\nCc: Phil Reid <preid@electromag.com.au>\nSigned-off-by: Johan Hovold <johan@kernel.org>\n---\n drivers/i2c/i2c-core-base.c | 49 ++++++++++++++++++++++---------------\n 1 file changed, 29 insertions(+), 20 deletions(-)","diff":"diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c\nindex 9c46147e3506..7cec3f276e13 100644\n--- a/drivers/i2c/i2c-core-base.c\n+++ b/drivers/i2c/i2c-core-base.c\n@@ -63,6 +63,7 @@\n static DEFINE_MUTEX(core_lock);\n static DEFINE_IDR(i2c_adapter_idr);\n \n+static void i2c_deregister_clients(struct i2c_adapter *adap);\n static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver);\n \n static DEFINE_STATIC_KEY_FALSE(i2c_trace_msg_key);\n@@ -1605,6 +1606,7 @@ static int i2c_register_adapter(struct i2c_adapter *adap)\n \treturn 0;\n \n out_reg:\n+\ti2c_deregister_clients(adap);\n \tdebugfs_remove_recursive(adap->debugfs);\n \tinit_completion(&adap->dev_released);\n \tdevice_unregister(&adap->dev);\n@@ -1744,29 +1746,10 @@ static int __process_removed_adapter(struct device_driver *d, void *data)\n \treturn 0;\n }\n \n-/**\n- * i2c_del_adapter - unregister I2C adapter\n- * @adap: the adapter being unregistered\n- * Context: can sleep\n- *\n- * This unregisters an I2C adapter which was previously registered\n- * by @i2c_add_adapter or @i2c_add_numbered_adapter.\n- */\n-void i2c_del_adapter(struct i2c_adapter *adap)\n+static void i2c_deregister_clients(struct i2c_adapter *adap)\n {\n-\tstruct i2c_adapter *found;\n \tstruct i2c_client *client, *next;\n \n-\t/* First make sure that this adapter was ever added */\n-\tmutex_lock(&core_lock);\n-\tfound = idr_find(&i2c_adapter_idr, adap->nr);\n-\tmutex_unlock(&core_lock);\n-\tif (found != adap) {\n-\t\tpr_debug(\"attempting to delete unregistered adapter [%s]\\n\", adap->name);\n-\t\treturn;\n-\t}\n-\n-\ti2c_acpi_remove_space_handler(adap);\n \t/* Tell drivers about this removal */\n \tmutex_lock(&core_lock);\n \tbus_for_each_drv(&i2c_bus_type, NULL, adap,\n@@ -1792,6 +1775,32 @@ void i2c_del_adapter(struct i2c_adapter *adap)\n \t * them up properly, so we give them a chance to do that first. */\n \tdevice_for_each_child(&adap->dev, NULL, __unregister_client);\n \tdevice_for_each_child(&adap->dev, NULL, __unregister_dummy);\n+}\n+\n+/**\n+ * i2c_del_adapter - unregister I2C adapter\n+ * @adap: the adapter being unregistered\n+ * Context: can sleep\n+ *\n+ * This unregisters an I2C adapter which was previously registered\n+ * by @i2c_add_adapter or @i2c_add_numbered_adapter.\n+ */\n+void i2c_del_adapter(struct i2c_adapter *adap)\n+{\n+\tstruct i2c_adapter *found;\n+\n+\t/* First make sure that this adapter was ever added */\n+\tmutex_lock(&core_lock);\n+\tfound = idr_find(&i2c_adapter_idr, adap->nr);\n+\tmutex_unlock(&core_lock);\n+\tif (found != adap) {\n+\t\tpr_debug(\"attempting to delete unregistered adapter [%s]\\n\", adap->name);\n+\t\treturn;\n+\t}\n+\n+\ti2c_acpi_remove_space_handler(adap);\n+\n+\ti2c_deregister_clients(adap);\n \n \t/* device name is gone after device_unregister */\n \tdev_dbg(&adap->dev, \"adapter [%s] unregistered\\n\", adap->name);\n","prefixes":["1/8"]}