From: Tzung-Bi Shih <tzungbi@kernel.org>
To: Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Bartosz Golaszewski <brgl@kernel.org>,
Linus Walleij <linusw@kernel.org>
Cc: Benson Leung <bleung@chromium.org>,
tzungbi@kernel.org, linux-kernel@vger.kernel.org,
chrome-platform@lists.linux.dev, driver-core@lists.linux.dev,
linux-doc@vger.kernel.org, linux-gpio@vger.kernel.org,
"Rafael J. Wysocki" <rafael@kernel.org>,
Danilo Krummrich <dakr@kernel.org>,
Jonathan Corbet <corbet@lwn.net>, Shuah Khan <shuah@kernel.org>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Wolfram Sang <wsa+renesas@sang-engineering.com>,
Jason Gunthorpe <jgg@nvidia.com>, Johan Hovold <johan@kernel.org>,
"Paul E . McKenney" <paulmck@kernel.org>
Subject: [PATCH v10 8/9] platform/chrome: Protect cros_ec_device lifecycle with revocable
Date: Fri, 8 May 2026 18:54:47 +0800 [thread overview]
Message-ID: <20260508105448.31799-9-tzungbi@kernel.org> (raw)
In-Reply-To: <20260508105448.31799-1-tzungbi@kernel.org>
The cros_ec_device can be unregistered when the underlying device is
removed. Other kernel drivers that interact with the EC may hold a
pointer to the cros_ec_device, creating a risk of a use-after-free
error if the EC device is removed while still being referenced.
To prevent this, leverage the revocable and convert the underlying
device drivers to resource providers of cros_ec_device.
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
---
v10:
- No changes.
v9: https://lore.kernel.org/all/20260427135841.96266-9-tzungbi@kernel.org
- New to the series.
- Change revocable API usages accordingly.
- Rename "revocable_provider" -> "its_rev".
v5 - v8:
- Doesn't exist.
v4: https://lore.kernel.org/all/20250923075302.591026-5-tzungbi@kernel.org
- No changes.
v3: https://lore.kernel.org/all/20250912081718.3827390-5-tzungbi@kernel.org
- Initialize the revocable provider in cros_ec_device_alloc() instead of
spreading in protocol device drivers.
v2: https://lore.kernel.org/all/20250820081645.847919-5-tzungbi@kernel.org
- Rename "ref_proxy" -> "revocable".
v1: https://lore.kernel.org/all/20250814091020.1302888-3-tzungbi@kernel.org
---
drivers/platform/chrome/cros_ec.c | 11 +++++++++++
include/linux/platform_data/cros_ec_proto.h | 3 +++
2 files changed, 14 insertions(+)
diff --git a/drivers/platform/chrome/cros_ec.c b/drivers/platform/chrome/cros_ec.c
index 1da79e3d215b..2702a1bbfeb5 100644
--- a/drivers/platform/chrome/cros_ec.c
+++ b/drivers/platform/chrome/cros_ec.c
@@ -16,6 +16,7 @@
#include <linux/platform_device.h>
#include <linux/platform_data/cros_ec_commands.h>
#include <linux/platform_data/cros_ec_proto.h>
+#include <linux/revocable.h>
#include <linux/slab.h>
#include <linux/suspend.h>
@@ -37,6 +38,7 @@ static void cros_ec_device_free(void *data)
mutex_destroy(&ec_dev->lock);
lockdep_unregister_key(&ec_dev->lockdep_key);
+ revocable_revoke(ec_dev->its_rev);
}
struct cros_ec_device *cros_ec_device_alloc(struct device *dev)
@@ -47,6 +49,15 @@ struct cros_ec_device *cros_ec_device_alloc(struct device *dev)
if (!ec_dev)
return NULL;
+ ec_dev->its_rev = revocable_alloc(ec_dev);
+ if (!ec_dev->its_rev)
+ return NULL;
+ /*
+ * Drop the extra reference for the caller as the caller is the
+ * resource provider.
+ */
+ revocable_put(ec_dev->its_rev);
+
ec_dev->din_size = sizeof(struct ec_host_response) +
sizeof(struct ec_response_get_protocol_info) +
EC_MAX_RESPONSE_OVERHEAD;
diff --git a/include/linux/platform_data/cros_ec_proto.h b/include/linux/platform_data/cros_ec_proto.h
index de14923720a5..e8c3bd03403c 100644
--- a/include/linux/platform_data/cros_ec_proto.h
+++ b/include/linux/platform_data/cros_ec_proto.h
@@ -12,6 +12,7 @@
#include <linux/lockdep_types.h>
#include <linux/mutex.h>
#include <linux/notifier.h>
+#include <linux/revocable.h>
#include <linux/platform_data/cros_ec_commands.h>
@@ -165,6 +166,7 @@ struct cros_ec_command {
* @pd: The platform_device used by the mfd driver to interface with the
* PD behind an EC.
* @panic_notifier: EC panic notifier.
+ * @its_rev: The revocable_provider to this device.
*/
struct cros_ec_device {
/* These are used by other drivers that want to talk to the EC */
@@ -211,6 +213,7 @@ struct cros_ec_device {
struct platform_device *pd;
struct blocking_notifier_head panic_notifier;
+ struct revocable *its_rev;
};
/**
--
2.51.0
next prev parent reply other threads:[~2026-05-08 10:55 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-08 10:54 [PATCH v10 0/9] drivers/base: Introduce revocable Tzung-Bi Shih
2026-05-08 10:54 ` [PATCH v10 1/9] revocable: Revocable resource management Tzung-Bi Shih
2026-05-11 13:16 ` Bartosz Golaszewski
2026-05-12 8:12 ` Tzung-Bi Shih
2026-05-08 10:54 ` [PATCH v10 2/9] revocable: Add KUnit test cases Tzung-Bi Shih
2026-05-11 13:10 ` Bartosz Golaszewski
2026-05-12 8:12 ` Tzung-Bi Shih
2026-05-08 10:54 ` [PATCH v10 3/9] gpio: Add revocable provider handle for struct gpio_chip Tzung-Bi Shih
2026-05-08 10:54 ` [PATCH v10 4/9] gpio: cdev: Leverage revocable for accessing " Tzung-Bi Shih
2026-05-08 10:54 ` [PATCH v10 5/9] gpio: Remove gpio_chip_guard by using revocable Tzung-Bi Shih
2026-05-08 10:54 ` [PATCH v10 6/9] gpio: Leverage revocable for accessing struct gpio_chip Tzung-Bi Shih
2026-05-08 10:54 ` [PATCH v10 7/9] gpio: Remove unused `chip` and `srcu` in struct gpio_device Tzung-Bi Shih
2026-05-11 13:18 ` Bartosz Golaszewski
2026-05-12 8:13 ` Tzung-Bi Shih
2026-05-12 10:41 ` Bartosz Golaszewski
2026-05-08 10:54 ` Tzung-Bi Shih [this message]
2026-05-08 11:53 ` [PATCH v10 8/9] platform/chrome: Protect cros_ec_device lifecycle with revocable Jason Gunthorpe
2026-05-11 13:19 ` Bartosz Golaszewski
2026-05-12 8:36 ` Laurent Pinchart
2026-05-14 3:33 ` Tzung-Bi Shih
2026-05-14 16:02 ` Jason Gunthorpe
2026-05-15 8:28 ` Tzung-Bi Shih
2026-05-08 10:54 ` [PATCH v10 9/9] platform/chrome: cros_ec_chardev: Consume cros_ec_device via revocable Tzung-Bi Shih
2026-05-11 13:17 ` [PATCH v10 0/9] drivers/base: Introduce revocable Bartosz Golaszewski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260508105448.31799-9-tzungbi@kernel.org \
--to=tzungbi@kernel.org \
--cc=arnd@arndb.de \
--cc=bleung@chromium.org \
--cc=brgl@kernel.org \
--cc=chrome-platform@lists.linux.dev \
--cc=corbet@lwn.net \
--cc=dakr@kernel.org \
--cc=driver-core@lists.linux.dev \
--cc=gregkh@linuxfoundation.org \
--cc=jgg@nvidia.com \
--cc=johan@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linusw@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=paulmck@kernel.org \
--cc=rafael@kernel.org \
--cc=shuah@kernel.org \
--cc=wsa+renesas@sang-engineering.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.