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 <[email protected]>
> ---
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tipc-discussion