Skip to content

Commit a81771a

Browse files
Paolo Abeniintel-lab-lkp
authored andcommitted
mptcp: cleanup mem accounting.
After the previous patch, updating sk_forward_memory is cheap and we can drop a lot of complexity from the MPTCP memory acconting, removing the custom fwd mem allocations for rmem. Signed-off-by: Paolo Abeni <[email protected]>
1 parent 5a3afe4 commit a81771a

File tree

3 files changed

+13
-121
lines changed

3 files changed

+13
-121
lines changed

net/mptcp/fastopen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subf
5151
mptcp_data_lock(sk);
5252
DEBUG_NET_WARN_ON_ONCE(sock_owned_by_user_nocheck(sk));
5353

54-
mptcp_set_owner_r(skb, sk);
54+
skb_set_owner_r(skb, sk);
5555
__skb_queue_tail(&sk->sk_receive_queue, skb);
5656
mptcp_sk(sk)->bytes_received += skb->len;
5757

net/mptcp/protocol.c

Lines changed: 11 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,6 @@ static void mptcp_drop(struct sock *sk, struct sk_buff *skb)
118118
__kfree_skb(skb);
119119
}
120120

121-
static void mptcp_rmem_fwd_alloc_add(struct sock *sk, int size)
122-
{
123-
WRITE_ONCE(mptcp_sk(sk)->rmem_fwd_alloc,
124-
mptcp_sk(sk)->rmem_fwd_alloc + size);
125-
}
126-
127-
static void mptcp_rmem_charge(struct sock *sk, int size)
128-
{
129-
mptcp_rmem_fwd_alloc_add(sk, -size);
130-
}
131-
132121
static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
133122
struct sk_buff *from)
134123
{
@@ -149,7 +138,7 @@ static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
149138
* negative one
150139
*/
151140
atomic_add(delta, &sk->sk_rmem_alloc);
152-
mptcp_rmem_charge(sk, delta);
141+
sk_mem_charge(sk, delta);
153142
kfree_skb_partial(from, fragstolen);
154143

155144
return true;
@@ -164,44 +153,6 @@ static bool mptcp_ooo_try_coalesce(struct mptcp_sock *msk, struct sk_buff *to,
164153
return mptcp_try_coalesce((struct sock *)msk, to, from);
165154
}
166155

167-
static void __mptcp_rmem_reclaim(struct sock *sk, int amount)
168-
{
169-
amount >>= PAGE_SHIFT;
170-
mptcp_rmem_charge(sk, amount << PAGE_SHIFT);
171-
__sk_mem_reduce_allocated(sk, amount);
172-
}
173-
174-
static void mptcp_rmem_uncharge(struct sock *sk, int size)
175-
{
176-
struct mptcp_sock *msk = mptcp_sk(sk);
177-
int reclaimable;
178-
179-
mptcp_rmem_fwd_alloc_add(sk, size);
180-
reclaimable = msk->rmem_fwd_alloc - sk_unused_reserved_mem(sk);
181-
182-
/* see sk_mem_uncharge() for the rationale behind the following schema */
183-
if (unlikely(reclaimable >= PAGE_SIZE))
184-
__mptcp_rmem_reclaim(sk, reclaimable);
185-
}
186-
187-
static void mptcp_rfree(struct sk_buff *skb)
188-
{
189-
unsigned int len = skb->truesize;
190-
struct sock *sk = skb->sk;
191-
192-
atomic_sub(len, &sk->sk_rmem_alloc);
193-
mptcp_rmem_uncharge(sk, len);
194-
}
195-
196-
void mptcp_set_owner_r(struct sk_buff *skb, struct sock *sk)
197-
{
198-
skb_orphan(skb);
199-
skb->sk = sk;
200-
skb->destructor = mptcp_rfree;
201-
atomic_add(skb->truesize, &sk->sk_rmem_alloc);
202-
mptcp_rmem_charge(sk, skb->truesize);
203-
}
204-
205156
/* "inspired" by tcp_data_queue_ofo(), main differences:
206157
* - use mptcp seqs
207158
* - don't cope with sacks
@@ -314,25 +265,7 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb)
314265

315266
end:
316267
skb_condense(skb);
317-
mptcp_set_owner_r(skb, sk);
318-
}
319-
320-
static bool mptcp_rmem_schedule(struct sock *sk, struct sock *ssk, int size)
321-
{
322-
struct mptcp_sock *msk = mptcp_sk(sk);
323-
int amt, amount;
324-
325-
if (size <= msk->rmem_fwd_alloc)
326-
return true;
327-
328-
size -= msk->rmem_fwd_alloc;
329-
amt = sk_mem_pages(size);
330-
amount = amt << PAGE_SHIFT;
331-
if (!__sk_mem_raise_allocated(sk, size, amt, SK_MEM_RECV))
332-
return false;
333-
334-
mptcp_rmem_fwd_alloc_add(sk, amount);
335-
return true;
268+
skb_set_owner_r(skb, sk);
336269
}
337270

338271
static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
@@ -350,7 +283,7 @@ static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
350283
skb_orphan(skb);
351284

352285
/* try to fetch required memory from subflow */
353-
if (!mptcp_rmem_schedule(sk, ssk, skb->truesize)) {
286+
if (!sk_rmem_schedule(sk, skb, skb->truesize)) {
354287
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RCVPRUNED);
355288
goto drop;
356289
}
@@ -374,7 +307,7 @@ static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
374307
if (tail && mptcp_try_coalesce(sk, tail, skb))
375308
return true;
376309

377-
mptcp_set_owner_r(skb, sk);
310+
skb_set_owner_r(skb, sk);
378311
__skb_queue_tail(&sk->sk_receive_queue, skb);
379312
return true;
380313
} else if (after64(MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq)) {
@@ -1077,17 +1010,10 @@ static void __mptcp_clean_una(struct sock *sk)
10771010

10781011
static void __mptcp_clean_una_wakeup(struct sock *sk)
10791012
{
1080-
lockdep_assert_held_once(&sk->sk_lock.slock);
1081-
10821013
__mptcp_clean_una(sk);
10831014
mptcp_write_space(sk);
10841015
}
10851016

1086-
static void mptcp_clean_una_wakeup(struct sock *sk)
1087-
{
1088-
__mptcp_clean_una_wakeup(sk);
1089-
}
1090-
10911017
static void mptcp_enter_memory_pressure(struct sock *sk)
10921018
{
10931019
struct mptcp_subflow_context *subflow;
@@ -1992,9 +1918,10 @@ static int __mptcp_recvmsg_mskq(struct sock *sk,
19921918
}
19931919

19941920
if (!(flags & MSG_PEEK)) {
1995-
/* we will bulk release the skb memory later */
1921+
/* avoid the indirect call, we know the destructor is sock_wfree */
19961922
skb->destructor = NULL;
1997-
WRITE_ONCE(msk->rmem_released, msk->rmem_released + skb->truesize);
1923+
atomic_sub(skb->truesize, &sk->sk_rmem_alloc);
1924+
sk_mem_uncharge(sk, skb->truesize);
19981925
__skb_unlink(skb, &sk->sk_receive_queue);
19991926
__kfree_skb(skb);
20001927
msk->bytes_consumed += count;
@@ -2107,18 +2034,6 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied)
21072034
msk->rcvq_space.time = mstamp;
21082035
}
21092036

2110-
static void __mptcp_update_rmem(struct sock *sk)
2111-
{
2112-
struct mptcp_sock *msk = mptcp_sk(sk);
2113-
2114-
if (!msk->rmem_released)
2115-
return;
2116-
2117-
atomic_sub(msk->rmem_released, &sk->sk_rmem_alloc);
2118-
mptcp_rmem_uncharge(sk, msk->rmem_released);
2119-
WRITE_ONCE(msk->rmem_released, 0);
2120-
}
2121-
21222037
static bool __mptcp_move_skbs(struct sock *sk)
21232038
{
21242039
struct mptcp_sock *msk = mptcp_sk(sk);
@@ -2133,7 +2048,6 @@ static bool __mptcp_move_skbs(struct sock *sk)
21332048
break;
21342049

21352050
slowpath = lock_sock_fast(ssk);
2136-
__mptcp_update_rmem(sk);
21372051
done = __mptcp_move_skbs_from_subflow(msk, ssk, &moved);
21382052

21392053
if (unlikely(ssk->sk_err))
@@ -2143,10 +2057,9 @@ static bool __mptcp_move_skbs(struct sock *sk)
21432057

21442058
ret = moved > 0;
21452059
if (!RB_EMPTY_ROOT(&msk->out_of_order_queue) ||
2146-
!skb_queue_empty(&sk->sk_receive_queue)) {
2147-
__mptcp_update_rmem(sk);
2060+
!skb_queue_empty(&sk->sk_receive_queue))
21482061
ret |= __mptcp_ofo_queue(msk);
2149-
}
2062+
21502063
if (ret)
21512064
mptcp_check_data_fin((struct sock *)msk);
21522065
return ret;
@@ -2371,17 +2284,13 @@ bool __mptcp_retransmit_pending_data(struct sock *sk)
23712284
* some data in the mptcp rtx queue has not really xmitted yet.
23722285
* keep it simple and re-inject the whole mptcp level rtx queue
23732286
*/
2374-
mptcp_data_lock(sk);
23752287
__mptcp_clean_una_wakeup(sk);
23762288
rtx_head = mptcp_rtx_head(sk);
2377-
if (!rtx_head) {
2378-
mptcp_data_unlock(sk);
2289+
if (!rtx_head)
23792290
return false;
2380-
}
23812291

23822292
msk->recovery_snd_nxt = msk->snd_nxt;
23832293
msk->recovery = true;
2384-
mptcp_data_unlock(sk);
23852294

23862295
msk->first_pending = rtx_head;
23872296
msk->snd_burst = 0;
@@ -2640,7 +2549,7 @@ static void __mptcp_retrans(struct sock *sk)
26402549
int ret, err;
26412550
u16 len = 0;
26422551

2643-
mptcp_clean_una_wakeup(sk);
2552+
__mptcp_clean_una_wakeup(sk);
26442553

26452554
/* first check ssk: need to kick "stale" logic */
26462555
err = mptcp_sched_get_retrans(msk);
@@ -2813,8 +2722,6 @@ static void __mptcp_init_sock(struct sock *sk)
28132722
INIT_WORK(&msk->work, mptcp_worker);
28142723
msk->out_of_order_queue = RB_ROOT;
28152724
msk->first_pending = NULL;
2816-
WRITE_ONCE(msk->rmem_fwd_alloc, 0);
2817-
WRITE_ONCE(msk->rmem_released, 0);
28182725
msk->timer_ival = TCP_RTO_MIN;
28192726
msk->scaling_ratio = TCP_DEFAULT_SCALING_RATIO;
28202727

@@ -3040,8 +2947,6 @@ static void __mptcp_destroy_sock(struct sock *sk)
30402947

30412948
sk->sk_prot->destroy(sk);
30422949

3043-
WARN_ON_ONCE(READ_ONCE(msk->rmem_fwd_alloc));
3044-
WARN_ON_ONCE(msk->rmem_released);
30452950
sk_stream_kill_queues(sk);
30462951
xfrm_sk_free_policy(sk);
30472952

@@ -3399,8 +3304,6 @@ void mptcp_destroy_common(struct mptcp_sock *msk, unsigned int flags)
33993304
/* move all the rx fwd alloc into the sk_mem_reclaim_final in
34003305
* inet_sock_destruct() will dispose it
34013306
*/
3402-
sk_forward_alloc_add(sk, msk->rmem_fwd_alloc);
3403-
WRITE_ONCE(msk->rmem_fwd_alloc, 0);
34043307
mptcp_token_destroy(msk);
34053308
mptcp_pm_free_anno_list(msk);
34063309
mptcp_free_local_addr_list(msk);
@@ -3493,8 +3396,6 @@ static void mptcp_release_cb(struct sock *sk)
34933396
if (__test_and_clear_bit(MPTCP_SYNC_SNDBUF, &msk->cb_flags))
34943397
__mptcp_sync_sndbuf(sk);
34953398
}
3496-
3497-
__mptcp_update_rmem(sk);
34983399
}
34993400

