mptcp: add and use mptcp_data_ready helper
authorFlorian Westphal <fw@strlen.de>
Wed, 26 Feb 2020 09:14:46 +0000 (10:14 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 27 Feb 2020 04:46:26 +0000 (20:46 -0800)
allows us to schedule the work queue to drain the ssk receive queue in
a followup patch.

This is needed to avoid sending all-to-pessimistic mptcp-level
acknowledgements.  At this time, the ack_seq is what was last read by
userspace instead of the highest in-sequence number queued for reading.

Signed-off-by: Florian Westphal <fw@strlen.de>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/protocol.c
net/mptcp/protocol.h
net/mptcp/subflow.c

index e9aa6807b5bed04ec5fe53cca812d7fed4c6df45..1d55563e9aca242c3e7fa72f5edda0a644e0f963 100644 (file)
@@ -111,6 +111,14 @@ static struct sock *mptcp_subflow_get(const struct mptcp_sock *msk)
        return NULL;
 }
 
+void mptcp_data_ready(struct sock *sk)
+{
+       struct mptcp_sock *msk = mptcp_sk(sk);
+
+       set_bit(MPTCP_DATA_READY, &msk->flags);
+       sk->sk_data_ready(sk);
+}
+
 static bool mptcp_ext_cache_refill(struct mptcp_sock *msk)
 {
        if (!msk->cached_ext)
index 9f8663b30456256bfdd0e8e4d89061bc90e5281a..67895a7c1e5b31eeebf48567349ac107dcf70028 100644 (file)
@@ -201,6 +201,7 @@ void mptcp_get_options(const struct sk_buff *skb,
                       struct tcp_options_received *opt_rx);
 
 void mptcp_finish_connect(struct sock *sk);
+void mptcp_data_ready(struct sock *sk);
 
 int mptcp_token_new_request(struct request_sock *req);
 void mptcp_token_destroy_request(u32 token);
index 65122edf60aa65d50a431cd06d9d3b425a9dd86c..3dad662840aaf78dc8e371335170c26c9d8f0b3f 100644 (file)
@@ -554,11 +554,8 @@ static void subflow_data_ready(struct sock *sk)
                return;
        }
 
-       if (mptcp_subflow_data_available(sk)) {
-               set_bit(MPTCP_DATA_READY, &mptcp_sk(parent)->flags);
-
-               parent->sk_data_ready(parent);
-       }
+       if (mptcp_subflow_data_available(sk))
+               mptcp_data_ready(parent);
 }
 
 static void subflow_write_space(struct sock *sk)
@@ -690,11 +687,8 @@ static void subflow_state_change(struct sock *sk)
         * a fin packet carrying a DSS can be unnoticed if we don't trigger
         * the data available machinery here.
         */
-       if (parent && subflow->mp_capable && mptcp_subflow_data_available(sk)) {
-               set_bit(MPTCP_DATA_READY, &mptcp_sk(parent)->flags);
-
-               parent->sk_data_ready(parent);
-       }
+       if (parent && subflow->mp_capable && mptcp_subflow_data_available(sk))
+               mptcp_data_ready(parent);
 
        if (parent && !(parent->sk_shutdown & RCV_SHUTDOWN) &&
            !subflow->rx_eof && subflow_is_done(sk)) {