On 12/06/2016 03:49 AM, Parthasarathy Bhuvaragan wrote:
> 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.

This is how it is currently done in tipc_wait_for_snd_msg(), probably a 
leftover from a time when it was used even for connections. Should I 
just leave it out, or do you suggest any other code?

///jon

>
> /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

Reply via email to