On 11/29/2016 06:03 PM, Jon Maloy wrote: > The functions tipc_wait_for_sndpkt() and tipc_wait_for_sndmsg() are very > similar. The latter function is also called from two locations, and > there will be more in the coming commits, which will all need to test on > different conditions. > > Instead of making yet another duplicates of the function, we now > introduce a new macro tipc_wait_for_cond() where the wakeup condition > can be stated as an argument to the call. This macro replaces all > current and future uses of the two functions, which can now be > eliminated. > > Signed-off-by: Jon Maloy <jon.ma...@ericsson.com> > --- > net/tipc/socket.c | 110 > +++++++++++++++++++++++++----------------------------- > 1 file changed, 51 insertions(+), 59 deletions(-) > > diff --git a/net/tipc/socket.c b/net/tipc/socket.c > index 333c5da..30732a8 100644 > --- a/net/tipc/socket.c > +++ b/net/tipc/socket.c > @@ -110,7 +110,6 @@ static void tipc_write_space(struct sock *sk); > static void tipc_sock_destruct(struct sock *sk); > static int tipc_release(struct socket *sock); > static int tipc_accept(struct socket *sock, struct socket *new_sock, int > flags); > -static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p); > static void tipc_sk_timeout(unsigned long data); > static int tipc_sk_publish(struct tipc_sock *tsk, uint scope, > struct tipc_name_seq const *seq); > @@ -334,6 +333,51 @@ static int tipc_set_sk_state(struct sock *sk, int state) > return res; > } > > +static int tipc_sk_sock_err(struct socket *sock, long *timeout) > +{ > + struct sock *sk = sock->sk; > + int err = sock_error(sk); > + int typ = sock->type; > + > + if (err) > + return err; > + if (typ == SOCK_STREAM || typ == SOCK_SEQPACKET) { > + if (sk->sk_state == TIPC_DISCONNECTING) > + return -EPIPE; > + else if (!tipc_sk_connected(sk)) > + return -ENOTCONN; > + } else if (sk->sk_shutdown & SEND_SHUTDOWN) { > + return -EPIPE; The else is for connection less sockets, so returning EPIPE does not make sense.
/Partha > + } > + if (!*timeout) > + return -EAGAIN; > + if (signal_pending(current)) > + return sock_intr_errno(*timeout); > + > + return 0; > +} > + > +#define tipc_wait_for_cond(sock_, timeout_, condition_) > \ > +({ \ > + int rc_ = 0; \ > + int done_ = 0; \ > + \ > + while (!(condition_) && !done_) { \ > + struct sock *sk_ = sock->sk; \ > + DEFINE_WAIT_FUNC(wait_, woken_wake_function); \ > + \ > + rc_ = tipc_sk_sock_err(sock_, timeout_); \ > + if (rc_) \ > + break; \ > + prepare_to_wait(sk_sleep(sk_), &wait_, \ > + TASK_INTERRUPTIBLE); \ > + done_ = sk_wait_event(sk_, timeout_, \ > + (condition_), &wait_); \ > + remove_wait_queue(sk_sleep(sk), &wait_); \ > + } \ > + rc_; \ > +}) > + > /** > * tipc_sk_create - create a TIPC socket > * @net: network namespace (must be default network) > @@ -719,7 +763,7 @@ static int tipc_sendmcast(struct socket *sock, struct > tipc_name_seq *seq, > > if (rc == -ELINKCONG) { > tsk->link_cong = 1; > - rc = tipc_wait_for_sndmsg(sock, &timeo); > + rc = tipc_wait_for_cond(sock, &timeo, !tsk->link_cong); > if (!rc) > continue; > } > @@ -828,31 +872,6 @@ static void tipc_sk_proto_rcv(struct tipc_sock *tsk, > struct sk_buff *skb, > kfree_skb(skb); > } > > -static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p) > -{ > - DEFINE_WAIT_FUNC(wait, woken_wake_function); > - struct sock *sk = sock->sk; > - struct tipc_sock *tsk = tipc_sk(sk); > - int done; > - > - do { > - int err = sock_error(sk); > - if (err) > - return err; > - if (sk->sk_shutdown & SEND_SHUTDOWN) > - return -EPIPE; > - if (!*timeo_p) > - return -EAGAIN; > - if (signal_pending(current)) > - return sock_intr_errno(*timeo_p); > - > - add_wait_queue(sk_sleep(sk), &wait); > - done = sk_wait_event(sk, timeo_p, !tsk->link_cong, &wait); > - remove_wait_queue(sk_sleep(sk), &wait); > - } while (!done); > - return 0; > -} > - > /** > * tipc_sendmsg - send message in connectionless manner > * @sock: socket structure > @@ -968,7 +987,7 @@ static int __tipc_sendmsg(struct socket *sock, struct > msghdr *m, size_t dsz) > } > if (rc == -ELINKCONG) { > tsk->link_cong = 1; > - rc = tipc_wait_for_sndmsg(sock, &timeo); > + rc = tipc_wait_for_cond(sock, &timeo, !tsk->link_cong); > if (!rc) > continue; > } > @@ -983,36 +1002,6 @@ static int __tipc_sendmsg(struct socket *sock, struct > msghdr *m, size_t dsz) > return rc; > } > > -static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p) > -{ > - DEFINE_WAIT_FUNC(wait, woken_wake_function); > - struct sock *sk = sock->sk; > - struct tipc_sock *tsk = tipc_sk(sk); > - int done; > - > - do { > - int err = sock_error(sk); > - if (err) > - return err; > - if (sk->sk_state == TIPC_DISCONNECTING) > - return -EPIPE; > - else if (!tipc_sk_connected(sk)) > - return -ENOTCONN; > - if (!*timeo_p) > - return -EAGAIN; > - if (signal_pending(current)) > - return sock_intr_errno(*timeo_p); > - > - add_wait_queue(sk_sleep(sk), &wait); > - done = sk_wait_event(sk, timeo_p, > - (!tsk->link_cong && > - !tsk_conn_cong(tsk)) || > - !tipc_sk_connected(sk), &wait); > - remove_wait_queue(sk_sleep(sk), &wait); > - } while (!done); > - return 0; > -} > - > /** > * tipc_send_stream - send stream-oriented data > * @sock: socket structure > @@ -1107,7 +1096,10 @@ static int __tipc_send_stream(struct socket *sock, > struct msghdr *m, size_t dsz) > > tsk->link_cong = 1; > } > - rc = tipc_wait_for_sndpkt(sock, &timeo); > + rc = tipc_wait_for_cond(sock, &timeo, > + (!tsk->link_cong && > + !tsk_conn_cong(tsk) && > + tipc_sk_connected(sk))); > } while (!rc); > > __skb_queue_purge(&pktchain); > ------------------------------------------------------------------------------ Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today.http://sdm.link/xeonphi _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion