lkml.org 
[lkml]   [2010]   [Mar]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[125/156] sctp: use limited socket backlog
    2.6.33-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Zhu Yi <yi.zhu@intel.com>

    [ Upstream commit 50b1a782f845140f4138f14a1ce8a4a6dd0cc82f ]

    Make sctp adapt to the limited socket backlog change.

    Cc: Vlad Yasevich <vladislav.yasevich@hp.com>
    Cc: Sridhar Samudrala <sri@us.ibm.com>
    Signed-off-by: Zhu Yi <yi.zhu@intel.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    ---
    net/sctp/input.c | 42 +++++++++++++++++++++++++++---------------
    net/sctp/socket.c | 3 +++
    2 files changed, 30 insertions(+), 15 deletions(-)

    --- a/net/sctp/input.c
    +++ b/net/sctp/input.c
    @@ -75,7 +75,7 @@ static struct sctp_association *__sctp_l
    const union sctp_addr *peer,
    struct sctp_transport **pt);

    -static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb);
    +static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb);


    /* Calculate the SCTP checksum of an SCTP packet. */
    @@ -265,8 +265,13 @@ int sctp_rcv(struct sk_buff *skb)
    }

    if (sock_owned_by_user(sk)) {
    + if (sctp_add_backlog(sk, skb)) {
    + sctp_bh_unlock_sock(sk);
    + sctp_chunk_free(chunk);
    + skb = NULL; /* sctp_chunk_free already freed the skb */
    + goto discard_release;
    + }
    SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG);
    - sctp_add_backlog(sk, skb);
    } else {
    SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_SOFTIRQ);
    sctp_inq_push(&chunk->rcvr->inqueue, chunk);
    @@ -336,8 +341,10 @@ int sctp_backlog_rcv(struct sock *sk, st
    sctp_bh_lock_sock(sk);

    if (sock_owned_by_user(sk)) {
    - sk_add_backlog(sk, skb);
    - backloged = 1;
    + if (sk_add_backlog_limited(sk, skb))
    + sctp_chunk_free(chunk);
    + else
    + backloged = 1;
    } else
    sctp_inq_push(inqueue, chunk);

    @@ -362,22 +369,27 @@ done:
    return 0;
    }

    -static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb)
    +static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb)
    {
    struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk;
    struct sctp_ep_common *rcvr = chunk->rcvr;
    + int ret;

    - /* Hold the assoc/ep while hanging on the backlog queue.
    - * This way, we know structures we need will not disappear from us
    - */
    - if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type)
    - sctp_association_hold(sctp_assoc(rcvr));
    - else if (SCTP_EP_TYPE_SOCKET == rcvr->type)
    - sctp_endpoint_hold(sctp_ep(rcvr));
    - else
    - BUG();
    + ret = sk_add_backlog_limited(sk, skb);
    + if (!ret) {
    + /* Hold the assoc/ep while hanging on the backlog queue.
    + * This way, we know structures we need will not disappear
    + * from us
    + */
    + if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type)
    + sctp_association_hold(sctp_assoc(rcvr));
    + else if (SCTP_EP_TYPE_SOCKET == rcvr->type)
    + sctp_endpoint_hold(sctp_ep(rcvr));
    + else
    + BUG();
    + }
    + return ret;

    - sk_add_backlog(sk, skb);
    }

    /* Handle icmp frag needed error. */
    --- a/net/sctp/socket.c
    +++ b/net/sctp/socket.c
    @@ -3720,6 +3720,9 @@ SCTP_STATIC int sctp_init_sock(struct so
    SCTP_DBG_OBJCNT_INC(sock);
    percpu_counter_inc(&sctp_sockets_allocated);

    + /* Set socket backlog limit. */
    + sk->sk_backlog.limit = sysctl_sctp_rmem[1];
    +
    local_bh_disable();
    sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
    local_bh_enable();



    \
     
     \ /
      Last update: 2010-03-31 01:33    [W:4.263 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site