lkml.org 
[lkml]   [2020]   [Aug]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 10/56] sctp: implement memory accounting on tx path
    Date
    From: Xin Long <lucien.xin@gmail.com>

    [ Upstream commit 1033990ac5b2ab6cee93734cb6d301aa3a35bcaa ]

    Now when sending packets, sk_mem_charge() and sk_mem_uncharge() have been
    used to set sk_forward_alloc. We just need to call sk_wmem_schedule() to
    check if the allocated should be raised, and call sk_mem_reclaim() to
    check if the allocated should be reduced when it's under memory pressure.

    If sk_wmem_schedule() returns false, which means no memory is allowed to
    allocate, it will block and wait for memory to become available.

    Note different from tcp, sctp wait_for_buf happens before allocating any
    skb, so memory accounting check is done with the whole msg_len before it
    too.

    Reported-by: Matteo Croce <mcroce@redhat.com>
    Tested-by: Matteo Croce <mcroce@redhat.com>
    Acked-by: Neil Horman <nhorman@tuxdriver.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/sctp/socket.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

    diff --git a/net/sctp/socket.c b/net/sctp/socket.c
    index c93be3ba5df29..df4a7d7c5ec04 100644
    --- a/net/sctp/socket.c
    +++ b/net/sctp/socket.c
    @@ -1931,7 +1931,10 @@ static int sctp_sendmsg_to_asoc(struct sctp_association *asoc,
    if (sctp_wspace(asoc) < (int)msg_len)
    sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc));

    - if (sctp_wspace(asoc) <= 0) {
    + if (sk_under_memory_pressure(sk))
    + sk_mem_reclaim(sk);
    +
    + if (sctp_wspace(asoc) <= 0 || !sk_wmem_schedule(sk, msg_len)) {
    timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
    err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len);
    if (err)
    @@ -8515,7 +8518,10 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
    goto do_error;
    if (signal_pending(current))
    goto do_interrupted;
    - if ((int)msg_len <= sctp_wspace(asoc))
    + if (sk_under_memory_pressure(sk))
    + sk_mem_reclaim(sk);
    + if ((int)msg_len <= sctp_wspace(asoc) &&
    + sk_wmem_schedule(sk, msg_len))
    break;

    /* Let another process have a go. Since we are going
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-08-03 15:11    [W:3.028 / U:0.692 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site