• M
    net/tls: Use RCU API to access tls_ctx->netdev · 94ce3b64
    Maxim Mikityanskiy 提交于
    Currently, tls_device_down synchronizes with tls_device_resync_rx using
    RCU, however, the pointer to netdev is stored using WRITE_ONCE and
    loaded using READ_ONCE.
    
    Although such approach is technically correct (rcu_dereference is
    essentially a READ_ONCE, and rcu_assign_pointer uses WRITE_ONCE to store
    NULL), using special RCU helpers for pointers is more valid, as it
    includes additional checks and might change the implementation
    transparently to the callers.
    
    Mark the netdev pointer as __rcu and use the correct RCU helpers to
    access it. For non-concurrent access pass the right conditions that
    guarantee safe access (locks taken, refcount value). Also use the
    correct helper in mlx5e, where even READ_ONCE was missing.
    
    The transition to RCU exposes existing issues, fixed by this commit:
    
    1. bond_tls_device_xmit could read netdev twice, and it could become
    NULL the second time, after the NULL check passed.
    
    2. Drivers shouldn't stop processing the last packet if tls_device_down
    just set netdev to NULL, before tls_dev_del was called. This prevents a
    possible packet drop when transitioning to the fallback software mode.
    
    Fixes: 89df6a81 ("net/bonding: Implement TLS TX device offload")
    Fixes: c55dcdd4 ("net/tls: Fix use-after-free after the TLS device goes down and up")
    Signed-off-by: NMaxim Mikityanskiy <maximmi@nvidia.com>
    Link: https://lore.kernel.org/r/20220810081602.1435800-1-maximmi@nvidia.comSigned-off-by: NJakub Kicinski <kuba@kernel.org>
    94ce3b64
bond_main.c 172.9 KB