Ignore:
Timestamp:
Apr 18, 2017, 8:47:31 AM (7 days ago)
Author:
brainslayer
Message:

update kernels

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.4/drivers/net/ethernet/mellanox/mlx4/cq.c

    r28606 r31884  
    102102        struct mlx4_cq *cq;
    103103
     104        rcu_read_lock();
    104105        cq = radix_tree_lookup(&mlx4_priv(dev)->cq_table.tree,
    105106                               cqn & (dev->caps.num_cqs - 1));
     107        rcu_read_unlock();
     108
    106109        if (!cq) {
    107110                mlx4_dbg(dev, "Completion event for bogus CQ %08x\n", cqn);
     
    109112        }
    110113
     114        /* Acessing the CQ outside of rcu_read_lock is safe, because
     115         * the CQ is freed only after interrupt handling is completed.
     116         */
    111117        ++cq->arm_sn;
    112118
     
    119125        struct mlx4_cq *cq;
    120126
    121         spin_lock(&cq_table->lock);
    122 
     127        rcu_read_lock();
    123128        cq = radix_tree_lookup(&cq_table->tree, cqn & (dev->caps.num_cqs - 1));
    124         if (cq)
    125                 atomic_inc(&cq->refcount);
    126 
    127         spin_unlock(&cq_table->lock);
     129        rcu_read_unlock();
    128130
    129131        if (!cq) {
    130                 mlx4_warn(dev, "Async event for bogus CQ %08x\n", cqn);
     132                mlx4_dbg(dev, "Async event for bogus CQ %08x\n", cqn);
    131133                return;
    132134        }
    133135
     136        /* Acessing the CQ outside of rcu_read_lock is safe, because
     137         * the CQ is freed only after interrupt handling is completed.
     138         */
    134139        cq->event(cq, event_type);
    135 
    136         if (atomic_dec_and_test(&cq->refcount))
    137                 complete(&cq->free);
    138140}
    139141
     
    302304                return err;
    303305
    304         spin_lock_irq(&cq_table->lock);
     306        spin_lock(&cq_table->lock);
    305307        err = radix_tree_insert(&cq_table->tree, cq->cqn, cq);
    306         spin_unlock_irq(&cq_table->lock);
     308        spin_unlock(&cq_table->lock);
    307309        if (err)
    308310                goto err_icm;
     
    348350
    349351err_radix:
    350         spin_lock_irq(&cq_table->lock);
     352        spin_lock(&cq_table->lock);
    351353        radix_tree_delete(&cq_table->tree, cq->cqn);
    352         spin_unlock_irq(&cq_table->lock);
     354        spin_unlock(&cq_table->lock);
    353355
    354356err_icm:
     
    368370        if (err)
    369371                mlx4_warn(dev, "HW2SW_CQ failed (%d) for CQN %06x\n", err, cq->cqn);
     372
     373        spin_lock(&cq_table->lock);
     374        radix_tree_delete(&cq_table->tree, cq->cqn);
     375        spin_unlock(&cq_table->lock);
    370376
    371377        synchronize_irq(priv->eq_table.eq[MLX4_CQ_TO_EQ_VECTOR(cq->vector)].irq);
     
    374380                synchronize_irq(priv->eq_table.eq[MLX4_EQ_ASYNC].irq);
    375381
    376         spin_lock_irq(&cq_table->lock);
    377         radix_tree_delete(&cq_table->tree, cq->cqn);
    378         spin_unlock_irq(&cq_table->lock);
    379 
    380382        if (atomic_dec_and_test(&cq->refcount))
    381383                complete(&cq->free);
Note: See TracChangeset for help on using the changeset viewer.