• Kuniyuki Iwashima's avatar
    net: Remove redundant calls of sk_tx_queue_clear(). · df610cd9
    Kuniyuki Iwashima authored
    The commit 41b14fb8 ("net: Do not clear the sock TX queue in
    sk_set_socket()") removes sk_tx_queue_clear() from sk_set_socket() and adds
    it instead in sk_alloc() and sk_clone_lock() to fix an issue introduced in
    the commit e022f0b4 ("net: Introduce sk_tx_queue_mapping"). On the
    other hand, the original commit had already put sk_tx_queue_clear() in
    sk_prot_alloc(): the callee of sk_alloc() and sk_clone_lock(). Thus
    sk_tx_queue_clear() is called twice in each path.
    
    If we remove sk_tx_queue_clear() in sk_alloc() and sk_clone_lock(), it
    currently works well because (i) sk_tx_queue_mapping is defined between
    sk_dontcopy_begin and sk_dontcopy_end, and (ii) sock_copy() called after
    sk_prot_alloc() in sk_clone_lock() does not overwrite sk_tx_queue_mapping.
    However, if we move sk_tx_queue_mapping out of the no copy area, it
    introduces a bug unintentionally.
    
    Therefore, this patch adds a compile-time check to take care of the order
    of sock_copy() and sk_tx_queue_clear() and removes sk_tx_queue_clear() from
    sk_prot_alloc() so that it does the only allocation and its callers
    initialize fields.
    
    CC: Boris Pismenny <borisp@mellanox.com>
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.co.jp>
    Acked-by: default avatarTariq Toukan <tariqt@nvidia.com>
    Link: https://lore.kernel.org/r/20210128150217.6060-1-kuniyu@amazon.co.jpSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    df610cd9
sock.c 88.7 KB