aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/hid-debug.c')
-rw-r--r--drivers/hid/hid-debug.c15
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
999out: 1001out:
1000 return err; 1002 return err;
@@ -1088,10 +1090,11 @@ static unsigned int hid_debug_events_poll(struct file *file, poll_table *wait)
1088static int hid_debug_events_release(struct inode *inode, struct file *file) 1090static 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