struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
        struct mlx4_srq *srq;
 
-       spin_lock(&srq_table->lock);
-
+       rcu_read_lock();
        srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
+       rcu_read_unlock();
        if (srq)
                atomic_inc(&srq->refcount);
-
-       spin_unlock(&srq_table->lock);
-
-       if (!srq) {
+       else {
                mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
                return;
        }
 {
        struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
        struct mlx4_srq *srq;
-       unsigned long flags;
 
-       spin_lock_irqsave(&srq_table->lock, flags);
+       rcu_read_lock();
        srq = radix_tree_lookup(&srq_table->tree,
                                srqn & (dev->caps.num_srqs - 1));
-       spin_unlock_irqrestore(&srq_table->lock, flags);
+       rcu_read_unlock();
 
        return srq;
 }