• C
    net/mlx4: Copy/set only sizeof struct mlx4_eqe bytes · c02b0501
    Carol L Soto 提交于
    When doing memcpy/memset of EQEs, we should use sizeof struct
    mlx4_eqe as the base size and not caps.eqe_size which could be bigger.
    
    If caps.eqe_size is bigger than the struct mlx4_eqe then we corrupt
    data in the master context.
    
    When using a 64 byte stride, the memcpy copied over 63 bytes to the
    slave_eq structure.  This resulted in copying over the entire eqe of
    interest, including its ownership bit -- and also 31 bytes of garbage
    into the next WQE in the slave EQ -- which did NOT include the ownership
    bit (and therefore had no impact).
    
    However, once the stride is increased to 128, we are overwriting the
    ownership bits of *three* eqes in the slave_eq struct.  This results
    in an incorrect ownership bit for those eqes, which causes the eq to
    seem to be full. The issue therefore surfaced only once 128-byte EQEs
    started being used in SRIOV and (overarchitectures that have 128/256
    byte cache-lines such as PPC) - e.g after commit 77507aa2
    "net/mlx4_core: Enable CQE/EQE stride support".
    
    Fixes: 08ff3235 ('mlx4: 64-byte CQE/EQE support')
    Signed-off-by: NCarol L Soto <clsoto@linux.vnet.ibm.com>
    Signed-off-by: NJack Morgenstein <jackm@dev.mellanox.co.il>
    Signed-off-by: NOr Gerlitz <ogerlitz@mellanox.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    c02b0501
cmd.c 87.9 KB