summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2019-04-04 16:51:32 +0300
committerBenjamin Tissoires <benjamin.tissoires@redhat.com>2019-04-05 18:35:02 +0300
commit4ceabaf7909d109db6afbffc4ed182741fc32043 (patch)
treeb64def112a3fbfe3bb135ac35b5fddc9e459464a
parenta025a18fecd4429f4ca66b1746001263c052ecbb (diff)
downloadlinux-4ceabaf7909d109db6afbffc4ed182741fc32043.tar.xz
HID: core: Do not call request_module() in async context
request_module() may not be called form async context and in some cases hid devices may be added from an async context. One example of this happening is under hyperv, where this was triggering a WARN_ON in request_module(): [ 11.174497] hid_add_device+0xee/0x2b0 [hid] [ 11.174499] mousevsc_probe+0x223/0x2eb [hid_hyperv] [ 11.174501] vmbus_probe+0x3a/0x90 [ 11.174504] really_probe+0x229/0x420 [ 11.174506] driver_probe_device+0x115/0x130 [ 11.174507] __driver_attach_async_helper+0x87/0x90 [ 11.174509] async_run_entry_fn+0x37/0x150 This commit skips the request_module(), falling back to the old behavior of letting userspace deal with this, in case we are called from an async context. Cc: Lili Deng <v-lide@microsoft.com> Reported-by: Lili Deng <v-lide@microsoft.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
-rw-r--r--drivers/hid/hid-core.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 2f843b84811e..59e95768142d 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -30,6 +30,7 @@
#include <linux/vmalloc.h>
#include <linux/sched.h>
#include <linux/semaphore.h>
+#include <linux/async.h>
#include <linux/hid.h>
#include <linux/hiddev.h>
@@ -2366,8 +2367,9 @@ int hid_add_device(struct hid_device *hdev)
* not first have hid-generic binding only to have it replaced
* immediately afterwards with a specialized driver.
*/
- request_module("hid:b%04Xg%04Xv%08Xp%08X",
- hdev->bus, hdev->group, hdev->vendor, hdev->product);
+ if (!current_is_async())
+ request_module("hid:b%04Xg%04Xv%08Xp%08X", hdev->bus,
+ hdev->group, hdev->vendor, hdev->product);
hid_debug_register(hdev, dev_name(&hdev->dev));
ret = device_add(&hdev->dev);