diff options
Diffstat (limited to 'drivers/hid/hid-debug.c')
-rw-r--r-- | drivers/hid/hid-debug.c | 15 |
1 files changed, 9 insertions, 6 deletions
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 | ||