spin_lock_init(&sc->alloc_lock);
        spin_lock_init(&sc->release_lock);
        spin_lock_init(&sc->credit_ctrl_lock);
+       seqlock_init(&sc->waitlock);
        INIT_LIST_HEAD(&sc->piowait);
        INIT_WORK(&sc->halt_work, sc_halted);
        init_waitqueue_head(&sc->halt_wait);
 static void sc_piobufavail(struct send_context *sc)
 {
        struct hfi1_devdata *dd = sc->dd;
-       struct hfi1_ibdev *dev = &dd->verbs_dev;
        struct list_head *list;
        struct rvt_qp *qps[PIO_WAIT_BATCH_SIZE];
        struct rvt_qp *qp;
         * could end up with QPs on the wait list with the interrupt
         * disabled.
         */
-       write_seqlock_irqsave(&dev->iowait_lock, flags);
+       write_seqlock_irqsave(&sc->waitlock, flags);
        while (!list_empty(list)) {
                struct iowait *wait;
 
                if (!list_empty(list))
                        hfi1_sc_wantpiobuf_intr(sc, 1);
        }
-       write_sequnlock_irqrestore(&dev->iowait_lock, flags);
+       write_sequnlock_irqrestore(&sc->waitlock, flags);
 
        /* Wake up the most starved one first */
        if (n)
 
        volatile __le64 *hw_free;       /* HW free counter */
        /* list for PIO waiters */
        struct list_head piowait  ____cacheline_aligned_in_smp;
+       seqlock_t waitlock;
+
        spinlock_t credit_ctrl_lock ____cacheline_aligned_in_smp;
        u32 credit_intr_count;          /* count of credit intr users */
        u64 credit_ctrl;                /* cache for credit control */
 
 
 static void qp_pio_drain(struct rvt_qp *qp)
 {
-       struct hfi1_ibdev *dev;
        struct hfi1_qp_priv *priv = qp->priv;
 
        if (!priv->s_sendcontext)
                return;
-       dev = to_idev(qp->ibqp.device);
        while (iowait_pio_pending(&priv->s_iowait)) {
-               write_seqlock_irq(&dev->iowait_lock);
+               write_seqlock_irq(&priv->s_sendcontext->waitlock);
                hfi1_sc_wantpiobuf_intr(priv->s_sendcontext, 1);
-               write_sequnlock_irq(&dev->iowait_lock);
+               write_sequnlock_irq(&priv->s_sendcontext->waitlock);
                iowait_pio_drain(&priv->s_iowait);
-               write_seqlock_irq(&dev->iowait_lock);
+               write_seqlock_irq(&priv->s_sendcontext->waitlock);
                hfi1_sc_wantpiobuf_intr(priv->s_sendcontext, 0);
-               write_sequnlock_irq(&dev->iowait_lock);
+               write_sequnlock_irq(&priv->s_sendcontext->waitlock);
        }
 }
 
        struct hfi1_qp_priv *priv;
        unsigned long flags;
        int ret = 0;
-       struct hfi1_ibdev *dev;
 
        qp = tx->qp;
        priv = qp->priv;
                 * buffer and undoing the side effects of the copy.
                 */
                /* Make a common routine? */
-               dev = &sde->dd->verbs_dev;
                list_add_tail(&stx->list, &wait->tx_head);
-               write_seqlock(&dev->iowait_lock);
+               write_seqlock(&sde->waitlock);
                if (sdma_progress(sde, seq, stx))
                        goto eagain;
                if (list_empty(&priv->s_iowait.list)) {
                        qp->s_flags |= RVT_S_WAIT_DMA_DESC;
                        iowait_queue(pkts_sent, &priv->s_iowait,
                                     &sde->dmawait);
-                       priv->s_iowait.lock = &dev->iowait_lock;
+                       priv->s_iowait.lock = &sde->waitlock;
                        trace_hfi1_qpsleep(qp, RVT_S_WAIT_DMA_DESC);
                        rvt_get_qp(qp);
                }
-               write_sequnlock(&dev->iowait_lock);
+               write_sequnlock(&sde->waitlock);
                hfi1_qp_unbusy(qp, wait);
                spin_unlock_irqrestore(&qp->s_lock, flags);
                ret = -EBUSY;
        }
        return ret;
 eagain:
-       write_sequnlock(&dev->iowait_lock);
+       write_sequnlock(&sde->waitlock);
        spin_unlock_irqrestore(&qp->s_lock, flags);
        list_del_init(&stx->list);
        return -EAGAIN;
 
                seqlock_init(&sde->head_lock);
                spin_lock_init(&sde->senddmactrl_lock);
                spin_lock_init(&sde->flushlist_lock);
