• Daniel Borkmann's avatar
    packet: don't unconditionally schedule() in case of MSG_DONTWAIT · 87a2fd28
    Daniel Borkmann authored
    In tpacket_snd(), when we've discovered a first frame that is
    not in status TP_STATUS_SEND_REQUEST, and return a NULL buffer,
    we exit the send routine in case of MSG_DONTWAIT, since we've
    finished traversing the mmaped send ring buffer and don't care
    about pending frames.
    
    While doing so, we still unconditionally call an expensive
    schedule() in the packet_current_frame() "error" path, which
    is unnecessary in this case since it's enough to just quit
    the function.
    
    Also, in case MSG_DONTWAIT is not set, we should rather test
    for need_resched() first and do schedule() only if necessary
    since meanwhile pending frames could already have finished
    processing and called skb destructor.
    Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    87a2fd28
af_packet.c 93.6 KB