diff options
| -rw-r--r-- | drivers/hid/hid-core.c | 2 | ||||
| -rw-r--r-- | drivers/hid/hid-debug.c | 15 | ||||
| -rw-r--r-- | include/linux/hid.h | 2 |
3 files changed, 11 insertions, 8 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 1e51159c3103..264f55099940 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -2342,7 +2342,7 @@ struct hid_device *hid_allocate_device(void) | |||
| 2342 | 2342 | ||
| 2343 | init_waitqueue_head(&hdev->debug_wait); | 2343 | init_waitqueue_head(&hdev->debug_wait); |
| 2344 | INIT_LIST_HEAD(&hdev->debug_list); | 2344 | INIT_LIST_HEAD(&hdev->debug_list); |
| 2345 | mutex_init(&hdev->debug_list_lock); | 2345 | spin_lock_init(&hdev->debug_list_lock); |
| 2346 | sema_init(&hdev->driver_lock, 1); | 2346 | sema_init(&hdev->driver_lock, 1); |
| 2347 | sema_init(&hdev->driver_input_lock, 1); | 2347 | sema_init(&hdev->driver_input_lock, 1); |
| 2348 | 2348 | ||
diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c index 7e56cb3855e3..8453214ec376 100644 --- a/drivers/hid/hid-debug.c +++ b/drivers/hid/hid-debug.c | |||
| @@ -579,15 +579,16 @@ void hid_debug_event(struct hid_device *hdev, char *buf) | |||
| 579 | { | 579 | { |
| 580 | int i; | 580 | int i; |
| 581 | struct hid_debug_list *list; | 581 | struct hid_debug_list *list; |
| 582 | unsigned long flags; | ||
| 582 | 583 | ||
| 583 | mutex_lock(&hdev->debug_list_lock); | 584 | spin_lock_irqsave(&hdev->debug_list_lock, flags); |
| 584 | list_for_each_entry(list, &hdev->debug_list, node) { | 585 | list_for_each_entry(list, &hdev->debug_list, node) { |
| 585 | for (i = 0; i < strlen(buf); i++) | 586 | for (i = 0; i < strlen(buf); i++) |
| 586 | list->hid_debug_buf[(list->tail + i) % HID_DEBUG_BUFSIZE] = | 587 | list->hid_debug_buf[(list->tail + i) % HID_DEBUG_BUFSIZE] = |
| 587 | buf[i]; | 588 | buf[i]; |
| 588 | list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE; | 589 | list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE; |
| 589 | } | 590 | } |
| 590 | mutex_unlock(&hdev->debug_list_lock); | 591 | spin_unlock_irqrestore(&hdev->debug_list_lock, flags); |
| 591 | 592 | ||
| 592 | wake_up_interruptible(&hdev->debug_wait); | 593 | wake_up_interruptible(&hdev->debug_wait); |
| 593 | } | 594 | } |
| @@ -977,6 +978,7 @@ static int hid_debug_events_open(struct inode *inode, struct file *file) | |||
| 977 | { | 978 | { |
| 978 | int err = 0; | 979 | int err = 0; |
| 979 | struct hid_debug_list *list; | 980 | struct hid_debug_list *list; |
| 981 | unsigned long flags; | ||
| 980 | 982 | ||
| 981 | if (!(list = kzalloc(sizeof(struct hid_debug_list), GFP_KERNEL))) { | 983 | if (!(list = kzalloc(sizeof(struct hid_debug_list), GFP_KERNEL))) { |
| 982 | err = -ENOMEM; | 984 | err = -ENOMEM; |
| @@ -992,9 +994,9 @@ static int hid_debug_events_open(struct inode *inode, struct file *file) | |||
| 992 | file->private_data = list; | 994 | file->private_data = list; |
| 993 | mutex_init(&list->read_mutex); | 995 | mutex_init(&list->read_mutex); |
| 994 | 996 | ||
| 995 | mutex_lock(&list->hdev->debug_list_lock); | 997 | spin_lock_irqsave(&list->hdev->debug_list_lock, flags); |
| 996 | list_add_tail(&list->node, &list->hdev->debug_list); | 998 | list_add_tail(&list->node, &list->hdev->debug_list); |
| 997 | mutex_unlock(&list->hdev->debug_list_lock); | 999 | spin_unlock_irqrestore(&list->hdev->debug_list_lock, flags); |
| 998 | 1000 | ||
| 999 | out: | 1001 | out: |
| 1000 | return err; | 1002 | return err; |
| @@ -1088,10 +1090,11 @@ static unsigned int hid_debug_events_poll(struct file *file, poll_table *wait) | |||
| 1088 | static int hid_debug_events_release(struct inode *inode, struct file *file) | 1090 | static int hid_debug_events_release(struct inode *inode, struct file *file) |
| 1089 | { | 1091 | { |
| 1090 | struct hid_debug_list *list = file->private_data; | 1092 | struct hid_debug_list *list = file->private_data; |
| 1093 | unsigned long flags; | ||
| 1091 | 1094 | ||
| 1092 | mutex_lock(&list->hdev->debug_list_lock); | 1095 | spin_lock_irqsave(&list->hdev->debug_list_lock, flags); |
| 1093 | list_del(&list->node); | 1096 | list_del(&list->node); |
| 1094 | mutex_unlock(&list->hdev->debug_list_lock); | 1097 | spin_unlock_irqrestore(&list->hdev->debug_list_lock, flags); |
| 1095 | kfree(list->hid_debug_buf); | 1098 | kfree(list->hid_debug_buf); |
| 1096 | kfree(list); | 1099 | kfree(list); |
| 1097 | 1100 | ||
diff --git a/include/linux/hid.h b/include/linux/hid.h index af1b86d46f6e..0c48991b0402 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
| @@ -515,7 +515,7 @@ struct hid_device { /* device report descriptor */ | |||
| 515 | struct dentry *debug_rdesc; | 515 | struct dentry *debug_rdesc; |
| 516 | struct dentry *debug_events; | 516 | struct dentry *debug_events; |
| 517 | struct list_head debug_list; | 517 | struct list_head debug_list; |
| 518 | struct mutex debug_list_lock; | 518 | spinlock_t debug_list_lock; |
| 519 | wait_queue_head_t debug_wait; | 519 | wait_queue_head_t debug_wait; |
| 520 | }; | 520 | }; |
| 521 | 521 | ||
