Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[platform/kernel/linux-starfive.git] / net / mptcp / protocol.c
index cc21faf..2caad4a 100644 (file)
@@ -167,8 +167,8 @@ static bool mptcp_ooo_try_coalesce(struct mptcp_sock *msk, struct sk_buff *to,
 
 static void __mptcp_rmem_reclaim(struct sock *sk, int amount)
 {
-       amount >>= SK_MEM_QUANTUM_SHIFT;
-       mptcp_sk(sk)->rmem_fwd_alloc -= amount << SK_MEM_QUANTUM_SHIFT;
+       amount >>= PAGE_SHIFT;
+       mptcp_sk(sk)->rmem_fwd_alloc -= amount << PAGE_SHIFT;
        __sk_mem_reduce_allocated(sk, amount);
 }
 
@@ -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)
@@ -323,20 +323,16 @@ static bool mptcp_rmem_schedule(struct sock *sk, struct sock *ssk, int size)
        struct mptcp_sock *msk = mptcp_sk(sk);
        int amt, amount;
 
-       if (size < msk->rmem_fwd_alloc)
+       if (size <= msk->rmem_fwd_alloc)
                return true;
 
+       size -= msk->rmem_fwd_alloc;
        amt = sk_mem_pages(size);
-       amount = amt << SK_MEM_QUANTUM_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;
-               }
+       amount = amt << PAGE_SHIFT;
+       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;
 }
 
@@ -971,25 +967,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 > SK_MEM_QUANTUM)
-               __mptcp_rmem_reclaim(sk, reclaimable - 1);
-
-       sk_mem_reclaim_partial(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);
@@ -1009,7 +986,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
@@ -1032,7 +1008,6 @@ static void __mptcp_clean_una(struct sock *sk)
                }
 
                dfrag_clear(sk, dfrag);
-               cleaned = true;
        }
 
        dfrag = mptcp_rtx_head(sk);
@@ -1054,7 +1029,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 */
@@ -1062,9 +1036,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))
@@ -1216,12 +1187,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);
 }
 
@@ -3464,7 +3429,10 @@ static struct proto mptcp_prot = {
        .get_port       = mptcp_get_port,
        .forward_alloc_get      = mptcp_forward_alloc_get,
        .sockets_allocated      = &mptcp_sockets_allocated,
+
        .memory_allocated       = &tcp_memory_allocated,
+       .per_cpu_fw_alloc       = &tcp_memory_per_cpu_fw_alloc,
+
        .memory_pressure        = &tcp_memory_pressure,
        .sysctl_wmem_offset     = offsetof(struct net, ipv4.sysctl_tcp_wmem),
        .sysctl_rmem_offset     = offsetof(struct net, ipv4.sysctl_tcp_rmem),