* [PATCH net-next v3 1/3] mptcp: never fetch fwd memory from the subflow
@ 2022-06-20 16:19 Paolo Abeni
2022-06-20 16:19 ` [PATCH net-next v3 2/3] mptcp: drop SK_RECLAIM_* macros Paolo Abeni
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Paolo Abeni @ 2022-06-20 16:19 UTC (permalink / raw)
To: mptcp
The memory accounting is broken in such exceptional code
path, and after commit 4890b686f408 ("net: keep sk->sk_forward_alloc
as small as possible") we can't find much help there.
Drop the broken code.
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
This is possibly for net, but makes sense only on top of recent
net-next patches, so whatever ;)
---
net/mptcp/protocol.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 6d2aa41390e7..0d4b2c010da0 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -328,15 +328,10 @@ static bool mptcp_rmem_schedule(struct sock *sk, struct sock *ssk, int size)
amt = sk_mem_pages(size);
amount = amt << PAGE_SHIFT;
- msk->rmem_fwd_alloc += amount;
- if (!__sk_mem_raise_allocated(sk, size, amt, SK_MEM_RECV)) {
- if (ssk->sk_forward_alloc < amount) {
- msk->rmem_fwd_alloc -= amount;
- return false;
- }
+ if (!__sk_mem_raise_allocated(sk, size, amt, SK_MEM_RECV))
+ return false;
- ssk->sk_forward_alloc -= amount;
- }
+ msk->rmem_fwd_alloc += amount;
return true;
}
--
2.35.3
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH net-next v3 2/3] mptcp: drop SK_RECLAIM_* macros 2022-06-20 16:19 [PATCH net-next v3 1/3] mptcp: never fetch fwd memory from the subflow Paolo Abeni @ 2022-06-20 16:19 ` Paolo Abeni 2022-06-20 20:38 ` Mat Martineau 2022-06-20 16:19 ` [PATCH net-next v3 3/3] mptcp: refine memory scheduling Paolo Abeni 2022-06-20 16:46 ` [PATCH net-next v3 1/3] mptcp: never fetch fwd memory from the subflow Paolo Abeni 2 siblings, 1 reply; 6+ messages in thread From: Paolo Abeni @ 2022-06-20 16:19 UTC (permalink / raw) To: mptcp After commit 4890b686f408 ("net: keep sk->sk_forward_alloc as small as possible"), the MPTCP protocol is the last SK_RECLAIM_CHUNK and SK_RECLAIM_THRESHOLD users. Update the MPTCP reclaim schema to match the core/TCP one and drop the mentioned macros. This additionally clean the MPTCP code a bit. Signed-off-by: Paolo Abeni <pabeni@redhat.com> --- net/mptcp/protocol.c | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 0d4b2c010da0..b31bac33f87a 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -181,8 +181,8 @@ static void mptcp_rmem_uncharge(struct sock *sk, int size) reclaimable = msk->rmem_fwd_alloc - sk_unused_reserved_mem(sk); /* see sk_mem_uncharge() for the rationale behind the following schema */ - if (unlikely(reclaimable >= SK_RECLAIM_THRESHOLD)) - __mptcp_rmem_reclaim(sk, SK_RECLAIM_CHUNK); + if (unlikely(reclaimable >= PAGE_SIZE)) + __mptcp_rmem_reclaim(sk, reclaimable); } static void mptcp_rfree(struct sk_buff *skb) @@ -961,25 +961,6 @@ static bool mptcp_frag_can_collapse_to(const struct mptcp_sock *msk, df->data_seq + df->data_len == msk->write_seq; } -static void __mptcp_mem_reclaim_partial(struct sock *sk) -{ - int reclaimable = mptcp_sk(sk)->rmem_fwd_alloc - sk_unused_reserved_mem(sk); - - lockdep_assert_held_once(&sk->sk_lock.slock); - - if (reclaimable > (int)PAGE_SIZE) - __mptcp_rmem_reclaim(sk, reclaimable - 1); - - sk_mem_reclaim(sk); -} - -static void mptcp_mem_reclaim_partial(struct sock *sk) -{ - mptcp_data_lock(sk); - __mptcp_mem_reclaim_partial(sk); - mptcp_data_unlock(sk); -} - static void dfrag_uncharge(struct sock *sk, int len) { sk_mem_uncharge(sk, len); @@ -999,7 +980,6 @@ static void __mptcp_clean_una(struct sock *sk) { struct mptcp_sock *msk = mptcp_sk(sk); struct mptcp_data_frag *dtmp, *dfrag; - bool cleaned = false; u64 snd_una; /* on fallback we just need to ignore snd_una, as this is really @@ -1022,7 +1002,6 @@ static void __mptcp_clean_una(struct sock *sk) } dfrag_clear(sk, dfrag); - cleaned = true; } dfrag = mptcp_rtx_head(sk); @@ -1044,7 +1023,6 @@ static void __mptcp_clean_una(struct sock *sk) dfrag->already_sent -= delta; dfrag_uncharge(sk, delta); - cleaned = true; } /* all retransmitted data acked, recovery completed */ @@ -1052,9 +1030,6 @@ static void __mptcp_clean_una(struct sock *sk) msk->recovery = false; out: - if (cleaned && tcp_under_memory_pressure(sk)) - __mptcp_mem_reclaim_partial(sk); - if (snd_una == READ_ONCE(msk->snd_nxt) && snd_una == READ_ONCE(msk->write_seq)) { if (mptcp_timer_pending(sk) && !mptcp_data_fin_enabled(msk)) @@ -1206,12 +1181,6 @@ static struct sk_buff *mptcp_alloc_tx_skb(struct sock *sk, struct sock *ssk, boo { gfp_t gfp = data_lock_held ? GFP_ATOMIC : sk->sk_allocation; - if (unlikely(tcp_under_memory_pressure(sk))) { - if (data_lock_held) - __mptcp_mem_reclaim_partial(sk); - else - mptcp_mem_reclaim_partial(sk); - } return __mptcp_alloc_tx_skb(sk, ssk, gfp); } -- 2.35.3 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net-next v3 2/3] mptcp: drop SK_RECLAIM_* macros 2022-06-20 16:19 ` [PATCH net-next v3 2/3] mptcp: drop SK_RECLAIM_* macros Paolo Abeni @ 2022-06-20 20:38 ` Mat Martineau 0 siblings, 0 replies; 6+ messages in thread From: Mat Martineau @ 2022-06-20 20:38 UTC (permalink / raw) To: Paolo Abeni; +Cc: mptcp On Mon, 20 Jun 2022, Paolo Abeni wrote: > After commit 4890b686f408 ("net: keep sk->sk_forward_alloc as small as > possible"), the MPTCP protocol is the last SK_RECLAIM_CHUNK and > SK_RECLAIM_THRESHOLD users. > > Update the MPTCP reclaim schema to match the core/TCP one and drop the > mentioned macros. This additionally clean the MPTCP code a bit. > Please also add one more patch to the series that deletes SK_RECLAIM_* from include/net/sock.h - Mat > Signed-off-by: Paolo Abeni <pabeni@redhat.com> > --- > net/mptcp/protocol.c | 35 ++--------------------------------- > 1 file changed, 2 insertions(+), 33 deletions(-) > > diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c > index 0d4b2c010da0..b31bac33f87a 100644 > --- a/net/mptcp/protocol.c > +++ b/net/mptcp/protocol.c > @@ -181,8 +181,8 @@ static void mptcp_rmem_uncharge(struct sock *sk, int size) > reclaimable = msk->rmem_fwd_alloc - sk_unused_reserved_mem(sk); > > /* see sk_mem_uncharge() for the rationale behind the following schema */ > - if (unlikely(reclaimable >= SK_RECLAIM_THRESHOLD)) > - __mptcp_rmem_reclaim(sk, SK_RECLAIM_CHUNK); > + if (unlikely(reclaimable >= PAGE_SIZE)) > + __mptcp_rmem_reclaim(sk, reclaimable); > } > > static void mptcp_rfree(struct sk_buff *skb) > @@ -961,25 +961,6 @@ static bool mptcp_frag_can_collapse_to(const struct mptcp_sock *msk, > df->data_seq + df->data_len == msk->write_seq; > } > > -static void __mptcp_mem_reclaim_partial(struct sock *sk) > -{ > - int reclaimable = mptcp_sk(sk)->rmem_fwd_alloc - sk_unused_reserved_mem(sk); > - > - lockdep_assert_held_once(&sk->sk_lock.slock); > - > - if (reclaimable > (int)PAGE_SIZE) > - __mptcp_rmem_reclaim(sk, reclaimable - 1); > - > - sk_mem_reclaim(sk); > -} > - > -static void mptcp_mem_reclaim_partial(struct sock *sk) > -{ > - mptcp_data_lock(sk); > - __mptcp_mem_reclaim_partial(sk); > - mptcp_data_unlock(sk); > -} > - > static void dfrag_uncharge(struct sock *sk, int len) > { > sk_mem_uncharge(sk, len); > @@ -999,7 +980,6 @@ static void __mptcp_clean_una(struct sock *sk) > { > struct mptcp_sock *msk = mptcp_sk(sk); > struct mptcp_data_frag *dtmp, *dfrag; > - bool cleaned = false; > u64 snd_una; > > /* on fallback we just need to ignore snd_una, as this is really > @@ -1022,7 +1002,6 @@ static void __mptcp_clean_una(struct sock *sk) > } > > dfrag_clear(sk, dfrag); > - cleaned = true; > } > > dfrag = mptcp_rtx_head(sk); > @@ -1044,7 +1023,6 @@ static void __mptcp_clean_una(struct sock *sk) > dfrag->already_sent -= delta; > > dfrag_uncharge(sk, delta); > - cleaned = true; > } > > /* all retransmitted data acked, recovery completed */ > @@ -1052,9 +1030,6 @@ static void __mptcp_clean_una(struct sock *sk) > msk->recovery = false; > > out: > - if (cleaned && tcp_under_memory_pressure(sk)) > - __mptcp_mem_reclaim_partial(sk); > - > if (snd_una == READ_ONCE(msk->snd_nxt) && > snd_una == READ_ONCE(msk->write_seq)) { > if (mptcp_timer_pending(sk) && !mptcp_data_fin_enabled(msk)) > @@ -1206,12 +1181,6 @@ static struct sk_buff *mptcp_alloc_tx_skb(struct sock *sk, struct sock *ssk, boo > { > gfp_t gfp = data_lock_held ? GFP_ATOMIC : sk->sk_allocation; > > - if (unlikely(tcp_under_memory_pressure(sk))) { > - if (data_lock_held) > - __mptcp_mem_reclaim_partial(sk); > - else > - mptcp_mem_reclaim_partial(sk); > - } > return __mptcp_alloc_tx_skb(sk, ssk, gfp); > } > > -- > 2.35.3 > > > -- Mat Martineau Intel ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next v3 3/3] mptcp: refine memory scheduling 2022-06-20 16:19 [PATCH net-next v3 1/3] mptcp: never fetch fwd memory from the subflow Paolo Abeni 2022-06-20 16:19 ` [PATCH net-next v3 2/3] mptcp: drop SK_RECLAIM_* macros Paolo Abeni @ 2022-06-20 16:19 ` Paolo Abeni 2022-06-20 20:32 ` Mat Martineau 2022-06-20 16:46 ` [PATCH net-next v3 1/3] mptcp: never fetch fwd memory from the subflow Paolo Abeni 2 siblings, 1 reply; 6+ messages in thread From: Paolo Abeni @ 2022-06-20 16:19 UTC (permalink / raw) To: mptcp Similar to commit 7c80b038d23e ("net: fix sk_wmem_schedule() and sk_rmem_schedule() errors"), let the MPTCP receive path schedule exactly the required amount of memory. Signed-off-by: Paolo Abeni <pabeni@redhat.com> --- net/mptcp/protocol.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index b31bac33f87a..0e295b3bce54 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -326,6 +326,7 @@ static bool mptcp_rmem_schedule(struct sock *sk, struct sock *ssk, int size) if (size < msk->rmem_fwd_alloc) return true; + size -= msk->rmem_fwd_alloc; amt = sk_mem_pages(size); amount = amt << PAGE_SHIFT; if (!__sk_mem_raise_allocated(sk, size, amt, SK_MEM_RECV)) -- 2.35.3 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net-next v3 3/3] mptcp: refine memory scheduling 2022-06-20 16:19 ` [PATCH net-next v3 3/3] mptcp: refine memory scheduling Paolo Abeni @ 2022-06-20 20:32 ` Mat Martineau 0 siblings, 0 replies; 6+ messages in thread From: Mat Martineau @ 2022-06-20 20:32 UTC (permalink / raw) To: Paolo Abeni; +Cc: mptcp On Mon, 20 Jun 2022, Paolo Abeni wrote: > Similar to commit 7c80b038d23e ("net: fix sk_wmem_schedule() and > sk_rmem_schedule() errors"), let the MPTCP receive path schedule > exactly the required amount of memory. > > Signed-off-by: Paolo Abeni <pabeni@redhat.com> > --- > net/mptcp/protocol.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c > index b31bac33f87a..0e295b3bce54 100644 > --- a/net/mptcp/protocol.c > +++ b/net/mptcp/protocol.c > @@ -326,6 +326,7 @@ static bool mptcp_rmem_schedule(struct sock *sk, struct sock *ssk, int size) > if (size < msk->rmem_fwd_alloc) With the change below, also would be good to change the above line to: if (size <= msk->rmem_fwd_alloc) so there's no attempt to allocate 0 new pages. > return true; > > + size -= msk->rmem_fwd_alloc; > amt = sk_mem_pages(size); > amount = amt << PAGE_SHIFT; > if (!__sk_mem_raise_allocated(sk, size, amt, SK_MEM_RECV)) > -- > 2.35.3 > > > -- Mat Martineau Intel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net-next v3 1/3] mptcp: never fetch fwd memory from the subflow 2022-06-20 16:19 [PATCH net-next v3 1/3] mptcp: never fetch fwd memory from the subflow Paolo Abeni 2022-06-20 16:19 ` [PATCH net-next v3 2/3] mptcp: drop SK_RECLAIM_* macros Paolo Abeni 2022-06-20 16:19 ` [PATCH net-next v3 3/3] mptcp: refine memory scheduling Paolo Abeni @ 2022-06-20 16:46 ` Paolo Abeni 2 siblings, 0 replies; 6+ messages in thread From: Paolo Abeni @ 2022-06-20 16:46 UTC (permalink / raw) To: mptcp On Mon, 2022-06-20 at 18:19 +0200, Paolo Abeni wrote: > The memory accounting is broken in such exceptional code > path, and after commit 4890b686f408 ("net: keep sk->sk_forward_alloc > as small as possible") we can't find much help there. > > Drop the broken code. > > Signed-off-by: Paolo Abeni <pabeni@redhat.com> This is actually a "v2" ;) The only change is the new patch 3/3 - I even kept the obsolete comment after the commit message in patch 1/3 :) /P ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-06-20 20:38 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-06-20 16:19 [PATCH net-next v3 1/3] mptcp: never fetch fwd memory from the subflow Paolo Abeni 2022-06-20 16:19 ` [PATCH net-next v3 2/3] mptcp: drop SK_RECLAIM_* macros Paolo Abeni 2022-06-20 20:38 ` Mat Martineau 2022-06-20 16:19 ` [PATCH net-next v3 3/3] mptcp: refine memory scheduling Paolo Abeni 2022-06-20 20:32 ` Mat Martineau 2022-06-20 16:46 ` [PATCH net-next v3 1/3] mptcp: never fetch fwd memory from the subflow Paolo Abeni
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox