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

update kernels

File:
1 edited

Legend:

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

    r31574 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;
     
    350352
    351353err_radix:
    352         spin_lock_irq(&cq_table->lock);
     354        spin_lock(&cq_table->lock);
    353355        radix_tree_delete(&cq_table->tree, cq->cqn);
    354         spin_unlock_irq(&cq_table->lock);
     356        spin_unlock(&cq_table->lock);
    355357
    356358err_icm:
     
    370372        if (err)
    371373                mlx4_warn(dev, "HW2SW_CQ failed (%d) for CQN %06x\n", err, cq->cqn);
     374
     375        spin_lock(&cq_table->lock);
     376        radix_tree_delete(&cq_table->tree, cq->cqn);
     377        spin_unlock(&cq_table->lock);
    372378
    373379        synchronize_irq(priv->eq_table.eq[MLX4_CQ_TO_EQ_VECTOR(cq->vector)].irq);
     
    376382                synchronize_irq(priv->eq_table.eq[MLX4_EQ_ASYNC].irq);
    377383
    378         spin_lock_irq(&cq_table->lock);
    379         radix_tree_delete(&cq_table->tree, cq->cqn);
    380         spin_unlock_irq(&cq_table->lock);
    381 
    382384        if (atomic_dec_and_test(&cq->refcount))
    383385                complete(&cq->free);
Note: See TracChangeset for help on using the changeset viewer.