Message ID | 1461272067-17624-1-git-send-email-roderick@gaikai.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, [auto build test ERROR on hid/for-next] [also build test ERROR on v4.6-rc4 next-20160421] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/roderick-gaikai-com/HID-uhid-Fixes-a-bug-with-userspace-bluetooth-stacks-which-causes-hangs-during-certain-operations/20160422-050505 base: https://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git for-next config: x86_64-randconfig-x010-201616 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All errors (new ones prefixed by >>): drivers/hid/uhid.c: In function 'uhid_event_from_user': >> drivers/hid/uhid.c:403:6: error: implicit declaration of function 'is_compat_task' [-Werror=implicit-function-declaration] if (is_compat_task()) { ^ cc1: some warnings being treated as errors vim +/is_compat_task +403 drivers/hid/uhid.c 397 __u32 country; 398 } __attribute__((__packed__)); 399 400 static int uhid_event_from_user(const char __user *buffer, size_t len, 401 struct uhid_event *event) 402 { > 403 if (is_compat_task()) { 404 u32 type; 405 406 if (get_user(type, buffer)) --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Hi, [auto build test WARNING on hid/for-next] [also build test WARNING on v4.6-rc4 next-20160421] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/roderick-gaikai-com/HID-uhid-Fixes-a-bug-with-userspace-bluetooth-stacks-which-causes-hangs-during-certain-operations/20160422-050505 base: https://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git for-next config: x86_64-randconfig-x003-201616 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All warnings (new ones prefixed by >>): In file included from arch/x86/include/asm/atomic.h:4:0, from include/linux/atomic.h:4, from drivers/hid/uhid.c:13: drivers/hid/uhid.c: In function 'uhid_event_from_user': drivers/hid/uhid.c:403:6: error: implicit declaration of function 'is_compat_task' [-Werror=implicit-function-declaration] if (is_compat_task()) { ^ include/linux/compiler.h:151:30: note: in definition of macro '__trace_if' if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ ^ >> drivers/hid/uhid.c:403:2: note: in expansion of macro 'if' if (is_compat_task()) { ^ cc1: some warnings being treated as errors vim +/if +403 drivers/hid/uhid.c 387 __u8 phys[64]; 388 __u8 uniq[64]; 389 390 compat_uptr_t rd_data; 391 __u16 rd_size; 392 393 __u16 bus; 394 __u32 vendor; 395 __u32 product; 396 __u32 version; 397 __u32 country; 398 } __attribute__((__packed__)); 399 400 static int uhid_event_from_user(const char __user *buffer, size_t len, 401 struct uhid_event *event) 402 { > 403 if (is_compat_task()) { 404 u32 type; 405 406 if (get_user(type, buffer)) 407 return -EFAULT; 408 409 if (type == UHID_CREATE) { 410 /* 411 * This is our messed up request with compat pointer. --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Please ignore this revision of the patch, there was a small merge conflict on my end. On Thu, Apr 21, 2016 at 2:15 PM, kbuild test robot <lkp@intel.com> wrote: > Hi, > > [auto build test WARNING on hid/for-next] > [also build test WARNING on v4.6-rc4 next-20160421] > [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] > > url: https://github.com/0day-ci/linux/commits/roderick-gaikai-com/HID-uhid-Fixes-a-bug-with-userspace-bluetooth-stacks-which-causes-hangs-during-certain-operations/20160422-050505 > base: https://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git for-next > config: x86_64-randconfig-x003-201616 (attached as .config) > reproduce: > # save the attached .config to linux build tree > make ARCH=x86_64 > > All warnings (new ones prefixed by >>): > > In file included from arch/x86/include/asm/atomic.h:4:0, > from include/linux/atomic.h:4, > from drivers/hid/uhid.c:13: > drivers/hid/uhid.c: In function 'uhid_event_from_user': > drivers/hid/uhid.c:403:6: error: implicit declaration of function 'is_compat_task' [-Werror=implicit-function-declaration] > if (is_compat_task()) { > ^ > include/linux/compiler.h:151:30: note: in definition of macro '__trace_if' > if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ > ^ >>> drivers/hid/uhid.c:403:2: note: in expansion of macro 'if' > if (is_compat_task()) { > ^ > cc1: some warnings being treated as errors > > vim +/if +403 drivers/hid/uhid.c > > 387 __u8 phys[64]; > 388 __u8 uniq[64]; > 389 > 390 compat_uptr_t rd_data; > 391 __u16 rd_size; > 392 > 393 __u16 bus; > 394 __u32 vendor; > 395 __u32 product; > 396 __u32 version; > 397 __u32 country; > 398 } __attribute__((__packed__)); > 399 > 400 static int uhid_event_from_user(const char __user *buffer, size_t len, > 401 struct uhid_event *event) > 402 { > > 403 if (is_compat_task()) { > 404 u32 type; > 405 > 406 if (get_user(type, buffer)) > 407 return -EFAULT; > 408 > 409 if (type == UHID_CREATE) { > 410 /* > 411 * This is our messed up request with compat pointer. > > --- > 0-DAY kernel test infrastructure Open Source Technology Center > https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c index 16b6f11..1a2032c 100644 --- a/drivers/hid/uhid.c +++ b/drivers/hid/uhid.c @@ -51,10 +51,26 @@ struct uhid_device { u32 report_id; u32 report_type; struct uhid_event report_buf; + struct work_struct worker; }; static struct miscdevice uhid_misc; +static void uhid_device_add_worker(struct work_struct *work) +{ + struct uhid_device *uhid = container_of(work, struct uhid_device, worker); + int ret; + + ret = hid_add_device(uhid->hid); + if (ret) { + hid_err(uhid->hid, "Cannot register HID device: error %d\n", ret); + + hid_destroy_device(uhid->hid); + uhid->hid = NULL; + uhid->running = false; + } +} + static void uhid_queue(struct uhid_device *uhid, struct uhid_event *ev) { __u8 newhead; @@ -384,7 +400,7 @@ struct uhid_create_req_compat { static int uhid_event_from_user(const char __user *buffer, size_t len, struct uhid_event *event) { - if (in_compat_syscall()) { + if (is_compat_task()) { u32 type; if (get_user(type, buffer)) @@ -498,18 +514,14 @@ static int uhid_dev_create2(struct uhid_device *uhid, uhid->hid = hid; uhid->running = true; - ret = hid_add_device(hid); - if (ret) { - hid_err(hid, "Cannot register HID device\n"); - goto err_hid; - } + /* Adding of a HID device is done through a worker, to allow HID drivers + * which use feature requests during .probe to work, without they would + * be blocked on devlock, which is held by uhid_char_write. + */ + schedule_work(&uhid->worker); return 0; -err_hid: - hid_destroy_device(hid); - uhid->hid = NULL; - uhid->running = false; err_free: kfree(uhid->rd_data); uhid->rd_data = NULL; @@ -550,6 +562,8 @@ static int uhid_dev_destroy(struct uhid_device *uhid) uhid->running = false; wake_up_interruptible(&uhid->report_wait); + cancel_work_sync(&uhid->worker); + hid_destroy_device(uhid->hid); kfree(uhid->rd_data); @@ -612,6 +626,7 @@ static int uhid_char_open(struct inode *inode, struct file *file) init_waitqueue_head(&uhid->waitq); init_waitqueue_head(&uhid->report_wait); uhid->running = false; + INIT_WORK(&uhid->worker, uhid_device_add_worker); file->private_data = uhid; nonseekable_open(inode, file);