[openib-general] [PATCH] sdp_inet: fix schedule_timeout() usage
Libor Michalek
libor at topspin.com
Wed Jun 29 11:14:40 PDT 2005
On Tue, Jun 28, 2005 at 01:48:55PM -0700, Nishanth Aravamudan wrote:
>
> Using schedule_timeout() without setting the state first is broken and
> causes schedule_timeout() to return immediately (effectively you call
> schedule() without changing your state and are thus going to run again).
> In each of these loops in sdp_inet.c involving schedule_timeout(), the
> first iteration is correct, but subsequent ones result in busy-wait. Add
> the appropriate set_current_state() call to fix the issue.
Nish,
Thank you for the patch. I'm wondering if it would be better to just
move the existing call to set_current_state(TASK_INTERRUPTIBLE) from
outside the loop to inside at the begining, as below?
-Libor
Index: sdp_inet.c
===================================================================
--- sdp_inet.c (revision 2749)
+++ sdp_inet.c (working copy)
@@ -317,10 +317,11 @@
timeout = sk->sk_lingertime;
add_wait_queue(sk->sk_sleep, &wait);
- set_current_state(TASK_INTERRUPTIBLE);
while (timeout > 0 &&
!(SDP_ST_MASK_CLOSED & conn->state)) {
+
+ set_current_state(TASK_INTERRUPTIBLE);
sdp_conn_unlock(conn);
timeout = schedule_timeout(timeout);
sdp_conn_lock(conn);
@@ -554,10 +555,10 @@
DECLARE_WAITQUEUE(wait, current);
add_wait_queue(sk->sk_sleep, &wait);
- set_current_state(TASK_INTERRUPTIBLE);
while (timeout > 0 && (conn->state & SDP_ST_MASK_CONNECT)) {
+ set_current_state(TASK_INTERRUPTIBLE);
sdp_conn_unlock(conn);
timeout = schedule_timeout(timeout);
sdp_conn_lock(conn);
@@ -710,11 +711,12 @@
if (!accept_conn) {
DECLARE_WAITQUEUE(wait, current);
add_wait_queue(listen_sk->sk_sleep, &wait);
- set_current_state(TASK_INTERRUPTIBLE);
while (timeout > 0 &&
listen_conn->state == SDP_CONN_ST_LISTEN &&
!listen_conn->backlog_cnt) {
+
+ set_current_state(TASK_INTERRUPTIBLE);
sdp_conn_unlock(listen_conn);
timeout = schedule_timeout(timeout);
sdp_conn_lock(listen_conn);
More information about the general
mailing list