+               seqlock_init(&sde->waitlock);
                /* insure there is always a zero bit */
                sde->ahg_bits = 0xfffffffe00000000ULL;
 
        struct iowait *wait, *nw;
        struct iowait *waits[SDMA_WAIT_BATCH_SIZE];
        uint i, n = 0, seq, max_idx = 0;
-       struct hfi1_ibdev *dev = &sde->dd->verbs_dev;
        u8 max_starved_cnt = 0;
 
 #ifdef CONFIG_SDMA_VERBOSITY
 #endif
 
        do {
-               seq = read_seqbegin(&dev->iowait_lock);
+               seq = read_seqbegin(&sde->waitlock);
                if (!list_empty(&sde->dmawait)) {
                        /* at least one item */
-                       write_seqlock(&dev->iowait_lock);
+                       write_seqlock(&sde->waitlock);
                        /* Harvest waiters wanting DMA descriptors */
                        list_for_each_entry_safe(
                                        wait,
                                list_del_init(&wait->list);
                                waits[n++] = wait;
                        }
-                       write_sequnlock(&dev->iowait_lock);
+                       write_sequnlock(&sde->waitlock);
                        break;
                }
-       } while (read_seqretry(&dev->iowait_lock, seq));
+       } while (read_seqretry(&sde->waitlock, seq));
 
        /* Schedule the most starved one first */
        if (n)
 
        u64                     progress_int_cnt;
 
        /* private: */
+       seqlock_t            waitlock;
        struct list_head      dmawait;
 
        /* CONFIG SDMA for now, just blindly duplicate */
 
 {
        struct hfi1_user_sdma_pkt_q *pq =
                container_of(wait->iow, struct hfi1_user_sdma_pkt_q, busy);
-       struct hfi1_ibdev *dev = &pq->dd->verbs_dev;
        struct user_sdma_txreq *tx =
                container_of(txreq, struct user_sdma_txreq, txreq);
 
         * it is supposed to be enqueued.
         */
        xchg(&pq->state, SDMA_PKT_Q_DEFERRED);
-       write_seqlock(&dev->iowait_lock);
+       write_seqlock(&sde->waitlock);
        if (list_empty(&pq->busy.list))
                iowait_queue(pkts_sent, &pq->busy, &sde->dmawait);
-       write_sequnlock(&dev->iowait_lock);
+       write_sequnlock(&sde->waitlock);
        return -EBUSY;
 eagain:
        return -EAGAIN;
 
 {
        struct hfi1_qp_priv *priv = qp->priv;
        struct hfi1_devdata *dd = sc->dd;
-       struct hfi1_ibdev *dev = &dd->verbs_dev;
        unsigned long flags;
        int ret = 0;
 
         */
        spin_lock_irqsave(&qp->s_lock, flags);
        if (ib_rvt_state_ops[qp->state] & RVT_PROCESS_RECV_OK) {
-               write_seqlock(&dev->iowait_lock);
+               write_seqlock(&sc->waitlock);
                list_add_tail(&ps->s_txreq->txreq.list,
                              &ps->wait->tx_head);
                if (list_empty(&priv->s_iowait.list)) {
                        was_empty = list_empty(&sc->piowait);
                        iowait_queue(ps->pkts_sent, &priv->s_iowait,
                                     &sc->piowait);
-                       priv->s_iowait.lock = &dev->iowait_lock;
+                       priv->s_iowait.lock = &sc->waitlock;
                        trace_hfi1_qpsleep(qp, RVT_S_WAIT_PIO);
                        rvt_get_qp(qp);
                        /* counting: only call wantpiobuf_intr if first user */
                        if (was_empty)
                                hfi1_sc_wantpiobuf_intr(sc, 1);
                }
-               write_sequnlock(&dev->iowait_lock);
+               write_sequnlock(&sc->waitlock);
                hfi1_qp_unbusy(qp, ps->wait);
                ret = -EBUSY;
        }
 
 {
        struct hfi1_vnic_sdma *vnic_sdma =
                container_of(wait->iow, struct hfi1_vnic_sdma, wait);
-       struct hfi1_ibdev *dev = &vnic_sdma->dd->verbs_dev;
 
-       write_seqlock(&dev->iowait_lock);
+       write_seqlock(&sde->waitlock);
        if (sdma_progress(sde, seq, txreq)) {
-               write_sequnlock(&dev->iowait_lock);
+               write_sequnlock(&sde->waitlock);
                return -EAGAIN;
        }
 
        vnic_sdma->state = HFI1_VNIC_SDMA_Q_DEFERRED;
        if (list_empty(&vnic_sdma->wait.list))
                iowait_queue(pkts_sent, wait->iow, &sde->dmawait);
-       write_sequnlock(&dev->iowait_lock);
+       write_sequnlock(&sde->waitlock);
        return -EBUSY;
 }