* [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers
@ 2026-08-26 9:19 Greg Kroah-Hartman
2026-08-26 9:19 ` [PATCH 1/2] module: pull out add_taint_module() to be public Greg Kroah-Hartman
` (2 more replies)
0 siblings, 3 replies; 20+ messages in thread
From: Greg Kroah-Hartman @ 2026-08-26 9:19 UTC (permalink / raw)
To: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen,
Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap,
Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt,
Masami Hiramatsu, Mathieu Desnoyers
Cc: linux-modules, linux-kernel, linux-doc, linux-usb, driver-core,
linux-trace-kernel, Greg Kroah-Hartman
The ability to add and remove devices from a driver through the sysfs
"bind" and "unbind" files was created all those decades ago as a way
that kernel developers can iterate faster, and provide a debugging way
for users to attempt to add a new device to a driver without having to
rebuild their kernel.
This api over the years has been abused and recently come under a major
fuzzing "attack" through tools like syzbot which decided that it would
attempt to just randomly bind any driver to any type of device, causing
loads of unneeded errors and pointless kernel patches to be generated by
unsuspecting new developers.
Handle all of this by adding a new taint flag, TAINT_FORCED_BIND, which
will be set on the driver if the bind/unbind sysfs files are ever
successfully written to. This lets kernel developers "know" that a user
is attempting to do something that is not normal, and as such, if the
kernel breaks they get to keep the shiny pieces laying around on the
floor.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
Greg Kroah-Hartman (2):
module: pull out add_taint_module() to be public
driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers
Documentation/admin-guide/tainted-kernels.rst | 52 ++++++++++++++-------------
drivers/base/bus.c | 3 ++
include/linux/module.h | 8 +++++
include/linux/panic.h | 3 +-
include/trace/events/module.h | 3 +-
kernel/module/main.c | 13 +++++--
kernel/panic.c | 5 +--
tools/debugging/kernel-chktaint | 8 +++++
8 files changed, 65 insertions(+), 30 deletions(-)
---
base-commit: 45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229
change-id: 20260825-bind_taint-d4077b870bc4
Best regards,
--
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
^ permalink raw reply [flat|nested] 20+ messages in thread* [PATCH 1/2] module: pull out add_taint_module() to be public 2026-08-26 9:19 [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman @ 2026-08-26 9:19 ` Greg Kroah-Hartman 2026-08-26 10:29 ` sashiko-bot ` (2 more replies) 2026-08-26 9:19 ` [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman 2026-08-26 13:33 ` [PATCH 0/2] " Michal Pecio 2 siblings, 3 replies; 20+ messages in thread From: Greg Kroah-Hartman @ 2026-08-26 9:19 UTC (permalink / raw) To: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers Cc: linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel, Greg Kroah-Hartman Other kernel code might want to call add_taint_module() so pull it out and make it global. If modules are not enabled, this defaults to a call to add_taint(), so all is fine. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- include/linux/module.h | 8 ++++++++ kernel/module/main.c | 13 +++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/include/linux/module.h b/include/linux/module.h index 96cc98568eea..25221539e645 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -29,6 +29,7 @@ #include <linux/srcu.h> #include <linux/static_call_types.h> #include <linux/dynamic_debug.h> +#include <linux/panic.h> #include <linux/percpu.h> #include <asm/module.h> @@ -770,6 +771,8 @@ static inline bool is_livepatch_module(struct module *mod) void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data); +void add_taint_module(struct module *mod, unsigned flag, enum lockdep_ok); + #else /* !CONFIG_MODULES... */ static inline struct module *__module_address(unsigned long addr) @@ -877,6 +880,11 @@ static inline bool module_is_coming(struct module *mod) static inline void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data) { } + +static inline void add_taint_module(struct module *mod, unsigned flag, enum lockdep_ok) +{ + add_taint(flag, lockdep_ok); +} #endif /* CONFIG_MODULES */ #ifdef CONFIG_SYSFS diff --git a/kernel/module/main.c b/kernel/module/main.c index d0e1e0bd2ad0..99cedb961898 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -191,8 +191,17 @@ static inline int strong_try_module_get(struct module *mod) return -ENOENT; } -static inline void add_taint_module(struct module *mod, unsigned flag, - enum lockdep_ok lockdep_ok) +/** + * add_taint_module: add a taint flag if not already set for a specific module + * @mod: pointer to the module that caused the problem + * @flag: one of the TAINT_* constants. + * @lockdep_ok: whether lock debugging is still OK. + * + * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for + * some noteworthy-but-not-corrupting cases, it can be set to true. + */ +void add_taint_module(struct module *mod, unsigned flag, + enum lockdep_ok lockdep_ok) { add_taint(flag, lockdep_ok); set_bit(flag, &mod->taints); -- 2.55.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] module: pull out add_taint_module() to be public 2026-08-26 9:19 ` [PATCH 1/2] module: pull out add_taint_module() to be public Greg Kroah-Hartman @ 2026-08-26 10:29 ` sashiko-bot 2026-08-26 10:39 ` Greg Kroah-Hartman 2026-08-26 11:13 ` Aaron Tomlin 2026-08-27 13:36 ` Johan Hovold 2 siblings, 1 reply; 20+ messages in thread From: sashiko-bot @ 2026-08-26 10:29 UTC (permalink / raw) To: Greg Kroah-Hartman; +Cc: linux-trace-kernel, linux-modules Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: - [High] Potential NULL pointer dereference in `add_taint_module` if called by built-in code passing `THIS_MODULE`. - [Low] Syntax error in the `!CONFIG_MODULES` stub for `add_taint_module` causes an unconditional build failure due to an undeclared identifier. -- commit 371e790be5ebdf80163e6326d6a8f79c05f469bb Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org> module: pull out add_taint_module() to be public This commit makes add_taint_module() public so other kernel code can call it. It also provides a fallback stub that simply calls add_taint() when modules are not enabled. > diff --git a/include/linux/module.h b/include/linux/module.h > index 96cc98568eea5..25221539e6459 100644 > --- a/include/linux/module.h > +++ b/include/linux/module.h [ ... ] > @@ -877,6 +880,11 @@ static inline bool module_is_coming(struct module *mod) > static inline void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data) > { > } > + > +static inline void add_taint_module(struct module *mod, unsigned flag, enum lockdep_ok) > +{ > + add_taint(flag, lockdep_ok); > +} [Severity: Low] Is this a build regression when CONFIG_MODULES is disabled? The third parameter in this stub specifies the type enum lockdep_ok but omits a variable name. The function body then passes lockdep_ok to add_taint(), which resolves to the enum tag rather than a local variable, causing the compiler to halt with an undeclared identifier error. > #endif /* CONFIG_MODULES */ > > #ifdef CONFIG_SYSFS > diff --git a/kernel/module/main.c b/kernel/module/main.c > index d0e1e0bd2ad06..99cedb9618988 100644 > --- a/kernel/module/main.c > +++ b/kernel/module/main.c [ ... ] > @@ -191,8 +191,17 @@ static inline int strong_try_module_get(struct module *mod) > return -ENOENT; > } > > -static inline void add_taint_module(struct module *mod, unsigned flag, > - enum lockdep_ok lockdep_ok) > +/** > + * add_taint_module: add a taint flag if not already set for a specific module > + * @mod: pointer to the module that caused the problem > + * @flag: one of the TAINT_* constants. > + * @lockdep_ok: whether lock debugging is still OK. > + * > + * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for > + * some noteworthy-but-not-corrupting cases, it can be set to true. > + */ > +void add_taint_module(struct module *mod, unsigned flag, > + enum lockdep_ok lockdep_ok) > { > add_taint(flag, lockdep_ok); > set_bit(flag, &mod->taints); [Severity: High] Is this a regression that could unconditionally dereference a NULL pointer? If built-in code calls this function (for example, passing THIS_MODULE which evaluates to NULL for built-in modules), mod->taints will be accessed without a standard if (mod) safeguard. This could lead to a fatal page fault if, for instance, a local root user writes to a built-in driver's bind or unbind sysfs file which then calls add_taint_module(drv->owner, ...). -- Sashiko AI review · https://sashiko.dev/#/patchset/20260826-bind_taint-v1-0-52b05f4a965c@linuxfoundation.org?part=1 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] module: pull out add_taint_module() to be public 2026-08-26 10:29 ` sashiko-bot @ 2026-08-26 10:39 ` Greg Kroah-Hartman 0 siblings, 0 replies; 20+ messages in thread From: Greg Kroah-Hartman @ 2026-08-26 10:39 UTC (permalink / raw) To: sashiko-reviews; +Cc: linux-trace-kernel, linux-modules On Wed, Aug 26, 2026 at 10:29:20AM +0000, sashiko-bot@kernel.org wrote: > Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: > - [High] Potential NULL pointer dereference in `add_taint_module` if called by built-in code passing `THIS_MODULE`. > - [Low] Syntax error in the `!CONFIG_MODULES` stub for `add_taint_module` causes an unconditional build failure due to an undeclared identifier. > -- > > commit 371e790be5ebdf80163e6326d6a8f79c05f469bb > Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > module: pull out add_taint_module() to be public > > This commit makes add_taint_module() public so other kernel code can call it. > It also provides a fallback stub that simply calls add_taint() when modules > are not enabled. > > > diff --git a/include/linux/module.h b/include/linux/module.h > > index 96cc98568eea5..25221539e6459 100644 > > --- a/include/linux/module.h > > +++ b/include/linux/module.h > [ ... ] > > @@ -877,6 +880,11 @@ static inline bool module_is_coming(struct module *mod) > > static inline void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data) > > { > > } > > + > > +static inline void add_taint_module(struct module *mod, unsigned flag, enum lockdep_ok) > > +{ > > + add_taint(flag, lockdep_ok); > > +} > > [Severity: Low] > Is this a build regression when CONFIG_MODULES is disabled? > > The third parameter in this stub specifies the type enum lockdep_ok but omits > a variable name. The function body then passes lockdep_ok to add_taint(), > which resolves to the enum tag rather than a local variable, causing the > compiler to halt with an undeclared identifier error. Ah, missed this, will do a v2 with this fixed, my bad. > > #endif /* CONFIG_MODULES */ > > > > #ifdef CONFIG_SYSFS > > diff --git a/kernel/module/main.c b/kernel/module/main.c > > index d0e1e0bd2ad06..99cedb9618988 100644 > > --- a/kernel/module/main.c > > +++ b/kernel/module/main.c > [ ... ] > > @@ -191,8 +191,17 @@ static inline int strong_try_module_get(struct module *mod) > > return -ENOENT; > > } > > > > -static inline void add_taint_module(struct module *mod, unsigned flag, > > - enum lockdep_ok lockdep_ok) > > +/** > > + * add_taint_module: add a taint flag if not already set for a specific module > > + * @mod: pointer to the module that caused the problem > > + * @flag: one of the TAINT_* constants. > > + * @lockdep_ok: whether lock debugging is still OK. > > + * > > + * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for > > + * some noteworthy-but-not-corrupting cases, it can be set to true. > > + */ > > +void add_taint_module(struct module *mod, unsigned flag, > > + enum lockdep_ok lockdep_ok) > > { > > add_taint(flag, lockdep_ok); > > set_bit(flag, &mod->taints); > > [Severity: High] > Is this a regression that could unconditionally dereference a NULL pointer? > > If built-in code calls this function (for example, passing THIS_MODULE which > evaluates to NULL for built-in modules), mod->taints will be accessed without > a standard if (mod) safeguard. > > This could lead to a fatal page fault if, for instance, a local root user > writes to a built-in driver's bind or unbind sysfs file which then calls > add_taint_module(drv->owner, ...). Oops, missed this one too, I only tested this with a module, not a built-in driver. Will fix it up for v2. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] module: pull out add_taint_module() to be public 2026-08-26 9:19 ` [PATCH 1/2] module: pull out add_taint_module() to be public Greg Kroah-Hartman 2026-08-26 10:29 ` sashiko-bot @ 2026-08-26 11:13 ` Aaron Tomlin 2026-08-26 11:54 ` Greg Kroah-Hartman 2026-08-27 13:36 ` Johan Hovold 2 siblings, 1 reply; 20+ messages in thread From: Aaron Tomlin @ 2026-08-26 11:13 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Wed, Aug 26, 2026 at 11:19:32AM +0200, Greg Kroah-Hartman wrote: > Other kernel code might want to call add_taint_module() so pull it out > and make it global. If modules are not enabled, this defaults to a call > to add_taint(), so all is fine. > > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > --- > include/linux/module.h | 8 ++++++++ > kernel/module/main.c | 13 +++++++++++-- > 2 files changed, 19 insertions(+), 2 deletions(-) > > diff --git a/include/linux/module.h b/include/linux/module.h > index 96cc98568eea..25221539e645 100644 > --- a/include/linux/module.h > +++ b/include/linux/module.h > @@ -29,6 +29,7 @@ > #include <linux/srcu.h> > #include <linux/static_call_types.h> > #include <linux/dynamic_debug.h> > +#include <linux/panic.h> > > #include <linux/percpu.h> > #include <asm/module.h> > @@ -770,6 +771,8 @@ static inline bool is_livepatch_module(struct module *mod) > > void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data); > > +void add_taint_module(struct module *mod, unsigned flag, enum lockdep_ok); > + > #else /* !CONFIG_MODULES... */ > > static inline struct module *__module_address(unsigned long addr) > @@ -877,6 +880,11 @@ static inline bool module_is_coming(struct module *mod) > static inline void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data) > { > } > + > +static inline void add_taint_module(struct module *mod, unsigned flag, enum lockdep_ok) > +{ > + add_taint(flag, lockdep_ok); > +} > #endif /* CONFIG_MODULES */ > > #ifdef CONFIG_SYSFS > diff --git a/kernel/module/main.c b/kernel/module/main.c > index d0e1e0bd2ad0..99cedb961898 100644 > --- a/kernel/module/main.c > +++ b/kernel/module/main.c > @@ -191,8 +191,17 @@ static inline int strong_try_module_get(struct module *mod) > return -ENOENT; > } > > -static inline void add_taint_module(struct module *mod, unsigned flag, > - enum lockdep_ok lockdep_ok) > +/** > + * add_taint_module: add a taint flag if not already set for a specific module > + * @mod: pointer to the module that caused the problem > + * @flag: one of the TAINT_* constants. > + * @lockdep_ok: whether lock debugging is still OK. > + * > + * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for > + * some noteworthy-but-not-corrupting cases, it can be set to true. > + */ > +void add_taint_module(struct module *mod, unsigned flag, > + enum lockdep_ok lockdep_ok) > { > add_taint(flag, lockdep_ok); > set_bit(flag, &mod->taints); > > -- > 2.55.0 > Hi Greg, I believe Sashiko [1] found a few valid concerns. [1]: https://sashiko.dev/#/message/20260826102921.5B81B1F000E9%40smtp.kernel.org Kind regards, -- Aaron Tomlin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] module: pull out add_taint_module() to be public 2026-08-26 11:13 ` Aaron Tomlin @ 2026-08-26 11:54 ` Greg Kroah-Hartman 0 siblings, 0 replies; 20+ messages in thread From: Greg Kroah-Hartman @ 2026-08-26 11:54 UTC (permalink / raw) To: Aaron Tomlin Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Wed, Aug 26, 2026 at 07:13:36AM -0400, Aaron Tomlin wrote: > On Wed, Aug 26, 2026 at 11:19:32AM +0200, Greg Kroah-Hartman wrote: > > Other kernel code might want to call add_taint_module() so pull it out > > and make it global. If modules are not enabled, this defaults to a call > > to add_taint(), so all is fine. > > > > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > --- > > include/linux/module.h | 8 ++++++++ > > kernel/module/main.c | 13 +++++++++++-- > > 2 files changed, 19 insertions(+), 2 deletions(-) > > > > diff --git a/include/linux/module.h b/include/linux/module.h > > index 96cc98568eea..25221539e645 100644 > > --- a/include/linux/module.h > > +++ b/include/linux/module.h > > @@ -29,6 +29,7 @@ > > #include <linux/srcu.h> > > #include <linux/static_call_types.h> > > #include <linux/dynamic_debug.h> > > +#include <linux/panic.h> > > > > #include <linux/percpu.h> > > #include <asm/module.h> > > @@ -770,6 +771,8 @@ static inline bool is_livepatch_module(struct module *mod) > > > > void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data); > > > > +void add_taint_module(struct module *mod, unsigned flag, enum lockdep_ok); > > + > > #else /* !CONFIG_MODULES... */ > > > > static inline struct module *__module_address(unsigned long addr) > > @@ -877,6 +880,11 @@ static inline bool module_is_coming(struct module *mod) > > static inline void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data) > > { > > } > > + > > +static inline void add_taint_module(struct module *mod, unsigned flag, enum lockdep_ok) > > +{ > > + add_taint(flag, lockdep_ok); > > +} > > #endif /* CONFIG_MODULES */ > > > > #ifdef CONFIG_SYSFS > > diff --git a/kernel/module/main.c b/kernel/module/main.c > > index d0e1e0bd2ad0..99cedb961898 100644 > > --- a/kernel/module/main.c > > +++ b/kernel/module/main.c > > @@ -191,8 +191,17 @@ static inline int strong_try_module_get(struct module *mod) > > return -ENOENT; > > } > > > > -static inline void add_taint_module(struct module *mod, unsigned flag, > > - enum lockdep_ok lockdep_ok) > > +/** > > + * add_taint_module: add a taint flag if not already set for a specific module > > + * @mod: pointer to the module that caused the problem > > + * @flag: one of the TAINT_* constants. > > + * @lockdep_ok: whether lock debugging is still OK. > > + * > > + * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for > > + * some noteworthy-but-not-corrupting cases, it can be set to true. > > + */ > > +void add_taint_module(struct module *mod, unsigned flag, > > + enum lockdep_ok lockdep_ok) > > { > > add_taint(flag, lockdep_ok); > > set_bit(flag, &mod->taints); > > > > -- > > 2.55.0 > > > > Hi Greg, > > I believe Sashiko [1] found a few valid concerns. > > [1]: https://sashiko.dev/#/message/20260826102921.5B81B1F000E9%40smtp.kernel.org > Yes it did, will fix that up for v2. thanks, greg k-h ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] module: pull out add_taint_module() to be public 2026-08-26 9:19 ` [PATCH 1/2] module: pull out add_taint_module() to be public Greg Kroah-Hartman 2026-08-26 10:29 ` sashiko-bot 2026-08-26 11:13 ` Aaron Tomlin @ 2026-08-27 13:36 ` Johan Hovold 2026-08-27 14:30 ` Greg Kroah-Hartman 2 siblings, 1 reply; 20+ messages in thread From: Johan Hovold @ 2026-08-27 13:36 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Wed, Aug 26, 2026 at 11:19:32AM +0200, Greg Kroah-Hartman wrote: > Other kernel code might want to call add_taint_module() so pull it out > and make it global. If modules are not enabled, this defaults to a call > to add_taint(), so all is fine. > > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > -static inline void add_taint_module(struct module *mod, unsigned flag, > - enum lockdep_ok lockdep_ok) > +/** > + * add_taint_module: add a taint flag if not already set for a specific module > + * @mod: pointer to the module that caused the problem > + * @flag: one of the TAINT_* constants. > + * @lockdep_ok: whether lock debugging is still OK. > + * > + * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for > + * some noteworthy-but-not-corrupting cases, it can be set to true. > + */ > +void add_taint_module(struct module *mod, unsigned flag, > + enum lockdep_ok lockdep_ok) > { > add_taint(flag, lockdep_ok); > set_bit(flag, &mod->taints); As has been pointed out, this crashes with built-in drivers. If you go with a simple mod NULL check before this call (and updated kernel-doc) you can add my: Reviewed-by: Johan Hovold <johan@kernel.org> Tested-by: Johan Hovold <johan@kernel.org> Johan ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] module: pull out add_taint_module() to be public 2026-08-27 13:36 ` Johan Hovold @ 2026-08-27 14:30 ` Greg Kroah-Hartman 0 siblings, 0 replies; 20+ messages in thread From: Greg Kroah-Hartman @ 2026-08-27 14:30 UTC (permalink / raw) To: Johan Hovold Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Thu, Aug 27, 2026 at 03:36:41PM +0200, Johan Hovold wrote: > On Wed, Aug 26, 2026 at 11:19:32AM +0200, Greg Kroah-Hartman wrote: > > Other kernel code might want to call add_taint_module() so pull it out > > and make it global. If modules are not enabled, this defaults to a call > > to add_taint(), so all is fine. > > > > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > > -static inline void add_taint_module(struct module *mod, unsigned flag, > > - enum lockdep_ok lockdep_ok) > > +/** > > + * add_taint_module: add a taint flag if not already set for a specific module > > + * @mod: pointer to the module that caused the problem > > + * @flag: one of the TAINT_* constants. > > + * @lockdep_ok: whether lock debugging is still OK. > > + * > > + * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for > > + * some noteworthy-but-not-corrupting cases, it can be set to true. > > + */ > > +void add_taint_module(struct module *mod, unsigned flag, > > + enum lockdep_ok lockdep_ok) > > { > > add_taint(flag, lockdep_ok); > > > set_bit(flag, &mod->taints); > > As has been pointed out, this crashes with built-in drivers. If you go > with a simple mod NULL check before this call (and updated kernel-doc) > you can add my: Yeah, I've fixed this locally and will be resolved in v2. > Reviewed-by: Johan Hovold <johan@kernel.org> > Tested-by: Johan Hovold <johan@kernel.org> Thanks! ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 9:19 [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman 2026-08-26 9:19 ` [PATCH 1/2] module: pull out add_taint_module() to be public Greg Kroah-Hartman @ 2026-08-26 9:19 ` Greg Kroah-Hartman 2026-08-26 10:34 ` sashiko-bot ` (2 more replies) 2026-08-26 13:33 ` [PATCH 0/2] " Michal Pecio 2 siblings, 3 replies; 20+ messages in thread From: Greg Kroah-Hartman @ 2026-08-26 9:19 UTC (permalink / raw) To: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers Cc: linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel, Greg Kroah-Hartman The ability to add and remove devices from a driver through the sysfs "bind" and "unbind" files was created all those decades ago as a way that kernel developers can iterate faster, and provide a debugging way for users to attempt to add a new device to a driver without having to rebuild their kernel. This api over the years has been abused and recently come under a major fuzzing "attack" through tools like syzbot which decided that it would attempt to just randomly bind any driver to any type of device, causing loads of unneeded errors and pointless kernel patches to be generated by unsuspecting new developers. Handle all of this by adding a new taint flag, TAINT_FORCED_BIND, which will be set on the driver if the bind/unbind sysfs files are ever successfully written to. This lets kernel developers "know" that a user is attempting to do something that is not normal, and as such, if the kernel breaks they get to keep the shiny pieces laying around on the floor. Note, the taint flag gets set _BEFORE_ the bind/unbind callback happens, as many times crashes/oops/warnings/failures happen within the callback, and the taint flag needs to be there to show what was being attempted. If it were to be set after the callback happens, the oops report would not properly reflect what foolishness was being attempted. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- Documentation/admin-guide/tainted-kernels.rst | 52 ++++++++++++++------------- drivers/base/bus.c | 3 ++ include/linux/panic.h | 3 +- include/trace/events/module.h | 3 +- kernel/panic.c | 5 +-- tools/debugging/kernel-chktaint | 8 +++++ 6 files changed, 46 insertions(+), 28 deletions(-) diff --git a/Documentation/admin-guide/tainted-kernels.rst b/Documentation/admin-guide/tainted-kernels.rst index 9ead927a37c0..d4ca8b9e3819 100644 --- a/Documentation/admin-guide/tainted-kernels.rst +++ b/Documentation/admin-guide/tainted-kernels.rst @@ -79,30 +79,31 @@ which bits are set:: Table for decoding tainted state ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -=== === ====== ======================================================== -Bit Log Number Reason that got the kernel tainted -=== === ====== ======================================================== - 0 G/P 1 proprietary module was loaded - 1 _/F 2 module was force loaded - 2 _/S 4 kernel running on an out of specification system - 3 _/R 8 module was force unloaded - 4 _/M 16 processor reported a Machine Check Exception (MCE) - 5 _/B 32 bad page referenced or some unexpected page flags - 6 _/U 64 taint requested by userspace application - 7 _/D 128 kernel died recently, i.e. there was an OOPS or BUG - 8 _/A 256 ACPI table overridden by user - 9 _/W 512 kernel issued warning - 10 _/C 1024 staging driver was loaded - 11 _/I 2048 workaround for bug in platform firmware applied - 12 _/O 4096 externally-built ("out-of-tree") module was loaded - 13 _/E 8192 unsigned module was loaded - 14 _/L 16384 soft lockup occurred - 15 _/K 32768 kernel has been live patched - 16 _/X 65536 auxiliary taint, defined for and used by distros - 17 _/T 131072 kernel was built with the struct randomization plugin - 18 _/N 262144 an in-kernel test has been run - 19 _/J 524288 userspace used a mutating debug operation in fwctl -=== === ====== ======================================================== +=== === ====== ======================================================== +Bit Log Number Reason that got the kernel tainted +=== === ====== ======================================================== + 0 G/P 1 proprietary module was loaded + 1 _/F 2 module was force loaded + 2 _/S 4 kernel running on an out of specification system + 3 _/R 8 module was force unloaded + 4 _/M 16 processor reported a Machine Check Exception (MCE) + 5 _/B 32 bad page referenced or some unexpected page flags + 6 _/U 64 taint requested by userspace application + 7 _/D 128 kernel died recently, i.e. there was an OOPS or BUG + 8 _/A 256 ACPI table overridden by user + 9 _/W 512 kernel issued warning + 10 _/C 1024 staging driver was loaded + 11 _/I 2048 workaround for bug in platform firmware applied + 12 _/O 4096 externally-built ("out-of-tree") module was loaded + 13 _/E 8192 unsigned module was loaded + 14 _/L 16384 soft lockup occurred + 15 _/K 32768 kernel has been live patched + 16 _/X 65536 auxiliary taint, defined for and used by distros + 17 _/T 131072 kernel was built with the struct randomization plugin + 18 _/N 262144 an in-kernel test has been run + 19 _/J 524288 userspace used a mutating debug operation in fwctl + 20 _/Y 1048576 device was manually bound or unbound from a driver +=== === ======= ======================================================== Note: The character ``_`` is representing a blank in this table to make reading easier. @@ -189,3 +190,6 @@ More detailed explanation for tainting 19) ``J`` if userspace opened /dev/fwctl/* and performed a FWTCL_RPC_DEBUG_WRITE to use the devices debugging features. Device debugging features could cause the device to malfunction in undefined ways. + + 20) ``Y`` If userspace wrote to the `bind` or `unbind` sysfs files and + successfully bound or removed a device from a driver. diff --git a/drivers/base/bus.c b/drivers/base/bus.c index d17bd91490ee..c51ad96d4de4 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -19,6 +19,7 @@ #include <linux/string.h> #include <linux/mutex.h> #include <linux/sysfs.h> +#include <linux/panic.h> #include "base.h" #include "power/power.h" @@ -241,6 +242,7 @@ static ssize_t unbind_store(struct device_driver *drv, const char *buf, dev = bus_find_device_by_name(bus, NULL, buf); if (dev && dev->driver == drv) { + add_taint_module(drv->owner, TAINT_FORCED_BIND, LOCKDEP_STILL_OK); device_driver_detach(dev); err = count; } @@ -264,6 +266,7 @@ static ssize_t bind_store(struct device_driver *drv, const char *buf, dev = bus_find_device_by_name(bus, NULL, buf); if (dev && driver_match_device(drv, dev)) { + add_taint_module(drv->owner, TAINT_FORCED_BIND, LOCKDEP_STILL_OK); err = device_driver_attach(drv, dev); if (!err) { /* success */ diff --git a/include/linux/panic.h b/include/linux/panic.h index f1dd417e54b2..8e7250b0e913 100644 --- a/include/linux/panic.h +++ b/include/linux/panic.h @@ -88,7 +88,8 @@ static inline void set_arch_panic_timeout(int timeout, int arch_default_timeout) #define TAINT_RANDSTRUCT 17 #define TAINT_TEST 18 #define TAINT_FWCTL 19 -#define TAINT_FLAGS_COUNT 20 +#define TAINT_FORCED_BIND 20 +#define TAINT_FLAGS_COUNT 21 #define TAINT_FLAGS_MAX ((1UL << TAINT_FLAGS_COUNT) - 1) struct taint_flag { diff --git a/include/trace/events/module.h b/include/trace/events/module.h index e5a006be9dc6..19df3e39bba4 100644 --- a/include/trace/events/module.h +++ b/include/trace/events/module.h @@ -26,7 +26,8 @@ struct module; { (1UL << TAINT_OOT_MODULE), "O" }, \ { (1UL << TAINT_FORCED_MODULE), "F" }, \ { (1UL << TAINT_CRAP), "C" }, \ - { (1UL << TAINT_UNSIGNED_MODULE), "E" }) + { (1UL << TAINT_UNSIGNED_MODULE), "E" }, \ + { (1UL << TAINT_FORCED_BIND), "Y" }) TRACE_EVENT(module_load, diff --git a/kernel/panic.c b/kernel/panic.c index 213725b612aa..6bf60f9dd120 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -826,6 +826,7 @@ const struct taint_flag taint_flags[TAINT_FLAGS_COUNT] = { TAINT_FLAG(RANDSTRUCT, 'T', ' '), TAINT_FLAG(TEST, 'N', ' '), TAINT_FLAG(FWCTL, 'J', ' '), + TAINT_FLAG(FORCED_BIND, 'Y', ' '), }; #undef TAINT_FLAG @@ -862,9 +863,9 @@ static void print_tainted_seq(struct seq_buf *s, bool verbose) * exact size is allocated dynamically; the initial buffer remains * as a fallback if allocation fails. * - * The verbose taint string currently requires up to 327 characters. + * The verbose taint string currently requires up to 344 characters. */ -#define INIT_TAINT_BUF_MAX 350 +#define INIT_TAINT_BUF_MAX 370 static char init_taint_buf[INIT_TAINT_BUF_MAX] __initdata; static char *taint_buf __refdata = init_taint_buf; diff --git a/tools/debugging/kernel-chktaint b/tools/debugging/kernel-chktaint index e1571c04afb5..d8628be37214 100755 --- a/tools/debugging/kernel-chktaint +++ b/tools/debugging/kernel-chktaint @@ -211,6 +211,14 @@ else addout "J" echo " * fwctl's mutating debug interface was used (#19)" fi + +T=`expr $T / 2` +if [ `expr $T % 2` -eq 0 ]; then + addout " " +else + addout "Y" + echo " * device was manually bound or unbound from a driver (#20)" +fi echo "Raw taint value as int/string: $taint/'$out'" # report on any tainted loadable modules -- 2.55.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 9:19 ` [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman @ 2026-08-26 10:34 ` sashiko-bot 2026-08-26 11:58 ` Bradley Morgan 2026-08-27 13:33 ` Johan Hovold 2 siblings, 0 replies; 20+ messages in thread From: sashiko-bot @ 2026-08-26 10:34 UTC (permalink / raw) To: Greg Kroah-Hartman; +Cc: linux-modules, linux-trace-kernel Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider: New issues: - [High] Calling `add_taint_module()` unconditionally dereferences `drv->owner`, causing a kernel panic for built-in drivers where `drv->owner` is `NULL`. - [Low] The patch breaks the build when `CONFIG_MODULES` is disabled due to a syntactically invalid inline stub for `add_taint_module` introduced in the previous patch. - [Low] Malformed reStructuredText simple table and outdated `seq 20` script in the tainted-kernels documentation. Pre-existing issues: - [High] A race condition in `unbind_store` allows detaching an unintended driver if `dev->driver` changes concurrently. -- commit 4cfb386dac8b53407ce0309b005475cf263546f7 Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org> driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Add a new TAINT_FORCED_BIND taint flag to track when userspace successfully adds or removes devices from a driver via the sysfs bind and unbind files. This helps identify when userspace fuzzing or manual interference causes subsequent kernel crashes. > diff --git a/Documentation/admin-guide/tainted-kernels.rst b/Documentation/admin-guide/tainted-kernels.rst > index 9ead927a37c0f..d4ca8b9e3819e 100644 > --- a/Documentation/admin-guide/tainted-kernels.rst > +++ b/Documentation/admin-guide/tainted-kernels.rst > @@ -79,30 +79,31 @@ which bits are set:: > Table for decoding tainted state > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > -=== === ====== ======================================================== > -Bit Log Number Reason that got the kernel tainted > -=== === ====== ======================================================== > +=== === ====== ======================================================== > +Bit Log Number Reason that got the kernel tainted > +=== === ====== ======================================================== [ ... ] > + 19 _/J 524288 userspace used a mutating debug operation in fwctl > + 20 _/Y 1048576 device was manually bound or unbound from a driver > +=== === ======= ======================================================== [Severity: Low] The header separator for the Number column is 6 characters wide, but the footer separator is 7 characters wide. Can this mismatch break Sphinx reStructuredText table parsing? Also, does the quick-check script just above this table need to be updated? It uses seq 20, which fails to cover this newly added 20th taint bit (requires seq 21). > diff --git a/drivers/base/bus.c b/drivers/base/bus.c > index d17bd91490ee4..c51ad96d4de4b 100644 > --- a/drivers/base/bus.c > +++ b/drivers/base/bus.c [ ... ] > @@ -241,6 +242,7 @@ static ssize_t unbind_store(struct device_driver *drv, const char *buf, > > dev = bus_find_device_by_name(bus, NULL, buf); > if (dev && dev->driver == drv) { [Severity: High] This is a pre-existing issue, but is there a race condition here? The check of dev->driver is performed without holding the device lock. If the driver is detached and a new driver attaches immediately after, could the subsequent call to device_driver_detach(dev) blindly detach the unintended new driver? > + add_taint_module(drv->owner, TAINT_FORCED_BIND, LOCKDEP_STILL_OK); [Severity: High] For built-in drivers, drv->owner is NULL. Does calling add_taint_module unconditionally dereference drv->owner, causing a kernel panic when a user writes to the unbind sysfs file for a statically compiled driver? [Severity: Low] Will this unconditional call cause a compilation error when CONFIG_MODULES=n? The inline stub for add_taint_module in include/linux/module.h omits the parameter name for enum lockdep_ok, making it syntactically invalid, which is activated by this new call. > device_driver_detach(dev); > err = count; > } > @@ -264,6 +266,7 @@ static ssize_t bind_store(struct device_driver *drv, const char *buf, > > dev = bus_find_device_by_name(bus, NULL, buf); > if (dev && driver_match_device(drv, dev)) { > + add_taint_module(drv->owner, TAINT_FORCED_BIND, LOCKDEP_STILL_OK); [Severity: High] Similarly, for built-in drivers where drv->owner is NULL, does this unconditionally dereference it and cause a kernel panic here as well? > err = device_driver_attach(drv, dev); > if (!err) { > /* success */ -- Sashiko AI review · https://sashiko.dev/#/patchset/20260826-bind_taint-v1-0-52b05f4a965c@linuxfoundation.org?part=2 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 9:19 ` [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman 2026-08-26 10:34 ` sashiko-bot @ 2026-08-26 11:58 ` Bradley Morgan 2026-08-26 13:10 ` Greg KH 2026-08-26 14:26 ` Steven Rostedt 2026-08-27 13:33 ` Johan Hovold 2 siblings, 2 replies; 20+ messages in thread From: Bradley Morgan @ 2026-08-26 11:58 UTC (permalink / raw) To: gregkh Cc: atomlin, corbet, da.gomez, dakr, driver-core, linux-doc, linux-kernel, linux-modules, linux-trace-kernel, linux-usb, mathieu.desnoyers, mcgrof, mhiramat, petr.pavlu, rafael, rdunlap, rostedt, samitolvanen, skhan On 26 August 2026 10:19:33 BST, Greg Kroah-Hartman <gregkh@linuxfoundation.org> wrote: >The ability to add and remove devices from a driver through the sysfs >"bind" and "unbind" files was created all those decades ago as a way >that kernel developers can iterate faster, and provide a debugging way >for users to attempt to add a new device to a driver without having to >rebuild their kernel. > >This api over the years has been abused and recently come under a major >fuzzing "attack" through tools like syzbot which decided that it would >attempt to just randomly bind any driver to any type of device, causing >loads of unneeded errors and pointless kernel patches to be generated by >unsuspecting new developers. > >Handle all of this by adding a new taint flag, TAINT_FORCED_BIND, which >will be set on the driver if the bind/unbind sysfs files are ever >successfully written to. This lets kernel developers "know" that a user >is attempting to do something that is not normal, and as such, if the >kernel breaks they get to keep the shiny pieces laying around on the >floor. > >Note, the taint flag gets set _BEFORE_ the bind/unbind callback happens, >as many times crashes/oops/warnings/failures happen within the callback, >and the taint flag needs to be there to show what was being attempted. >If it were to be set after the callback happens, the oops report would >not properly reflect what foolishness was being attempted. > sashiko found a couple valid concerns for 2/2 >Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >--- > Documentation/admin-guide/tainted-kernels.rst | 52 > ++++++++++++++------------- > drivers/base/bus.c | 3 ++ > include/linux/panic.h | 3 +- > include/trace/events/module.h | 3 +- > kernel/panic.c | 5 +-- > tools/debugging/kernel-chktaint | 8 +++++ > 6 files changed, 46 insertions(+), 28 deletions(-) > >diff --git a/Documentation/admin-guide/tainted-kernels.rst b/Documentation/admin-guide/tainted-kernels.rst >index 9ead927a37c0..d4ca8b9e3819 100644 >--- a/Documentation/admin-guide/tainted-kernels.rst >+++ b/Documentation/admin-guide/tainted-kernels.rst >@@ -79,30 +79,31 @@ which bits are set:: > Table for decoding tainted state > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > >-=== === ====== ======================================================== >-Bit Log Number Reason that got the kernel tainted >-=== === ====== ======================================================== >- 0 G/P 1 proprietary module was loaded >- 1 _/F 2 module was force loaded >- 2 _/S 4 kernel running on an out of specification system >- 3 _/R 8 module was force unloaded >- 4 _/M 16 processor reported a Machine Check Exception (MCE) >- 5 _/B 32 bad page referenced or some unexpected page flags >- 6 _/U 64 taint requested by userspace application >- 7 _/D 128 kernel died recently, i.e. there was an OOPS or BUG >- 8 _/A 256 ACPI table overridden by user >- 9 _/W 512 kernel issued warning >- 10 _/C 1024 staging driver was loaded >- 11 _/I 2048 workaround for bug in platform firmware applied >- 12 _/O 4096 externally-built ("out-of-tree") module was loaded >- 13 _/E 8192 unsigned module was loaded >- 14 _/L 16384 soft lockup occurred >- 15 _/K 32768 kernel has been live patched >- 16 _/X 65536 auxiliary taint, defined for and used by distros >- 17 _/T 131072 kernel was built with the struct randomization plugin >- 18 _/N 262144 an in-kernel test has been run >- 19 _/J 524288 userspace used a mutating debug operation in fwctl >-=== === ====== ======================================================== >+=== === ====== ======================================================== >+Bit Log Number Reason that got the kernel tainted >+=== === ====== ======================================================== >+ 0 G/P 1 proprietary module was loaded >+ 1 _/F 2 module was force loaded >+ 2 _/S 4 kernel running on an out of specification system >+ 3 _/R 8 module was force unloaded >+ 4 _/M 16 processor reported a Machine Check Exception (MCE) >+ 5 _/B 32 bad page referenced or some unexpected page flags >+ 6 _/U 64 taint requested by userspace application >+ 7 _/D 128 kernel died recently, i.e. there was an OOPS or BUG >+ 8 _/A 256 ACPI table overridden by user >+ 9 _/W 512 kernel issued warning >+ 10 _/C 1024 staging driver was loaded >+ 11 _/I 2048 workaround for bug in platform firmware applied >+ 12 _/O 4096 externally-built ("out-of-tree") module was loaded >+ 13 _/E 8192 unsigned module was loaded >+ 14 _/L 16384 soft lockup occurred >+ 15 _/K 32768 kernel has been live patched >+ 16 _/X 65536 auxiliary taint, defined for and used by distros >+ 17 _/T 131072 kernel was built with the struct randomization plugin >+ 18 _/N 262144 an in-kernel test has been run >+ 19 _/J 524288 userspace used a mutating debug operation in fwctl >+ 20 _/Y 1048576 device was manually bound or unbound from a driver >+=== === ======= ======================================================== > > Note: The character ``_`` is representing a blank in this table to make reading > easier. >@@ -189,3 +190,6 @@ More detailed explanation for tainting > 19) ``J`` if userspace opened /dev/fwctl/* and performed a FWTCL_RPC_DEBUG_WRITE > to use the devices debugging features. Device debugging features could > cause the device to malfunction in undefined ways. >+ >+ 20) ``Y`` If userspace wrote to the `bind` or `unbind` sysfs files and >+ successfully bound or removed a device from a driver. >diff --git a/drivers/base/bus.c b/drivers/base/bus.c >index d17bd91490ee..c51ad96d4de4 100644 >--- a/drivers/base/bus.c >+++ b/drivers/base/bus.c >@@ -19,6 +19,7 @@ > #include <linux/string.h> > #include <linux/mutex.h> > #include <linux/sysfs.h> >+#include <linux/panic.h> > #include "base.h" > #include "power/power.h" > >@@ -241,6 +242,7 @@ static ssize_t unbind_store(struct device_driver *drv, const char *buf, > > dev = bus_find_device_by_name(bus, NULL, buf); > if (dev && dev->driver == drv) { >+ add_taint_module(drv->owner, TAINT_FORCED_BIND, LOCKDEP_STILL_OK); > device_driver_detach(dev); > err = count; > } >@@ -264,6 +266,7 @@ static ssize_t bind_store(struct device_driver *drv, const char *buf, > > dev = bus_find_device_by_name(bus, NULL, buf); > if (dev && driver_match_device(drv, dev)) { >+ add_taint_module(drv->owner, TAINT_FORCED_BIND, LOCKDEP_STILL_OK); > err = device_driver_attach(drv, dev); > if (!err) { > /* success */ >diff --git a/include/linux/panic.h b/include/linux/panic.h >index f1dd417e54b2..8e7250b0e913 100644 >--- a/include/linux/panic.h >+++ b/include/linux/panic.h >@@ -88,7 +88,8 @@ static inline void set_arch_panic_timeout(int timeout, int arch_default_timeout) > #define TAINT_RANDSTRUCT 17 > #define TAINT_TEST 18 > #define TAINT_FWCTL 19 >-#define TAINT_FLAGS_COUNT 20 >+#define TAINT_FORCED_BIND 20 >+#define TAINT_FLAGS_COUNT 21 > #define TAINT_FLAGS_MAX ((1UL << TAINT_FLAGS_COUNT) - 1) > > struct taint_flag { >diff --git a/include/trace/events/module.h b/include/trace/events/module.h >index e5a006be9dc6..19df3e39bba4 100644 >--- a/include/trace/events/module.h >+++ b/include/trace/events/module.h >@@ -26,7 +26,8 @@ struct module; > { (1UL << TAINT_OOT_MODULE), "O" }, \ > { (1UL << TAINT_FORCED_MODULE), "F" }, \ > { (1UL << TAINT_CRAP), "C" }, \ >- { (1UL << TAINT_UNSIGNED_MODULE), "E" }) >+ { (1UL << TAINT_UNSIGNED_MODULE), "E" }, \ >+ { (1UL << TAINT_FORCED_BIND), "Y" }) > > TRACE_EVENT(module_load, > >diff --git a/kernel/panic.c b/kernel/panic.c >index 213725b612aa..6bf60f9dd120 100644 >--- a/kernel/panic.c >+++ b/kernel/panic.c >@@ -826,6 +826,7 @@ const struct taint_flag taint_flags[TAINT_FLAGS_COUNT] = { > TAINT_FLAG(RANDSTRUCT, 'T', ' '), > TAINT_FLAG(TEST, 'N', ' '), > TAINT_FLAG(FWCTL, 'J', ' '), >+ TAINT_FLAG(FORCED_BIND, 'Y', ' '), > }; > > #undef TAINT_FLAG >@@ -862,9 +863,9 @@ static void print_tainted_seq(struct seq_buf *s, bool verbose) > * exact size is allocated dynamically; the initial buffer remains > * as a fallback if allocation fails. > * >- * The verbose taint string currently requires up to 327 characters. >+ * The verbose taint string currently requires up to 344 characters. > */ >-#define INIT_TAINT_BUF_MAX 350 >+#define INIT_TAINT_BUF_MAX 370 > > static char init_taint_buf[INIT_TAINT_BUF_MAX] __initdata; > static char *taint_buf __refdata = init_taint_buf; >diff --git a/tools/debugging/kernel-chktaint b/tools/debugging/kernel-chktaint >index e1571c04afb5..d8628be37214 100755 >--- a/tools/debugging/kernel-chktaint >+++ b/tools/debugging/kernel-chktaint >@@ -211,6 +211,14 @@ else > addout "J" > echo " * fwctl's mutating debug interface was used (#19)" > fi >+ >+T=`expr $T / 2` >+if [ `expr $T % 2` -eq 0 ]; then >+ addout " " >+else >+ addout "Y" >+ echo " * device was manually bound or unbound from a driver (#20)" >+fi > echo "Raw taint value as int/string: $taint/'$out'" > > # report on any tainted loadable modules > > --- Thanks! https://lore.kernel.org/all/EE579805-42F2-4C58-B752-F28779EEB717@grrlz.net/ ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 11:58 ` Bradley Morgan @ 2026-08-26 13:10 ` Greg KH 2026-08-26 14:26 ` Steven Rostedt 1 sibling, 0 replies; 20+ messages in thread From: Greg KH @ 2026-08-26 13:10 UTC (permalink / raw) To: Bradley Morgan Cc: atomlin, corbet, da.gomez, dakr, driver-core, linux-doc, linux-kernel, linux-modules, linux-trace-kernel, linux-usb, mathieu.desnoyers, mcgrof, mhiramat, petr.pavlu, rafael, rdunlap, rostedt, samitolvanen, skhan On Wed, Aug 26, 2026 at 12:58:00PM +0100, Bradley Morgan wrote: > On 26 August 2026 10:19:33 BST, Greg Kroah-Hartman > <gregkh@linuxfoundation.org> wrote: > >The ability to add and remove devices from a driver through the sysfs > >"bind" and "unbind" files was created all those decades ago as a way > >that kernel developers can iterate faster, and provide a debugging way > >for users to attempt to add a new device to a driver without having to > >rebuild their kernel. > > > >This api over the years has been abused and recently come under a major > >fuzzing "attack" through tools like syzbot which decided that it would > >attempt to just randomly bind any driver to any type of device, causing > >loads of unneeded errors and pointless kernel patches to be generated by > >unsuspecting new developers. > > > >Handle all of this by adding a new taint flag, TAINT_FORCED_BIND, which > >will be set on the driver if the bind/unbind sysfs files are ever > >successfully written to. This lets kernel developers "know" that a user > >is attempting to do something that is not normal, and as such, if the > >kernel breaks they get to keep the shiny pieces laying around on the > >floor. > > > >Note, the taint flag gets set _BEFORE_ the bind/unbind callback happens, > >as many times crashes/oops/warnings/failures happen within the callback, > >and the taint flag needs to be there to show what was being attempted. > >If it were to be set after the callback happens, the oops report would > >not properly reflect what foolishness was being attempted. > > > > sashiko found a couple valid concerns for 2/2 Yes, will fix that for v2. thanks, greg k-h ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 11:58 ` Bradley Morgan 2026-08-26 13:10 ` Greg KH @ 2026-08-26 14:26 ` Steven Rostedt 2026-08-26 14:34 ` Bradley Morgan 1 sibling, 1 reply; 20+ messages in thread From: Steven Rostedt @ 2026-08-26 14:26 UTC (permalink / raw) To: Bradley Morgan Cc: gregkh, atomlin, corbet, da.gomez, dakr, driver-core, linux-doc, linux-kernel, linux-modules, linux-trace-kernel, linux-usb, mathieu.desnoyers, mcgrof, mhiramat, petr.pavlu, rafael, rdunlap, samitolvanen, skhan On Wed, 26 Aug 2026 12:58:00 +0100 Bradley Morgan <brads@mainlining.org> wrote: > sashiko found a couple valid concerns for 2/2 Sashiko will respond to the email if it Cc'd linux-trace-kernel, which Greg did. No need to mention Sashiko. It can speak for itself ;-) -- Steve ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 14:26 ` Steven Rostedt @ 2026-08-26 14:34 ` Bradley Morgan 0 siblings, 0 replies; 20+ messages in thread From: Bradley Morgan @ 2026-08-26 14:34 UTC (permalink / raw) To: Steven Rostedt Cc: gregkh, atomlin, corbet, da.gomez, dakr, driver-core, linux-doc, linux-kernel, linux-modules, linux-trace-kernel, linux-usb, mathieu.desnoyers, mcgrof, mhiramat, petr.pavlu, rafael, rdunlap, samitolvanen, skhan On 26 August 2026 15:26:46 BST, Steven Rostedt <rostedt@goodmis.org> wrote: >On Wed, 26 Aug 2026 12:58:00 +0100 >Bradley Morgan <brads@mainlining.org> wrote: > >> sashiko found a couple valid concerns for 2/2 > >Sashiko will respond to the email if it Cc'd linux-trace-kernel, which >Greg >did. No need to mention Sashiko. It can speak for itself ;-) Soz, wanted to get CC'ed to V2, if I didn't say anything, I wouldn't get CCed, simple I'll review it in V2, it looks fine to me but with a couple nits, I wanna see Greg's V2 first. > >-- Steve --- Thanks! https://lore.kernel.org/all/EE579805-42F2-4C58-B752-F28779EEB717@grrlz.net/ ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 9:19 ` [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman 2026-08-26 10:34 ` sashiko-bot 2026-08-26 11:58 ` Bradley Morgan @ 2026-08-27 13:33 ` Johan Hovold 2 siblings, 0 replies; 20+ messages in thread From: Johan Hovold @ 2026-08-27 13:33 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Wed, Aug 26, 2026 at 11:19:33AM +0200, Greg Kroah-Hartman wrote: > The ability to add and remove devices from a driver through the sysfs > "bind" and "unbind" files was created all those decades ago as a way > that kernel developers can iterate faster, and provide a debugging way > for users to attempt to add a new device to a driver without having to > rebuild their kernel. > > This api over the years has been abused and recently come under a major > fuzzing "attack" through tools like syzbot which decided that it would > attempt to just randomly bind any driver to any type of device, causing > loads of unneeded errors and pointless kernel patches to be generated by > unsuspecting new developers. > > Handle all of this by adding a new taint flag, TAINT_FORCED_BIND, which > will be set on the driver if the bind/unbind sysfs files are ever > successfully written to. This lets kernel developers "know" that a user > is attempting to do something that is not normal, and as such, if the > kernel breaks they get to keep the shiny pieces laying around on the > floor. > > Note, the taint flag gets set _BEFORE_ the bind/unbind callback happens, > as many times crashes/oops/warnings/failures happen within the callback, > and the taint flag needs to be there to show what was being attempted. > If it were to be set after the callback happens, the oops report would > not properly reflect what foolishness was being attempted. > > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> This makes it clear that this is a development tool, and it is a good compromise preferable to adding unnecessary complexity or suppressing the attributes completely just to prevent root from shooting themselves in the foot: Reviewed-by: Johan Hovold <johan@kernel.org> Tested-by: Johan Hovold <johan@kernel.org> Johan ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 9:19 [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman 2026-08-26 9:19 ` [PATCH 1/2] module: pull out add_taint_module() to be public Greg Kroah-Hartman 2026-08-26 9:19 ` [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman @ 2026-08-26 13:33 ` Michal Pecio 2026-08-26 14:25 ` Greg Kroah-Hartman 2 siblings, 1 reply; 20+ messages in thread From: Michal Pecio @ 2026-08-26 13:33 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Wed, 26 Aug 2026 11:19:31 +0200, Greg Kroah-Hartman wrote: > The ability to add and remove devices from a driver through the sysfs > "bind" and "unbind" files was created all those decades ago as a way > that kernel developers can iterate faster, and provide a debugging way > for users to attempt to add a new device to a driver without having to > rebuild their kernel. > > This api over the years has been abused and recently come under a major > fuzzing "attack" through tools like syzbot which decided that it would > attempt to just randomly bind any driver to any type of device, causing > loads of unneeded errors and pointless kernel patches to be generated by > unsuspecting new developers. Hi Greg, I think you confused 'bind' / 'unbind' with the likes of 'new_id' and 'driver_override'. Try binding xhci_hcd to NVMe, you won't get far. FYI, besides being footguns, the latter are apparently used to assign any random PCI device to some VM drivers for passthrough or whatnot. The former hardly are footguns and have further common uses, such as removing kernel drivers to make VM / USBFS work or "turn it off and on again" when a driver doesn't implement recovery. I've seen a published script which does this automatically when xhci goes belly up... I am also not convinced that fuzzing 'unbind' alone is a bad thing. How is that different from 'rmmod' or pulling out a USB-C plug, which may have a bunch of USB *and* PCI devices behind it, mid-operation? Regards, Michal ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 13:33 ` [PATCH 0/2] " Michal Pecio @ 2026-08-26 14:25 ` Greg Kroah-Hartman 2026-08-26 15:35 ` Michal Pecio 0 siblings, 1 reply; 20+ messages in thread From: Greg Kroah-Hartman @ 2026-08-26 14:25 UTC (permalink / raw) To: Michal Pecio Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Wed, Aug 26, 2026 at 03:33:11PM +0200, Michal Pecio wrote: > On Wed, 26 Aug 2026 11:19:31 +0200, Greg Kroah-Hartman wrote: > > The ability to add and remove devices from a driver through the sysfs > > "bind" and "unbind" files was created all those decades ago as a way > > that kernel developers can iterate faster, and provide a debugging way > > for users to attempt to add a new device to a driver without having to > > rebuild their kernel. > > > > This api over the years has been abused and recently come under a major > > fuzzing "attack" through tools like syzbot which decided that it would > > attempt to just randomly bind any driver to any type of device, causing > > loads of unneeded errors and pointless kernel patches to be generated by > > unsuspecting new developers. > > Hi Greg, > > I think you confused 'bind' / 'unbind' with the likes of 'new_id' and > 'driver_override'. Try binding xhci_hcd to NVMe, you won't get far. It seems to result in a failure report that people keep sending random patches for :( > FYI, besides being footguns, the latter are apparently used to assign > any random PCI device to some VM drivers for passthrough or whatnot. Which should be fixed. > The former hardly are footguns and have further common uses, such as > removing kernel drivers to make VM / USBFS work or "turn it off and on > again" when a driver doesn't implement recovery. I've seen a published > script which does this automatically when xhci goes belly up... And we should fix the root cause here. > I am also not convinced that fuzzing 'unbind' alone is a bad thing. > How is that different from 'rmmod' or pulling out a USB-C plug, which > may have a bunch of USB *and* PCI devices behind it, mid-operation? rmmod too is something that is never guaranteed to work, and is for developers. "luckily" syzbot doesn't seem to want to do that just yet :) This is to stem the tide of foolish patches where people/syzbot is attempting to bind any random device to any random driver and then reporting a "bug" for when things go wrong. It is also here to mark a kernel as "hey, something was manually overridden" if a normal user does this and then attempts to ask for support for us. Both are good things for developers to know about. thanks, greg k-h ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 14:25 ` Greg Kroah-Hartman @ 2026-08-26 15:35 ` Michal Pecio 2026-08-26 15:44 ` Greg Kroah-Hartman 0 siblings, 1 reply; 20+ messages in thread From: Michal Pecio @ 2026-08-26 15:35 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Wed, 26 Aug 2026 16:25:42 +0200, Greg Kroah-Hartman wrote: > > I think you confused 'bind' / 'unbind' with the likes of 'new_id' > > and 'driver_override'. Try binding xhci_hcd to NVMe, you won't get > > far. > > It seems to result in a failure report that people keep sending random > patches for :( It results in write() returning -ENODEV. You can't bind random drivers to random devices out of the box, you need ID overrides. And then you don't need to bind manually, the kernel will happily select the wrong driver by default. Authors of the recent xhci and thunderbolt patches admitted that 'driver_override' was involved in both cases. Meanwhile, Syzbot also found a stupid write to freed memory in USB core when HCs are unbound. You may say it doesn't matter, but: * USB HCs are hotpluggable thunderbolt "gadgets" these days * there were plans to alter this code so that UAF is triggered by hot removal of the USB device, not its parent HC IMO the actually meaningful change would be to taint driver ID overrides, because that's the known risky and crash-prone madness. bind/unbind taint is noise that will be ignored. Regards, Michal ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 15:35 ` Michal Pecio @ 2026-08-26 15:44 ` Greg Kroah-Hartman 2026-08-26 17:09 ` Michal Pecio 0 siblings, 1 reply; 20+ messages in thread From: Greg Kroah-Hartman @ 2026-08-26 15:44 UTC (permalink / raw) To: Michal Pecio Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Wed, Aug 26, 2026 at 05:35:49PM +0200, Michal Pecio wrote: > On Wed, 26 Aug 2026 16:25:42 +0200, Greg Kroah-Hartman wrote: > > > I think you confused 'bind' / 'unbind' with the likes of 'new_id' > > > and 'driver_override'. Try binding xhci_hcd to NVMe, you won't get > > > far. > > > > It seems to result in a failure report that people keep sending random > > patches for :( > > It results in write() returning -ENODEV. > > You can't bind random drivers to random devices out of the box, > you need ID overrides. And then you don't need to bind manually, > the kernel will happily select the wrong driver by default. > > Authors of the recent xhci and thunderbolt patches admitted that > 'driver_override' was involved in both cases. I'll be glad to taint if driver_override is also written to, but it's bind() that triggers the actual action happening. Or so the traces show. > Meanwhile, Syzbot also found a stupid write to freed memory in USB > core when HCs are unbound. You may say it doesn't matter, but: > > * USB HCs are hotpluggable thunderbolt "gadgets" these days We support PCI devices being removed, but that falls under the PCI hotplug rules/requirements, right? Anyway, sure, we can fix those bugs when found, but that's not the majority of what we are seeing at the moment. Look at all of the dumb platform drivers that are getting hit with this on the syzbot reports... > * there were plans to alter this code so that UAF is triggered by > hot removal of the USB device, not its parent HC I don't understand what you mean by this. > IMO the actually meaningful change would be to taint driver ID > overrides, because that's the known risky and crash-prone madness. > bind/unbind taint is noise that will be ignored. it's not going to be ignored if panic_on_taint is enabled in syzbot, which the authors have said they will do :) thanks, greg k-h ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers 2026-08-26 15:44 ` Greg Kroah-Hartman @ 2026-08-26 17:09 ` Michal Pecio 0 siblings, 0 replies; 20+ messages in thread From: Michal Pecio @ 2026-08-26 17:09 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Jonathan Corbet, Shuah Khan, Randy Dunlap, Rafael J. Wysocki, Danilo Krummrich, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, linux-modules, linux-kernel, linux-doc, linux-usb, driver-core, linux-trace-kernel On Wed, 26 Aug 2026 17:44:06 +0200, Greg Kroah-Hartman wrote: > On Wed, Aug 26, 2026 at 05:35:49PM +0200, Michal Pecio wrote: > > You can't bind random drivers to random devices out of the box, > > you need ID overrides. And then you don't need to bind manually, > > the kernel will happily select the wrong driver by default. > > > > Authors of the recent xhci and thunderbolt patches admitted that > > 'driver_override' was involved in both cases. > > I'll be glad to taint if driver_override is also written to, but it's > bind() that triggers the actual action happening. Or so the traces > show. Well, I suppose probe() is the first victim to crash in such cases. But if Syzbot is binding random drivers to random devices, the obvious solution is to ban 'driver_override'. Using that is just cheating. If it still manages to crash drivers by binding them to appropriate devices then I would say it will finally be doing its job right :) > > Meanwhile, Syzbot also found a stupid write to freed memory in USB > > core when HCs are unbound. You may say it doesn't matter, but: > > > > * USB HCs are hotpluggable thunderbolt "gadgets" these days > > We support PCI devices being removed, but that falls under the PCI > hotplug rules/requirements, right? Anyway, sure, we can fix those bugs > when found, but that's not the majority of what we are seeing at the > moment. Look at all of the dumb platform drivers that are getting hit > with this on the syzbot reports... > > > * there were plans to alter this code so that UAF is triggered by > > hot removal of the USB device, not its parent HC > > I don't understand what you mean by this. There are ideas to change some code to use per-device data instead of per-HCD data. Coincidentally, Syzbot found that this use races with freeing the HCD and it would also race with freeing the device, making the UAF easier to trigger after proposed changes. I gave it as an example of Syzbot doing something useful with 'unbind' when it isn't wasting time on driver overrides. Regards, Michal ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2026-08-27 14:32 UTC | newest] Thread overview: 20+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-08-26 9:19 [PATCH 0/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman 2026-08-26 9:19 ` [PATCH 1/2] module: pull out add_taint_module() to be public Greg Kroah-Hartman 2026-08-26 10:29 ` sashiko-bot 2026-08-26 10:39 ` Greg Kroah-Hartman 2026-08-26 11:13 ` Aaron Tomlin 2026-08-26 11:54 ` Greg Kroah-Hartman 2026-08-27 13:36 ` Johan Hovold 2026-08-27 14:30 ` Greg Kroah-Hartman 2026-08-26 9:19 ` [PATCH 2/2] driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers Greg Kroah-Hartman 2026-08-26 10:34 ` sashiko-bot 2026-08-26 11:58 ` Bradley Morgan 2026-08-26 13:10 ` Greg KH 2026-08-26 14:26 ` Steven Rostedt 2026-08-26 14:34 ` Bradley Morgan 2026-08-27 13:33 ` Johan Hovold 2026-08-26 13:33 ` [PATCH 0/2] " Michal Pecio 2026-08-26 14:25 ` Greg Kroah-Hartman 2026-08-26 15:35 ` Michal Pecio 2026-08-26 15:44 ` Greg Kroah-Hartman 2026-08-26 17:09 ` Michal Pecio
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox