mptcp: add accounting for pending data
Preparation patch to track the data pending in the msk write queue. No functional change introduced here Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
caf971df01
commit
f0e6a4cf11
@@ -1859,6 +1859,7 @@ static int __mptcp_init_sock(struct sock *sk)
|
|||||||
__set_bit(MPTCP_SEND_SPACE, &msk->flags);
|
__set_bit(MPTCP_SEND_SPACE, &msk->flags);
|
||||||
INIT_WORK(&msk->work, mptcp_worker);
|
INIT_WORK(&msk->work, mptcp_worker);
|
||||||
msk->out_of_order_queue = RB_ROOT;
|
msk->out_of_order_queue = RB_ROOT;
|
||||||
|
msk->first_pending = NULL;
|
||||||
|
|
||||||
msk->first = NULL;
|
msk->first = NULL;
|
||||||
inet_csk(sk)->icsk_sync_mss = mptcp_sync_mss;
|
inet_csk(sk)->icsk_sync_mss = mptcp_sync_mss;
|
||||||
|
|||||||
@@ -187,9 +187,10 @@ struct mptcp_pm_data {
|
|||||||
struct mptcp_data_frag {
|
struct mptcp_data_frag {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
u64 data_seq;
|
u64 data_seq;
|
||||||
int data_len;
|
u16 data_len;
|
||||||
int offset;
|
u16 offset;
|
||||||
int overhead;
|
u16 overhead;
|
||||||
|
u16 already_sent;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -219,6 +220,7 @@ struct mptcp_sock {
|
|||||||
struct rb_root out_of_order_queue;
|
struct rb_root out_of_order_queue;
|
||||||
struct list_head conn_list;
|
struct list_head conn_list;
|
||||||
struct list_head rtx_queue;
|
struct list_head rtx_queue;
|
||||||
|
struct mptcp_data_frag *first_pending;
|
||||||
struct list_head join_list;
|
struct list_head join_list;
|
||||||
struct skb_ext *cached_ext; /* for the next sendmsg */
|
struct skb_ext *cached_ext; /* for the next sendmsg */
|
||||||
struct socket *subflow; /* outgoing connect/listener/!mp_capable */
|
struct socket *subflow; /* outgoing connect/listener/!mp_capable */
|
||||||
@@ -240,6 +242,36 @@ static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
|
|||||||
return (struct mptcp_sock *)sk;
|
return (struct mptcp_sock *)sk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk)
|
||||||
|
{
|
||||||
|
const struct mptcp_sock *msk = mptcp_sk(sk);
|
||||||
|
|
||||||
|
return READ_ONCE(msk->first_pending);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk)
|
||||||
|
{
|
||||||
|
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||||
|
struct mptcp_data_frag *cur;
|
||||||
|
|
||||||
|
cur = msk->first_pending;
|
||||||
|
return list_is_last(&cur->list, &msk->rtx_queue) ? NULL :
|
||||||
|
list_next_entry(cur, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk)
|
||||||
|
{
|
||||||
|
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||||
|
|
||||||
|
if (!msk->first_pending)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (WARN_ON_ONCE(list_empty(&msk->rtx_queue)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct mptcp_data_frag *mptcp_rtx_tail(const struct sock *sk)
|
static inline struct mptcp_data_frag *mptcp_rtx_tail(const struct sock *sk)
|
||||||
{
|
{
|
||||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||||
|
|||||||
Reference in New Issue
Block a user