35003401
/* MP_JOIN client subflow must wait for 4th ack before sending any data:
@@ -3665,12 +3566,6 @@ static void mptcp_shutdown(struct sock *sk, int how)
36653566
__mptcp_wr_shutdown(sk);
36663567
}
36673568

3668-
static int mptcp_forward_alloc_get(const struct sock *sk)
3669-
{
3670-
return READ_ONCE(sk->sk_forward_alloc) +
3671-
READ_ONCE(mptcp_sk(sk)->rmem_fwd_alloc);
3672-
}
3673-
36743569
static int mptcp_ioctl_outq(const struct mptcp_sock *msk, u64 v)
36753570
{
36763571
const struct sock *sk = (void *)msk;
@@ -3828,7 +3723,6 @@ static struct proto mptcp_prot = {
38283723
.hash = mptcp_hash,
38293724
.unhash = mptcp_unhash,
38303725
.get_port = mptcp_get_port,
3831-
.forward_alloc_get = mptcp_forward_alloc_get,
38323726
.stream_memory_free = mptcp_stream_memory_free,
38333727
.sockets_allocated = &mptcp_sockets_allocated,
38343728

net/mptcp/protocol.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,6 @@ struct mptcp_sock {
278278
u64 rcv_data_fin_seq;
279279
u64 bytes_retrans;
280280
u64 bytes_consumed;
281-
int rmem_fwd_alloc;
282281
int snd_burst;
283282
int old_wspace;
284283
u64 recovery_snd_nxt; /* in recovery mode accept up to this seq;
@@ -293,7 +292,6 @@ struct mptcp_sock {
293292
u32 last_ack_recv;
294293
unsigned long timer_ival;
295294
u32 token;
296-
int rmem_released;
297295
unsigned long flags;
298296
unsigned long cb_flags;
299297
bool recovery; /* closing subflow write queue reinjected */
@@ -384,7 +382,7 @@ static inline void msk_owned_by_me(const struct mptcp_sock *msk)
384382
*/
385383
static inline int __mptcp_rmem(const struct sock *sk)
386384
{
387-
return atomic_read(&sk->sk_rmem_alloc) - READ_ONCE(mptcp_sk(sk)->rmem_released);
385+
return atomic_read(&sk->sk_rmem_alloc);
388386
}
389387

390388
static inline int mptcp_win_from_space(const struct sock *sk, int space)

0 commit comments

Comments
 (0)