aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-sensor-hub.c
diff options
context:
space:
mode:
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>2014-03-24 19:25:04 -0400
committerJiri Kosina <jkosina@suse.cz>2014-03-25 08:11:24 -0400
commitf74346a04b79c9a5e50a2ee5e923b94195975d17 (patch)
treee87846ec85788e4085dae6d90bed146479289b0f /drivers/hid/hid-sensor-hub.c
parent6b5625b2af30de6ff73402ad070dd21592681821 (diff)
HID: hid-sensor-hub: fix sleeping function called from invalid context
Fix issue with the sleeping calling hid_hw_request under spinlock. When i2c is used as HID transport, this is calling kmalloc, which can sleep. So remove call to this function while under spinlock. [ 1067.021961] Call Trace: [ 1067.021970] [<ffffffff8192f5f2>] dump_stack+0x4d/0x6f [ 1067.021976] [<ffffffff811109f2>] __might_sleep+0xd2/0xf0 [ 1067.021981] [<ffffffff811ea15b>] __kmalloc+0xeb/0x200 [ 1067.021989] [<ffffffff816e0cb3>] ? hid_alloc_report_buf+0x23/0x30 [ 1067.021993] [<ffffffff816e0cb3>] hid_alloc_report_buf+0x23/0x30 [ 1067.021997] [<ffffffff816f4cb7>] i2c_hid_request+0x57/0x110 [ 1067.022006] [<ffffffffa02bc61c>] sensor_hub_input_attr_get_raw_value+0xbc/0x100 [hid_sensor_hub] Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-sensor-hub.c')
-rw-r--r--drivers/hid/hid-sensor-hub.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
index 9c22e14c57f0..9021c9ce8851 100644
--- a/drivers/hid/hid-sensor-hub.c
+++ b/drivers/hid/hid-sensor-hub.c
@@ -260,13 +260,12 @@ int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
260 260
261 spin_lock_irqsave(&data->lock, flags); 261 spin_lock_irqsave(&data->lock, flags);
262 data->pending.status = true; 262 data->pending.status = true;
263 spin_unlock_irqrestore(&data->lock, flags);
263 report = sensor_hub_report(report_id, hsdev->hdev, HID_INPUT_REPORT); 264 report = sensor_hub_report(report_id, hsdev->hdev, HID_INPUT_REPORT);
264 if (!report) { 265 if (!report)
265 spin_unlock_irqrestore(&data->lock, flags);
266 goto err_free; 266 goto err_free;
267 } 267
268 hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT); 268 hid_hw_request(hsdev->hdev, report, HID_REQ_GET_REPORT);
269 spin_unlock_irqrestore(&data->lock, flags);
270 wait_for_completion_interruptible_timeout(&data->pending.ready, HZ*5); 269 wait_for_completion_interruptible_timeout(&data->pending.ready, HZ*5);
271 switch (data->pending.raw_size) { 270 switch (data->pending.raw_size) {
272 case 1: 271 case 1: