protocol.c (5e6300e7b3a4ab5b72a82079753868e91fbf9efc) protocol.c (9531e4a83febc3fb47ac77e24cfb5ea97e50034d)
1// SPDX-License-Identifier: GPL-2.0
2/* Multipath TCP
3 *
4 * Copyright (c) 2017 - 2019, Intel Corporation.
5 */
6
7#define pr_fmt(fmt) "MPTCP: " fmt
8

--- 120 unchanged lines hidden (view full) ---

129}
130
131static void mptcp_drop(struct sock *sk, struct sk_buff *skb)
132{
133 sk_drops_add(sk, skb);
134 __kfree_skb(skb);
135}
136
1// SPDX-License-Identifier: GPL-2.0
2/* Multipath TCP
3 *
4 * Copyright (c) 2017 - 2019, Intel Corporation.
5 */
6
7#define pr_fmt(fmt) "MPTCP: " fmt
8

--- 120 unchanged lines hidden (view full) ---

129}
130
131static void mptcp_drop(struct sock *sk, struct sk_buff *skb)
132{
133 sk_drops_add(sk, skb);
134 __kfree_skb(skb);
135}
136
137static void mptcp_rmem_fwd_alloc_add(struct sock *sk, int size)
138{
139 WRITE_ONCE(mptcp_sk(sk)->rmem_fwd_alloc,
140 mptcp_sk(sk)->rmem_fwd_alloc + size);
141}
142
137static void mptcp_rmem_charge(struct sock *sk, int size)
138{
143static void mptcp_rmem_charge(struct sock *sk, int size)
144{
139 mptcp_sk(sk)->rmem_fwd_alloc -= size;
145 mptcp_rmem_fwd_alloc_add(sk, -size);
140}
141
142static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
143 struct sk_buff *from)
144{
145 bool fragstolen;
146 int delta;
147

--- 24 unchanged lines hidden (view full) ---

172 return false;
173
174 return mptcp_try_coalesce((struct sock *)msk, to, from);
175}
176
177static void __mptcp_rmem_reclaim(struct sock *sk, int amount)
178{
179 amount >>= PAGE_SHIFT;
146}
147
148static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
149 struct sk_buff *from)
150{
151 bool fragstolen;
152 int delta;
153

--- 24 unchanged lines hidden (view full) ---

178 return false;
179
180 return mptcp_try_coalesce((struct sock *)msk, to, from);
181}
182
183static void __mptcp_rmem_reclaim(struct sock *sk, int amount)
184{
185 amount >>= PAGE_SHIFT;
180 mptcp_sk(sk)->rmem_fwd_alloc -= amount << PAGE_SHIFT;
186 mptcp_rmem_charge(sk, amount << PAGE_SHIFT);
181 __sk_mem_reduce_allocated(sk, amount);
182}
183
184static void mptcp_rmem_uncharge(struct sock *sk, int size)
185{
186 struct mptcp_sock *msk = mptcp_sk(sk);
187 int reclaimable;
188
187 __sk_mem_reduce_allocated(sk, amount);
188}
189
190static void mptcp_rmem_uncharge(struct sock *sk, int size)
191{
192 struct mptcp_sock *msk = mptcp_sk(sk);
193 int reclaimable;
194
189 msk->rmem_fwd_alloc += size;
195 mptcp_rmem_fwd_alloc_add(sk, size);
190 reclaimable = msk->rmem_fwd_alloc - sk_unused_reserved_mem(sk);
191
192 /* see sk_mem_uncharge() for the rationale behind the following schema */
193 if (unlikely(reclaimable >= PAGE_SIZE))
194 __mptcp_rmem_reclaim(sk, reclaimable);
195}
196
197static void mptcp_rfree(struct sk_buff *skb)

--- 138 unchanged lines hidden (view full) ---

336 return true;
337
338 size -= msk->rmem_fwd_alloc;
339 amt = sk_mem_pages(size);
340 amount = amt << PAGE_SHIFT;
341 if (!__sk_mem_raise_allocated(sk, size, amt, SK_MEM_RECV))
342 return false;
343
196 reclaimable = msk->rmem_fwd_alloc - sk_unused_reserved_mem(sk);
197
198 /* see sk_mem_uncharge() for the rationale behind the following schema */
199 if (unlikely(reclaimable >= PAGE_SIZE))
200 __mptcp_rmem_reclaim(sk, reclaimable);
201}
202
203static void mptcp_rfree(struct sk_buff *skb)

--- 138 unchanged lines hidden (view full) ---

342 return true;
343
344 size -= msk->rmem_fwd_alloc;
345 amt = sk_mem_pages(size);
346 amount = amt << PAGE_SHIFT;
347 if (!__sk_mem_raise_allocated(sk, size, amt, SK_MEM_RECV))
348 return false;
349
344 msk->rmem_fwd_alloc += amount;
350 mptcp_rmem_fwd_alloc_add(sk, amount);
345 return true;
346}
347
348static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
349 struct sk_buff *skb, unsigned int offset,
350 size_t copy_len)
351{
352 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);

--- 2900 unchanged lines hidden (view full) ---

3253 __skb_queue_purge(&sk->sk_receive_queue);
3254 skb_rbtree_purge(&msk->out_of_order_queue);
3255 mptcp_data_unlock(sk);
3256
3257 /* move all the rx fwd alloc into the sk_mem_reclaim_final in
3258 * inet_sock_destruct() will dispose it
3259 */
3260 sk_forward_alloc_add(sk, msk->rmem_fwd_alloc);
351 return true;
352}
353
354static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
355 struct sk_buff *skb, unsigned int offset,
356 size_t copy_len)
357{
358 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);

--- 2900 unchanged lines hidden (view full) ---

3259 __skb_queue_purge(&sk->sk_receive_queue);
3260 skb_rbtree_purge(&msk->out_of_order_queue);
3261 mptcp_data_unlock(sk);
3262
3263 /* move all the rx fwd alloc into the sk_mem_reclaim_final in
3264 * inet_sock_destruct() will dispose it
3265 */
3266 sk_forward_alloc_add(sk, msk->rmem_fwd_alloc);
3261 msk->rmem_fwd_alloc = 0;
3267 WRITE_ONCE(msk->rmem_fwd_alloc, 0);
3262 mptcp_token_destroy(msk);
3263 mptcp_pm_free_anno_list(msk);
3264 mptcp_free_local_addr_list(msk);
3265}
3266
3267static void mptcp_destroy(struct sock *sk)
3268{
3269 struct mptcp_sock *msk = mptcp_sk(sk);

--- 247 unchanged lines hidden (view full) ---

3517 pr_debug("sk=%p, how=%d", sk, how);
3518
3519 if ((how & SEND_SHUTDOWN) && mptcp_close_state(sk))
3520 __mptcp_wr_shutdown(sk);
3521}
3522
3523static int mptcp_forward_alloc_get(const struct sock *sk)
3524{
3268 mptcp_token_destroy(msk);
3269 mptcp_pm_free_anno_list(msk);
3270 mptcp_free_local_addr_list(msk);
3271}
3272
3273static void mptcp_destroy(struct sock *sk)
3274{
3275 struct mptcp_sock *msk = mptcp_sk(sk);

--- 247 unchanged lines hidden (view full) ---

3523 pr_debug("sk=%p, how=%d", sk, how);
3524
3525 if ((how & SEND_SHUTDOWN) && mptcp_close_state(sk))
3526 __mptcp_wr_shutdown(sk);
3527}
3528
3529static int mptcp_forward_alloc_get(const struct sock *sk)
3530{
3525 return READ_ONCE(sk->sk_forward_alloc) + mptcp_sk(sk)->rmem_fwd_alloc;
3531 return READ_ONCE(sk->sk_forward_alloc) +
3532 READ_ONCE(mptcp_sk(sk)->rmem_fwd_alloc);
3526}
3527
3528static int mptcp_ioctl_outq(const struct mptcp_sock *msk, u64 v)
3529{
3530 const struct sock *sk = (void *)msk;
3531 u64 delta;
3532
3533 if (sk->sk_state == TCP_LISTEN)

--- 501 unchanged lines hidden ---
3533}
3534
3535static int mptcp_ioctl_outq(const struct mptcp_sock *msk, u64 v)
3536{
3537 const struct sock *sk = (void *)msk;
3538 u64 delta;
3539
3540 if (sk->sk_state == TCP_LISTEN)

--- 501 unchanged lines hidden ---