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 | ||