• Aya Levin's avatar
    net/mlx5e: Add resiliency in Striding RQ mode for packets larger than MTU · c3c94023
    Aya Levin authored
    Prior to this fix, in Striding RQ mode the driver was vulnerable when
    receiving packets in the range (stride size - headroom, stride size].
    Where stride size is calculated by mtu+headroom+tailroom aligned to the
    closest power of 2.
    Usually, this filtering is performed by the HW, except for a few cases:
    - Between 2 VFs over the same PF with different MTUs
    - On bluefield, when the host physical function sets a larger MTU than
      the ARM has configured on its representor and uplink representor.
    
    When the HW filtering is not present, packets that are larger than MTU
    might be harmful for the RQ's integrity, in the following impacts:
    1) Overflow from one WQE to the next, causing a memory corruption that
    in most cases is unharmful: as the write happens to the headroom of next
    packet, which will be overwritten by build_skb(). In very rare cases,
    high stress/load, this is harmful. When the next WQE is not yet reposted
    and points to existing SKB head.
    2) Each oversize packet overflows to the headroom of the next WQE. On
    the last WQE of the WQ, where addresses wrap-around, the address of the
    remainder headroom does not belong to the next WQE, but it is out of the
    memory region range. This results in a HW CQE error that moves the RQ
    into an error state.
    
    Solution:
    Add a page buffer at the end of each WQE to absorb the leak. Actually
    the maximal overflow size is headroom but since all memory units must be
    of the same size, we use page size to comply with UMR WQEs. The increase
    in memory consumption is of a single page per RQ. Initialize the mkey
    with all MTTs pointing to a default page. When the channels are
    activated, UMR WQEs will redirect the RX WQEs to the actual memory from
    the RQ's pool, while the overflow MTTs remain mapped to the default page.
    
    Fixes: 73281b78 ("net/mlx5e: Derive Striding RQ size from MTU")
    Signed-off-by: default avatarAya Levin <ayal@mellanox.com>
    Reviewed-by: default avatarTariq Toukan <tariqt@nvidia.com>
    Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
    c3c94023
en.h 35.1 KB