You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1414.4.18, 2003-11-09 07:15:37-02:00, acme@conectiva.com.br o IPV4: use sk_wait_event primitive af_inet.c | 13 ++++++------- tcp.c | 37 ++++++++++++------------------------- 2 files changed, 18 insertions(+), 32 deletions(-) diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c --- a/net/ipv4/af_inet.c Sat Nov 15 17:03:29 2003 +++ b/net/ipv4/af_inet.c Sat Nov 15 17:03:29 2003 @@ -568,20 +568,19 @@ { DEFINE_WAIT(wait); - prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); - /* Basic assumption: if someone sets sk->sk_err, he _must_ * change state of the socket from TCP_SYN_*. * Connect() does not allow to get error notifications * without closing the socket. */ - while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { - release_sock(sk); - timeo = schedule_timeout(timeo); - lock_sock(sk); + while (1) { + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); + if (sk_wait_event(sk, &timeo, + !((1 << sk->sk_state) & + (TCPF_SYN_SENT | TCPF_SYN_RECV)))) + break; if (signal_pending(current) || !timeo) break; - prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); } finish_wait(sk->sk_sleep, &wait); return timeo; diff -Nru a/net/ipv4/tcp.c b/net/ipv4/tcp.c --- a/net/ipv4/tcp.c Sat Nov 15 17:03:29 2003 +++ b/net/ipv4/tcp.c Sat Nov 15 17:03:29 2003 @@ -659,11 +659,12 @@ */ static int wait_for_tcp_connect(struct sock *sk, int flags, long *timeo_p) { + int rc; struct tcp_opt *tp = tcp_sk(sk); struct task_struct *tsk = current; DEFINE_WAIT(wait); - while ((1 << sk->sk_state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) { + while (1) { if (sk->sk_err) return sock_error(sk); if ((1 << sk->sk_state) & ~(TCPF_SYN_SENT | TCPF_SYN_RECV)) @@ -675,13 +676,13 @@ prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); tp->write_pending++; - - release_sock(sk); - *timeo_p = schedule_timeout(*timeo_p); - lock_sock(sk); - + rc = sk_wait_event(sk, timeo_p, + !((1 << sk->sk_state) & + ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT))); finish_wait(sk->sk_sleep, &wait); tp->write_pending--; + if (rc) + break; } return 0; } @@ -722,10 +723,8 @@ set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); tp->write_pending++; - release_sock(sk); - if (!tcp_memory_free(sk) || vm_wait) - current_timeo = schedule_timeout(current_timeo); - lock_sock(sk); + sk_wait_event(sk, ¤t_timeo, + tcp_memory_free(sk) && vm_wait); tp->write_pending--; if (vm_wait) { @@ -1381,12 +1380,7 @@ prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); - release_sock(sk); - - if (skb_queue_empty(&sk->sk_receive_queue)) - timeo = schedule_timeout(timeo); - - lock_sock(sk); + sk_wait_event(sk, &timeo, !skb_queue_empty(&sk->sk_receive_queue)); clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); finish_wait(sk->sk_sleep, &wait); @@ -2015,11 +2009,8 @@ do { prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); - if (!closing(sk)) + if (sk_wait_event(sk, &timeout, !closing(sk))) break; - release_sock(sk); - timeout = schedule_timeout(timeout); - lock_sock(sk); } while (!signal_pending(tsk) && timeout); finish_wait(sk->sk_sleep, &wait); @@ -2192,12 +2183,8 @@ for (;;) { prepare_to_wait_exclusive(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); - release_sock(sk); - if (!tp->accept_queue) - timeo = schedule_timeout(timeo); - lock_sock(sk); err = 0; - if (tp->accept_queue) + if (sk_wait_event(sk, &timeo, tp->accept_queue != NULL)) break; err = -EINVAL; if (sk->sk_state != TCP_LISTEN) =================================================================== This BitKeeper patch contains the following changesets: 1.1414.4.18 ## Wrapped with gzip_uu ## M'XL( (%XMC\ \6686_B.!"&/\>_8JJ5*JHKP78<)]"EVA:X6[2HBX#NZ3Y% MP;A+!"'9Q%!5%]UOOTEHNTN7EFMUT@8DR_9D_,[,,X9W<)WKK&6%*M;D'7Q, MJK'FL#[38Q2;8)E[/\0VCFRV1E MFRQ7X<9GG4%<63%+A%8K-& L%TS/*A2\%*:5]>"I_UXO# M&&W2)A-4%E107Y N,)L))FQA,Q^HTV"L09M O19S6XY7I[Q%*>QU#;]QJ%-R M"?]O&!VB(('^\(MHP3K7D"^"VS R@=[HE8$TB^((16CR"03CG R_IY347_D0 M0D-*S@\$@)5N1.E&-(Q*;?5C%$W7+[CO.WZA/.7/_-F,\=E4\^ET?\;VN'JH MB,M%@0/U_KN<\":(<+)'DNLSI_ DFTE7-OG4$8HJ_Y"D'7<_RG*;PO,K>'^V M/4SQ6^4^@_-+!EH"77O%P*]S?1GJ&>WU1<)'>Y) M^ALX[[H> UX./@C2QXR#)-;M/%IJJ+$3^)M85IKI-,QT8))*7RU?U,]1:[[4 M.CV%XW+M%"87XT]!_VK2&XVNAY/^Y:!WW? X.%C[#RL+/B%6$!>D#8P]">(VEEYLL"6V;*=J1WX/.Z6;>1Q MO[+80[Y:9QE.@N\=4)T.F+D@UG&2W04WF=9HC.J.81-7'O#8+G/P7$GZ.#;+ MI#S;5G"4+Z;!M[5>ZT#'J;FK'=]'G6FEL8K;O3*6+J?XZXZ)OA^MESMVC8U^ MI)9)'JV^E@JQ\[HE7%B(+F?-,O8N1^ JC]OQP!4 )JV?ATKIU&Q5P5$;KJX' < W3]^&])S;5:Y.NXK4/)PRG7Y%_.7?\[H@D