lkml.org 
[lkml]   [2017]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 036/156] qed: Fix interrupt flags on Rx LL2
    Date
    From: Ram Amrani <Ram.Amrani@cavium.com>

    [ Upstream commit 1df2adedcce17ad4a39fba74f0e2b611f797fe10 ]

    Before iterating over the the LL2 Rx ring, the ring's
    spinlock is taken via spin_lock_irqsave().
    The actual processing of the packet [including handling
    by the protocol driver] is done without said lock,
    so qed releases the spinlock and re-claims it afterwards.

    Problem is that the final spin_lock_irqrestore() at the end
    of the iteration uses the original flags saved from the
    initial irqsave() instead of the flags from the most recent
    irqsave(). So it's possible that the interrupt status would
    be incorrect at the end of the processing.

    Fixes: 0a7fb11c23c0 ("qed: Add Light L2 support");
    CC: Ram Amrani <Ram.Amrani@cavium.com>
    Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    ---
    drivers/net/ethernet/qlogic/qed/qed_ll2.c | 9 +++++----
    1 file changed, 5 insertions(+), 4 deletions(-)

    diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
    index 7f00c7b065cb..a3360cbdb30b 100644
    --- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c
    +++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
    @@ -443,7 +443,7 @@ qed_ll2_rxq_completion_gsi(struct qed_hwfn *p_hwfn,
    static int qed_ll2_rxq_completion_reg(struct qed_hwfn *p_hwfn,
    struct qed_ll2_info *p_ll2_conn,
    union core_rx_cqe_union *p_cqe,
    - unsigned long lock_flags,
    + unsigned long *p_lock_flags,
    bool b_last_cqe)
    {
    struct qed_ll2_rx_queue *p_rx = &p_ll2_conn->rx_queue;
    @@ -464,10 +464,10 @@ static int qed_ll2_rxq_completion_reg(struct qed_hwfn *p_hwfn,
    "Mismatch between active_descq and the LL2 Rx chain\n");
    list_add_tail(&p_pkt->list_entry, &p_rx->free_descq);

    - spin_unlock_irqrestore(&p_rx->lock, lock_flags);
    + spin_unlock_irqrestore(&p_rx->lock, *p_lock_flags);
    qed_ll2b_complete_rx_packet(p_hwfn, p_ll2_conn->my_id,
    p_pkt, &p_cqe->rx_cqe_fp, b_last_cqe);
    - spin_lock_irqsave(&p_rx->lock, lock_flags);
    + spin_lock_irqsave(&p_rx->lock, *p_lock_flags);

    return 0;
    }
    @@ -507,7 +507,8 @@ static int qed_ll2_rxq_completion(struct qed_hwfn *p_hwfn, void *cookie)
    break;
    case CORE_RX_CQE_TYPE_REGULAR:
    rc = qed_ll2_rxq_completion_reg(p_hwfn, p_ll2_conn,
    - cqe, flags, b_last_cqe);
    + cqe, &flags,
    + b_last_cqe);
    break;
    default:
    rc = -EIO;
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-12-07 18:40    [W:4.032 / U:0.656 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site