From a287f97d4256b5f5527f5b5a54f8ada55e1482c7 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 28 Oct 2026 14:42:15 +0100 Subject: [PATCH] Revert "driver core: add TAINT_FORCED_BIND for when userspace manually messes with devices and drivers" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit fcbfaffee51a452cc8efcbaa3b88ec4595678424. Turns out that vfio is a crazy beast and people have been "relying" on the bind/unbind debugging feature as a way to handle passing through devices to guest instances. Because of this (https://xkcd.com/1172/), let's revert the feature for now until we can figure out a more agreeable way to handle this such that normal workflows do not taint the kernel. Odds are something like what Uwe proposes at: https://lore.kernel.org/lkml/cover.1790612298.git.u.kleine-koenig@baylibre.com/ will be the best way forward and will be revisited after for after 7.4. The feature was originally intended to stem the flow of unnecessary fuzzing reports of "broken" drivers where random devices were being bound to random drivers and of course things were going wrong. The main syzbot tool is now not doing this anymore, and hopefully no one else starts it up again (but in this madness of LLMs these days, you can't be sure.) Thanks to everyone for telling me just how wrong I was to implement this, I appreciated the feedback :) Link: https://lore.kernel.org/all/DLIL9H50MALI.3JROXYEEUM3KU@kernel.org/ To: Jonathan Corbet To: Shuah Khan To: Randy Dunlap To: "Rafael J. Wysocki" To: Danilo Krummrich To: Johan Hovold To: Steven Rostedt To: Masami Hiramatsu To: Mathieu Desnoyers Reported-by: Leon Romanovsky Reported-by: Jason Gunthorpe Reported-by: Michal Pecio Reported-by: "Uwe Kleine-König" Link: https://patch.msgid.link/20261028-bind_taint-revert-v1-1-7c6b9cef30c9@linuxfoundation.org Signed-off-by: Greg Kroah-Hartman [ Revert the change in Documentation/admin-guide/tainted-kernels.rst. - Danilo ] Signed-off-by: Danilo Krummrich --- Documentation/admin-guide/tainted-kernels.rst | 54 +++++++++---------- 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, 29 insertions(+), 47 deletions(-) diff --git a/Documentation/admin-guide/tainted-kernels.rst b/Documentation/admin-guide/tainted-kernels.rst index a208811ad525..fcb8b9734548 100644 --- a/Documentation/admin-guide/tainted-kernels.rst +++ b/Documentation/admin-guide/tainted-kernels.rst @@ -74,36 +74,35 @@ a particular type of taint. It's best to leave that to the aforementioned script, but if you need something quick you can use this shell command to check which bits are set:: - $ for i in $(seq 0 20); do echo $i $(($(cat /proc/sys/kernel/tainted)>>$i&1));done + $ for i in $(seq 0 19); do echo $i $(($(cat /proc/sys/kernel/tainted)>>$i&1));done 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 - 20 _/Y 1048576 device was manually bound or unbound from a driver -=== === ======= ======================================================== +=== === ====== ======================================================== +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 +=== === ====== ======================================================== Note: The character ``_`` is representing a blank in this table to make reading easier. @@ -190,6 +189,3 @@ 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 f8759d5c9056..396097fdb316 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -19,7 +19,6 @@ #include #include #include -#include #include "base.h" #include "power/power.h" @@ -242,7 +241,6 @@ 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; } @@ -266,7 +264,6 @@ 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 8e7250b0e913..f1dd417e54b2 100644 --- a/include/linux/panic.h +++ b/include/linux/panic.h @@ -88,8 +88,7 @@ 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_FORCED_BIND 20 -#define TAINT_FLAGS_COUNT 21 +#define TAINT_FLAGS_COUNT 20 #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 19df3e39bba4..e5a006be9dc6 100644 --- a/include/trace/events/module.h +++ b/include/trace/events/module.h @@ -26,8 +26,7 @@ struct module; { (1UL << TAINT_OOT_MODULE), "O" }, \ { (1UL << TAINT_FORCED_MODULE), "F" }, \ { (1UL << TAINT_CRAP), "C" }, \ - { (1UL << TAINT_UNSIGNED_MODULE), "E" }, \ - { (1UL << TAINT_FORCED_BIND), "Y" }) + { (1UL << TAINT_UNSIGNED_MODULE), "E" }) TRACE_EVENT(module_load, diff --git a/kernel/panic.c b/kernel/panic.c index a4dbb6b8cd2b..892045d8409e 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -826,7 +826,6 @@ 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 @@ -863,9 +862,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 344 characters. + * The verbose taint string currently requires up to 327 characters. */ -#define INIT_TAINT_BUF_MAX 370 +#define INIT_TAINT_BUF_MAX 350 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 d8628be37214..e1571c04afb5 100755 --- a/tools/debugging/kernel-chktaint +++ b/tools/debugging/kernel-chktaint @@ -211,14 +211,6 @@ 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