All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 1/6] Bluetooth: Fix __hci_req_sync
@ 2013-03-08 14:20 Andre Guedes
  2013-03-08 14:20 ` [PATCH v3 2/6] Bluetooth: Return ENODATA in hci_req_run Andre Guedes
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Andre Guedes @ 2013-03-08 14:20 UTC (permalink / raw)
  To: linux-bluetooth

If hci_req_run returns error, we erroneously leave the current
process in TASK_INTERRUPTABLE state. If we leave the process in
TASK_INTERRUPTABLE and it is preempted, this process will never
be scheduled again.

This patch fixes this issue by moving the preparation for scheduling
(add to waitqueue and set process state) to just after the hci_req_run
call.

Signed-off-by: Andre Guedes <andre.guedes@openbossa.org>
Acked-by: Johan Hedberg <johan.hedberg@intel.com>
---
 net/bluetooth/hci_core.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index b6d44a2..a3e3c96 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -95,15 +95,11 @@ static int __hci_req_sync(struct hci_dev *hdev,
 
 	hdev->req_status = HCI_REQ_PEND;
 
-	add_wait_queue(&hdev->req_wait_q, &wait);
-	set_current_state(TASK_INTERRUPTIBLE);
-
 	func(&req, opt);
 
 	err = hci_req_run(&req, hci_req_sync_complete);
 	if (err < 0) {
 		hdev->req_status = 0;
-		remove_wait_queue(&hdev->req_wait_q, &wait);
 		/* req_run will fail if the request did not add any
 		 * commands to the queue, something that can happen when
 		 * a request with conditionals doesn't trigger any
@@ -113,6 +109,9 @@ static int __hci_req_sync(struct hci_dev *hdev,
 		return 0;
 	}
 
+	add_wait_queue(&hdev->req_wait_q, &wait);
+	set_current_state(TASK_INTERRUPTIBLE);
+
 	schedule_timeout(timeout);
 
 	remove_wait_queue(&hdev->req_wait_q, &wait);
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-03-09 20:13 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-08 14:20 [PATCH v3 1/6] Bluetooth: Fix __hci_req_sync Andre Guedes
2013-03-08 14:20 ` [PATCH v3 2/6] Bluetooth: Return ENODATA in hci_req_run Andre Guedes
2013-03-08 14:20 ` [PATCH v3 3/6] Bluetooth: Check hci_req_run returning value in __hci_req_sync Andre Guedes
2013-03-08 14:20 ` [PATCH v3 4/6] Bluetooth: HCI request error handling Andre Guedes
2013-03-08 14:20 ` [PATCH v3 5/6] Bluetooth: Make hci_req_add returning void Andre Guedes
2013-03-08 14:20 ` [PATCH v3 6/6] Bluetooth: Check req->err in hci_req_add Andre Guedes
2013-03-09 20:13   ` Gustavo Padovan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.