lkml.org 
[lkml]   [2015]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 39/72] net/mlx4: Copy/set only sizeof struct mlx4_eqe bytes
    Date
    From: Carol L Soto <clsoto@linux.vnet.ibm.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    [ Upstream commit c02b05011fadf8e409e41910217ca689f2fc9d91 ]

    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 77507aa249ae
    "net/mlx4_core: Enable CQE/EQE stride support".

    Fixes: 08ff32352d6f ('mlx4: 64-byte CQE/EQE support')
    Signed-off-by: Carol L Soto <clsoto@linux.vnet.ibm.com>
    Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
    Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    drivers/net/ethernet/mellanox/mlx4/cmd.c | 2 +-
    drivers/net/ethernet/mellanox/mlx4/eq.c | 2 +-
    2 files changed, 2 insertions(+), 2 deletions(-)

    diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
    index bb11624a1f39..8a9c18529bfd 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
    @@ -1983,7 +1983,7 @@ int mlx4_multi_func_init(struct mlx4_dev *dev)
    spin_lock_init(&s_state->lock);
    }

    - memset(&priv->mfunc.master.cmd_eqe, 0, dev->caps.eqe_size);
    + memset(&priv->mfunc.master.cmd_eqe, 0, sizeof(struct mlx4_eqe));
    priv->mfunc.master.cmd_eqe.type = MLX4_EVENT_TYPE_CMD;
    INIT_WORK(&priv->mfunc.master.comm_work,
    mlx4_master_comm_channel);
    diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c
    index 3990b435a081..b13d5a7a2b18 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/eq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c
    @@ -184,7 +184,7 @@ static void slave_event(struct mlx4_dev *dev, u8 slave, struct mlx4_eqe *eqe)
    return;
    }

    - memcpy(s_eqe, eqe, dev->caps.eqe_size - 1);
    + memcpy(s_eqe, eqe, sizeof(struct mlx4_eqe) - 1);
    s_eqe->slave_id = slave;
    /* ensure all information is written before setting the ownersip bit */
    wmb();
    --
    2.6.3


    \
     
     \ /
      Last update: 2015-11-23 14:41    [W:4.197 / U:0.420 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site