* [MPTCP] [PATCH v3 04/13] mptcp: introduce mptcp_schedule_work
@ 2020-10-02 9:26 Paolo Abeni
0 siblings, 0 replies; only message in thread
From: Paolo Abeni @ 2020-10-02 9:26 UTC (permalink / raw)
To: mptcp
[-- Attachment #1: Type: text/plain, Size: 3521 bytes --]
remove some of code duplications an allow preventing
rescheduling on close.
Signed-off-by: Paolo Abeni <pabeni(a)redhat.com>
---
net/mptcp/pm.c | 3 +--
net/mptcp/protocol.c | 33 +++++++++++++++++++--------------
net/mptcp/protocol.h | 1 +
3 files changed, 21 insertions(+), 16 deletions(-)
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 7e81f53d1e5d..ccaa95693054 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -89,8 +89,7 @@ static bool mptcp_pm_schedule_work(struct mptcp_sock *msk,
return false;
msk->pm.status |= BIT(new_status);
- if (schedule_work(&msk->work))
- sock_hold((struct sock *)msk);
+ mptcp_schedule_work((struct sock *)msk);
return true;
}
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 4501e91d53dd..42f11dfaea67 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -603,9 +603,8 @@ static bool move_skbs_to_msk(struct mptcp_sock *msk, struct sock *ssk)
* this is not a good place to change state. Let the workqueue
* do it.
*/
- if (mptcp_pending_data_fin(sk, NULL) &&
- schedule_work(&msk->work))
- sock_hold(sk);
+ if (mptcp_pending_data_fin(sk, NULL))
+ mptcp_schedule_work(sk);
}
spin_unlock_bh(&sk->sk_lock.slock);
@@ -682,23 +681,29 @@ static void mptcp_reset_timer(struct sock *sk)
sk_reset_timer(sk, &icsk->icsk_retransmit_timer, jiffies + tout);
}
+bool mptcp_schedule_work(struct sock *sk)
+{
+ if (inet_sk_state_load(sk) != TCP_CLOSE &&
+ schedule_work(&mptcp_sk(sk)->work)) {
+ sock_hold(sk);
+ return true;
+ }
+ return false;
+}
+
void mptcp_data_acked(struct sock *sk)
{
mptcp_reset_timer(sk);
if ((!test_bit(MPTCP_SEND_SPACE, &mptcp_sk(sk)->flags) ||
- (inet_sk_state_load(sk) != TCP_ESTABLISHED)) &&
- schedule_work(&mptcp_sk(sk)->work))
- sock_hold(sk);
+ (inet_sk_state_load(sk) != TCP_ESTABLISHED)))
+ mptcp_schedule_work(sk);
}
void mptcp_subflow_eof(struct sock *sk)
{
- struct mptcp_sock *msk = mptcp_sk(sk);
-
- if (!test_and_set_bit(MPTCP_WORK_EOF, &msk->flags) &&
- schedule_work(&msk->work))
- sock_hold(sk);
+ if (!test_and_set_bit(MPTCP_WORK_EOF, &mptcp_sk(sk)->flags))
+ mptcp_schedule_work(sk);
}
static void mptcp_check_for_eof(struct mptcp_sock *msk)
@@ -1612,8 +1617,7 @@ static void mptcp_retransmit_handler(struct sock *sk)
mptcp_stop_timer(sk);
} else {
set_bit(MPTCP_WORK_RTX, &msk->flags);
- if (schedule_work(&msk->work))
- sock_hold(sk);
+ mptcp_schedule_work(sk);
}
}
@@ -2314,7 +2318,8 @@ static void mptcp_release_cb(struct sock *sk)
struct sock *ssk;
ssk = mptcp_subflow_recv_lookup(msk);
- if (!ssk || !schedule_work(&msk->work))
+ if (!ssk || sk->sk_state == TCP_CLOSE ||
+ !schedule_work(&msk->work))
__sock_put(sk);
}
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index a47307c82831..50585311998c 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -405,6 +405,7 @@ static inline bool mptcp_is_fully_established(struct sock *sk)
void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
void mptcp_data_ready(struct sock *sk, struct sock *ssk);
bool mptcp_finish_join(struct sock *sk);
+bool mptcp_schedule_work(struct sock *sk);
void mptcp_data_acked(struct sock *sk);
void mptcp_subflow_eof(struct sock *sk);
bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
--
2.26.2
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2020-10-02 9:26 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-02 9:26 [MPTCP] [PATCH v3 04/13] mptcp: introduce mptcp_schedule_work Paolo Abeni
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.