@@ -1108,6 +1108,7 @@ mptcp_carve_data_frag(const struct mptcp_sock *msk, struct page_frag *pfrag,
dfrag->data_seq = msk->write_seq;
dfrag->overhead = offset - orig_offset + sizeof(struct mptcp_data_frag);
dfrag->offset = offset + sizeof(struct mptcp_data_frag);
+ dfrag->sent = 0;
dfrag->already_sent = 0;
dfrag->page = pfrag->page;
@@ -1493,11 +1494,11 @@ static void mptcp_update_post_push(struct mptcp_sock *msk,
{
u64 snd_nxt_new = dfrag->data_seq;
- dfrag->already_sent += sent;
+ dfrag->sent += sent;
msk->snd_burst -= sent;
- snd_nxt_new += dfrag->already_sent;
+ snd_nxt_new += dfrag->sent;
/* snd_nxt_new can be smaller than snd_nxt in case mptcp
* is recovering after a failover. In that event, this re-sends
@@ -1522,6 +1523,18 @@ static void mptcp_update_first_pending(struct sock *sk, struct mptcp_sendmsg_inf
static void mptcp_update_dfrags(struct sock *sk, struct mptcp_sendmsg_info *info)
{
+ struct mptcp_data_frag *dfrag = mptcp_send_head(sk);
+
+ if (!dfrag)
+ return;
+
+ do {
+ if (dfrag->sent) {
+ dfrag->already_sent = max(dfrag->already_sent, dfrag->sent);
+ dfrag->sent = 0;
+ }
+ } while ((dfrag = mptcp_next_frag(sk, dfrag)));
+
mptcp_update_first_pending(sk, info);
}
@@ -1548,6 +1561,7 @@ static int __subflow_push_pending(struct sock *sk, struct sock *ssk,
info->sent = dfrag->already_sent;
info->limit = dfrag->data_len;
len = dfrag->data_len - dfrag->already_sent;
+ dfrag->sent = info->sent;
while (len > 0) {
int ret = 0;
@@ -241,6 +241,7 @@ struct mptcp_data_frag {
u16 data_len;
u16 offset;
u16 overhead;
+ u16 sent;
u16 already_sent;
struct page *page;
};
This patch adds a new member info_sent in struct mptcp_data_frag, save info->sent in it, to support delay updating already_sent of dfrag until all data are sent. Signed-off-by: Geliang Tang <geliang.tang@suse.com> --- net/mptcp/protocol.c | 18 ++++++++++++++++-- net/mptcp/protocol.h | 1 + 2 files changed, 17 insertions(+), 2 deletions(-)