• Mukesh Kacker's avatar
    RDS: return EMSGSIZE for oversize requests before processing/queueing · 06e8941e
    Mukesh Kacker authored
    rds_send_queue_rm() allows for the "current datagram" being queued
    to exceed SO_SNDBUF thresholds by checking bytes queued without
    counting in length of current datagram. (Since sk_sndbuf is set
    to twice requested SO_SNDBUF value as a kernel heuristic this
    is usually fine!)
    
    If this "current datagram" squeezing past the threshold is itself
    many times the size of the sk_sndbuf threshold itself then even
    twice the SO_SNDBUF does not save us and it gets queued but
    cannot be transmitted. Threads block and deadlock and device
    becomes unusable. The check for this datagram not exceeding
    SNDBUF thresholds (EMSGSIZE) is not done on this datagram as
    that check is only done if queueing attempt fails.
    (Datagrams that follow this datagram fail queueing attempts, go
    through the check and eventually trip EMSGSIZE error but zero
    length datagrams silently fail!)
    
    This fix moves the check for datagrams exceeding SNDBUF limits
    before any processing or queueing is attempted and returns EMSGSIZE
    early in the rds_sndmsg() code. This change also ensures that all
    datagrams get checked for exceeding SNDBUF/sk_sndbuf size limits
    and the large datagrams that exceed those limits do not get to
    rds_send_queue_rm() code for processing.
    Signed-off-by: default avatarMukesh Kacker <mukesh.kacker@oracle.com>
    Signed-off-by: default avatarSantosh Shilimkar <ssantosh@kernel.org>
    Signed-off-by: default avatarSantosh Shilimkar <santosh.shilimkar@oracle.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    06e8941e
send.c 31.4 KB