mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 01:24:47 +01:00
Revert "driver core: enforce device_lock for driver_match_device()"
This reverts commitdc23806a7c("driver core: enforce device_lock for driver_match_device()") and commit289b14592c("driver core: fix inverted "locked" suffix of driver_match_device()"). While technically correct, there is a major downside to this approach: When a device is already present in the system and a driver is registered on the same bus, we iterate over all devices registered on this bus to see if one of them matches. If we come across an already bound one where the corresponding driver crashed while holding the device lock (e.g. in probe()) we can't make any progress anymore. However, drivers are typically the least tested code in the kernel and hence it is a case that is likely to happen regularly. Besides hurting developer ergonomics, it potentially decreases chances of shutting things down cleanly and obtaining logs in production environments as well [1]. This came up in the context of a firewire bug, which only in combination with the reverted commit, caused the machine to hang [2]. Additionally, it was observed in [3]. Thus, revert commitdc23806a7c("driver core: enforce device_lock for driver_match_device()") and add a brief note clarifying that an implementer of struct bus_type must not expect match() to be called with the device lock held. Link: https://lore.kernel.org/driver-core/DGRGTIRHA62X.3RY09D9SOK77P@kernel.org/ [1] Link: https://lore.kernel.org/all/67f655bb-4d81-4609-b008-68d200255dd2@davidgow.net/ [2] Link: https://lore.kernel.org/lkml/CALbr=LZ4v7N=tO1vgOsyj9AS+XuNbn6kG-QcF+PacdMjSo0iyw@mail.gmail.com/ [3] Reported-by: Linus Torvalds <torvalds@linux-foundation.org> Closes: https://lore.kernel.org/driver-core/CAHk-=wgJ_L1C=HjcYJotg_zrZEmiLFJaoic+PWthjuQrutrfJw@mail.gmail.com/ Reviewed-by: Gui-Dong Han <hanguidong02@gmail.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://patch.msgid.link/20260302002545.19389-1-dakr@kernel.org [ Add additional Link: reference. - Danilo ] Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
parent
11439c4635
commit
9de68394a6
3 changed files with 4 additions and 11 deletions
|
|
@ -179,19 +179,10 @@ void device_release_driver_internal(struct device *dev, const struct device_driv
|
|||
void driver_detach(const struct device_driver *drv);
|
||||
void driver_deferred_probe_del(struct device *dev);
|
||||
void device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf);
|
||||
static inline int driver_match_device_locked(const struct device_driver *drv,
|
||||
struct device *dev)
|
||||
{
|
||||
device_lock_assert(dev);
|
||||
|
||||
return drv->bus->match ? drv->bus->match(dev, drv) : 1;
|
||||
}
|
||||
|
||||
static inline int driver_match_device(const struct device_driver *drv,
|
||||
struct device *dev)
|
||||
{
|
||||
guard(device)(dev);
|
||||
return driver_match_device_locked(drv, dev);
|
||||
return drv->bus->match ? drv->bus->match(dev, drv) : 1;
|
||||
}
|
||||
|
||||
static inline void dev_sync_state(struct device *dev)
|
||||
|
|
|
|||
|
|
@ -928,7 +928,7 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
|
|||
bool async_allowed;
|
||||
int ret;
|
||||
|
||||
ret = driver_match_device_locked(drv, dev);
|
||||
ret = driver_match_device(drv, dev);
|
||||
if (ret == 0) {
|
||||
/* no match */
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -35,6 +35,8 @@ struct fwnode_handle;
|
|||
* otherwise. It may also return error code if determining that
|
||||
* the driver supports the device is not possible. In case of
|
||||
* -EPROBE_DEFER it will queue the device for deferred probing.
|
||||
* Note: This callback may be invoked with or without the device
|
||||
* lock held.
|
||||
* @uevent: Called when a device is added, removed, or a few other things
|
||||
* that generate uevents to add the environment variables.
|
||||
* @probe: Called when a new device or driver add to this bus, and callback
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue