write_seqlock_irqsave(&dev->iowait_lock, flags);
        if (!list_empty(&priv->s_iowait.list)) {
                list_del_init(&priv->s_iowait.list);
-               if (atomic_dec_and_test(&qp->refcount))
-                       wake_up(&qp->wait);
+               rvt_put_qp(qp);
        }
        write_sequnlock_irqrestore(&dev->iowait_lock, flags);
 }
        }
        spin_unlock_irqrestore(&qp->s_lock, flags);
        /* Notify hfi1_destroy_qp() if it is waiting. */
-       if (atomic_dec_and_test(&qp->refcount))
-               wake_up(&qp->wait);
+       rvt_put_qp(qp);
 }
 
 static int iowait_sleep(
                        qp->s_flags |= RVT_S_WAIT_DMA_DESC;
                        list_add_tail(&priv->s_iowait.list, &sde->dmawait);
                        trace_hfi1_qpsleep(qp, RVT_S_WAIT_DMA_DESC);
-                       atomic_inc(&qp->refcount);
+                       rvt_get_qp(qp);
                }
                write_sequnlock(&dev->iowait_lock);
                qp->s_flags &= ~RVT_S_BUSY;
        if (!list_empty(&priv->s_iowait.list) && !(qp->s_flags & RVT_S_BUSY)) {
                qp->s_flags &= ~RVT_S_ANY_WAIT_IO;
                list_del_init(&priv->s_iowait.list);
-               if (atomic_dec_and_test(&qp->refcount))
-                       wake_up(&qp->wait);
+               rvt_put_qp(qp);
        }
        write_sequnlock(&dev->iowait_lock);
 
 
                                restart_rc(qp, qp->s_last_psn + 1, 0);
                                if (list_empty(&qp->rspwait)) {
                                        qp->r_flags |= RVT_R_RSP_SEND;
-                                       atomic_inc(&qp->refcount);
+                                       rvt_get_qp(qp);
                                        list_add_tail(&qp->rspwait,
                                                      &rcd->qp_wait_list);
                                }
        restart_rc(qp, qp->s_last_psn + 1, 0);
        if (list_empty(&qp->rspwait)) {
                qp->r_flags |= RVT_R_RSP_SEND;
-               atomic_inc(&qp->refcount);
+               rvt_get_qp(qp);
                list_add_tail(&qp->rspwait, &rcd->qp_wait_list);
        }
 }
 {
        if (list_empty(&qp->rspwait)) {
                qp->r_flags |= RVT_R_RSP_NAK;
-               atomic_inc(&qp->refcount);
+               rvt_get_qp(qp);
                list_add_tail(&qp->rspwait, &rcd->qp_wait_list);
        }
 }
                return;
        list_del_init(&qp->rspwait);
        qp->r_flags &= ~RVT_R_RSP_NAK;
-       if (atomic_dec_and_test(&qp->refcount))
-               wake_up(&qp->wait);
+       rvt_put_qp(qp);
 }
 
 /**
 
                        qp->s_flags |= RVT_S_WAIT_KMEM;
                        list_add_tail(&priv->s_iowait.list, &dev->memwait);
                        trace_hfi1_qpsleep(qp, RVT_S_WAIT_KMEM);
-                       atomic_inc(&qp->refcount);
+                       rvt_get_qp(qp);
                }
                write_sequnlock(&dev->iowait_lock);
                qp->s_flags &= ~RVT_S_BUSY;
                        was_empty = list_empty(&sc->piowait);
                        list_add_tail(&priv->s_iowait.list, &sc->piowait);
                        trace_hfi1_qpsleep(qp, RVT_S_WAIT_PIO);
-                       atomic_inc(&qp->refcount);
+                       rvt_get_qp(qp);
                        /* counting: only call wantpiobuf_intr if first user */
                        if (was_empty)
                                hfi1_sc_wantpiobuf_intr(sc, 1);
 
                        qp->s_flags |= RVT_S_WAIT_TX;
                        list_add_tail(&priv->s_iowait.list, &dev->txwait);
                        trace_hfi1_qpsleep(qp, RVT_S_WAIT_TX);
-                       atomic_inc(&qp->refcount);
+                       rvt_get_qp(qp);
                }
                qp->s_flags &= ~RVT_S_BUSY;
        }
 
                                qib_schedule_send(qp);
                        spin_unlock_irqrestore(&qp->s_lock, flags);
                }
-               if (atomic_dec_and_test(&qp->refcount))
-                       wake_up(&qp->wait);
+               rvt_put_qp(qp);
        }
 
 bail:
 
                                qib_restart_rc(qp, qp->s_last_psn + 1, 0);
                                if (list_empty(&qp->rspwait)) {
                                        qp->r_flags |= RVT_R_RSP_SEND;
-                                       atomic_inc(&qp->refcount);
+                                       rvt_get_qp(qp);
                                        list_add_tail(&qp->rspwait,
                                                      &rcd->qp_wait_list);
                                }
        qib_restart_rc(qp, qp->s_last_psn + 1, 0);
        if (list_empty(&qp->rspwait)) {
                qp->r_flags |= RVT_R_RSP_SEND;
-               atomic_inc(&qp->refcount);
+               rvt_get_qp(qp);
                list_add_tail(&qp->rspwait, &rcd->qp_wait_list);
        }
 }
                         */
                        if (list_empty(&qp->rspwait)) {
                                qp->r_flags |= RVT_R_RSP_NAK;
-                               atomic_inc(&qp->refcount);
+                               rvt_get_qp(qp);
                                list_add_tail(&qp->rspwait, &rcd->qp_wait_list);
                        }
                }
        /* Queue RNR NAK for later */
        if (list_empty(&qp->rspwait)) {
                qp->r_flags |= RVT_R_RSP_NAK;
-               atomic_inc(&qp->refcount);
+               rvt_get_qp(qp);
                list_add_tail(&qp->rspwait, &rcd->qp_wait_list);
        }
        return;
        /* Queue NAK for later */
        if (list_empty(&qp->rspwait)) {
                qp->r_flags |= RVT_R_RSP_NAK;
-               atomic_inc(&qp->refcount);
+               rvt_get_qp(qp);
                list_add_tail(&qp->rspwait, &rcd->qp_wait_list);
        }
        return;
        /* Queue NAK for later */
        if (list_empty(&qp->rspwait)) {
                qp->r_flags |= RVT_R_RSP_NAK;
-               atomic_inc(&qp->refcount);
+               rvt_get_qp(qp);
                list_add_tail(&qp->rspwait, &rcd->qp_wait_list);
        }
        return;
 
        spin_unlock_irqrestore(&rdi->qp_dev->qpt_lock, flags);
        if (removed) {
                synchronize_rcu();
-               if (atomic_dec_and_test(&qp->refcount))
-                       wake_up(&qp->wait);
+               rvt_put_qp(qp);
        }
 }
 
        struct rvt_ibport *rvp = rdi->ports[qp->port_num - 1];
        unsigned long flags;
 
-       atomic_inc(&qp->refcount);
+       rvt_get_qp(qp);
        spin_lock_irqsave(&rdi->qp_dev->qpt_lock, flags);
 
        if (qp->ibqp.qp_num <= 1) {