Commit da8bacf6 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband

* 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband:
  IB/ipath: deref correct pointer when using kernel SMA
  IB/ipath: fix null deref during rdma ops
  IB/ipath: register as IB device owner
  IB/ipath: enable PE800 receive interrupts on user ports
  IB/ipath: enable GPIO interrupt on HT-460
  IB/ipath: fix NULL dereference during cleanup
  IB/ipath: replace uses of LIST_POISON
  IB/ipath: fix reporting of driver version to userspace
  IB/ipath: don't modify QP if changes fail
  IB/ipath: fix spinlock recursion bug
parents 67e38124 09b74de9
...@@ -1905,19 +1905,19 @@ static void __exit infinipath_cleanup(void) ...@@ -1905,19 +1905,19 @@ static void __exit infinipath_cleanup(void)
} else } else
ipath_dbg("irq is 0, not doing free_irq " ipath_dbg("irq is 0, not doing free_irq "
"for unit %u\n", dd->ipath_unit); "for unit %u\n", dd->ipath_unit);
dd->pcidev = NULL;
}
/* /*
* we check for NULL here, because it's outside the kregbase * we check for NULL here, because it's outside
* check, and we need to call it after the free_irq. Thus * the kregbase check, and we need to call it
* it's possible that the function pointers were never * after the free_irq. Thus it's possible that
* initialized. * the function pointers were never initialized.
*/ */
if (dd->ipath_f_cleanup) if (dd->ipath_f_cleanup)
/* clean up chip-specific stuff */ /* clean up chip-specific stuff */
dd->ipath_f_cleanup(dd); dd->ipath_f_cleanup(dd);
dd->pcidev = NULL;
}
spin_lock_irqsave(&ipath_devs_lock, flags); spin_lock_irqsave(&ipath_devs_lock, flags);
} }
......
...@@ -505,11 +505,10 @@ static u8 flash_csum(struct ipath_flash *ifp, int adjust) ...@@ -505,11 +505,10 @@ static u8 flash_csum(struct ipath_flash *ifp, int adjust)
* ipath_get_guid - get the GUID from the i2c device * ipath_get_guid - get the GUID from the i2c device
* @dd: the infinipath device * @dd: the infinipath device
* *
* When we add the multi-chip support, we will probably have to add * We have the capability to use the ipath_nguid field, and get
* the ability to use the number of guids field, and get the guid from * the guid from the first chip's flash, to use for all of them.
* the first chip's flash, to use for all of them.
*/ */
void ipath_get_guid(struct ipath_devdata *dd) void ipath_get_eeprom_info(struct ipath_devdata *dd)
{ {
void *buf; void *buf;
struct ipath_flash *ifp; struct ipath_flash *ifp;
......
...@@ -139,7 +139,7 @@ static int ipath_get_base_info(struct ipath_portdata *pd, ...@@ -139,7 +139,7 @@ static int ipath_get_base_info(struct ipath_portdata *pd,
kinfo->spi_piosize = dd->ipath_ibmaxlen; kinfo->spi_piosize = dd->ipath_ibmaxlen;
kinfo->spi_mtu = dd->ipath_ibmaxlen; /* maxlen, not ibmtu */ kinfo->spi_mtu = dd->ipath_ibmaxlen; /* maxlen, not ibmtu */
kinfo->spi_port = pd->port_port; kinfo->spi_port = pd->port_port;
kinfo->spi_sw_version = IPATH_USER_SWVERSION; kinfo->spi_sw_version = IPATH_KERN_SWVERSION;
kinfo->spi_hw_version = dd->ipath_revision; kinfo->spi_hw_version = dd->ipath_revision;
if (copy_to_user(ubase, kinfo, sizeof(*kinfo))) if (copy_to_user(ubase, kinfo, sizeof(*kinfo)))
...@@ -1224,6 +1224,10 @@ static unsigned int ipath_poll(struct file *fp, ...@@ -1224,6 +1224,10 @@ static unsigned int ipath_poll(struct file *fp,
if (tail == head) { if (tail == head) {
set_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag); set_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag);
if(dd->ipath_rhdrhead_intr_off) /* arm rcv interrupt */
(void)ipath_write_ureg(dd, ur_rcvhdrhead,
dd->ipath_rhdrhead_intr_off
| head, pd->port_port);
poll_wait(fp, &pd->port_wait, pt); poll_wait(fp, &pd->port_wait, pt);
if (test_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag)) { if (test_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag)) {
......
...@@ -607,7 +607,12 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name, ...@@ -607,7 +607,12 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name,
case 4: /* Ponderosa is one of the bringup boards */ case 4: /* Ponderosa is one of the bringup boards */
n = "Ponderosa"; n = "Ponderosa";
break; break;
case 5: /* HT-460 original production board */ case 5:
/*
* HT-460 original production board; two production levels, with
* different serial number ranges. See ipath_ht_early_init() for
* case where we enable IPATH_GPIO_INTR for later serial # range.
*/
n = "InfiniPath_HT-460"; n = "InfiniPath_HT-460";
break; break;
case 6: case 6:
...@@ -642,7 +647,7 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name, ...@@ -642,7 +647,7 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name,
if (n) if (n)
snprintf(name, namelen, "%s", n); snprintf(name, namelen, "%s", n);
if (dd->ipath_majrev != 3 || dd->ipath_minrev != 2) { if (dd->ipath_majrev != 3 || (dd->ipath_minrev < 2 || dd->ipath_minrev > 3)) {
/* /*
* This version of the driver only supports the HT-400 * This version of the driver only supports the HT-400
* Rev 3.2 * Rev 3.2
...@@ -1520,6 +1525,18 @@ static int ipath_ht_early_init(struct ipath_devdata *dd) ...@@ -1520,6 +1525,18 @@ static int ipath_ht_early_init(struct ipath_devdata *dd)
*/ */
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
INFINIPATH_S_ABORT); INFINIPATH_S_ABORT);
ipath_get_eeprom_info(dd);
if(dd->ipath_boardrev == 5 && dd->ipath_serial[0] == '1' &&
dd->ipath_serial[1] == '2' && dd->ipath_serial[2] == '8') {
/*
* Later production HT-460 has same changes as HT-465, so
* can use GPIO interrupts. They have serial #'s starting
* with 128, rather than 112.
*/
dd->ipath_flags |= IPATH_GPIO_INTR;
dd->ipath_flags &= ~IPATH_POLL_RX_INTR;
}
return 0; return 0;
} }
......
...@@ -879,7 +879,6 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit) ...@@ -879,7 +879,6 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit)
done: done:
if (!ret) { if (!ret) {
ipath_get_guid(dd);
*dd->ipath_statusp |= IPATH_STATUS_CHIP_PRESENT; *dd->ipath_statusp |= IPATH_STATUS_CHIP_PRESENT;
if (!dd->ipath_f_intrsetup(dd)) { if (!dd->ipath_f_intrsetup(dd)) {
/* now we can enable all interrupts from the chip */ /* now we can enable all interrupts from the chip */
......
...@@ -650,7 +650,7 @@ u32 __iomem *ipath_getpiobuf(struct ipath_devdata *, u32 *); ...@@ -650,7 +650,7 @@ u32 __iomem *ipath_getpiobuf(struct ipath_devdata *, u32 *);
void ipath_init_pe800_funcs(struct ipath_devdata *); void ipath_init_pe800_funcs(struct ipath_devdata *);
/* init HT-400-specific func */ /* init HT-400-specific func */
void ipath_init_ht400_funcs(struct ipath_devdata *); void ipath_init_ht400_funcs(struct ipath_devdata *);
void ipath_get_guid(struct ipath_devdata *); void ipath_get_eeprom_info(struct ipath_devdata *);
u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg); u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg);
/* /*
......
...@@ -136,9 +136,7 @@ int ipath_lkey_ok(struct ipath_lkey_table *rkt, struct ipath_sge *isge, ...@@ -136,9 +136,7 @@ int ipath_lkey_ok(struct ipath_lkey_table *rkt, struct ipath_sge *isge,
ret = 1; ret = 1;
goto bail; goto bail;
} }
spin_lock(&rkt->lock);
mr = rkt->table[(sge->lkey >> (32 - ib_ipath_lkey_table_size))]; mr = rkt->table[(sge->lkey >> (32 - ib_ipath_lkey_table_size))];
spin_unlock(&rkt->lock);
if (unlikely(mr == NULL || mr->lkey != sge->lkey)) { if (unlikely(mr == NULL || mr->lkey != sge->lkey)) {
ret = 0; ret = 0;
goto bail; goto bail;
...@@ -184,8 +182,6 @@ bail: ...@@ -184,8 +182,6 @@ bail:
* @acc: access flags * @acc: access flags
* *
* Return 1 if successful, otherwise 0. * Return 1 if successful, otherwise 0.
*
* The QP r_rq.lock should be held.
*/ */
int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss, int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
u32 len, u64 vaddr, u32 rkey, int acc) u32 len, u64 vaddr, u32 rkey, int acc)
...@@ -196,9 +192,7 @@ int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss, ...@@ -196,9 +192,7 @@ int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
size_t off; size_t off;
int ret; int ret;
spin_lock(&rkt->lock);
mr = rkt->table[(rkey >> (32 - ib_ipath_lkey_table_size))]; mr = rkt->table[(rkey >> (32 - ib_ipath_lkey_table_size))];
spin_unlock(&rkt->lock);
if (unlikely(mr == NULL || mr->lkey != rkey)) { if (unlikely(mr == NULL || mr->lkey != rkey)) {
ret = 0; ret = 0;
goto bail; goto bail;
......
...@@ -872,12 +872,13 @@ static void copy_io(u32 __iomem *piobuf, struct ipath_sge_state *ss, ...@@ -872,12 +872,13 @@ static void copy_io(u32 __iomem *piobuf, struct ipath_sge_state *ss,
update_sge(ss, len); update_sge(ss, len);
length -= len; length -= len;
} }
/* Update address before sending packet. */
update_sge(ss, length);
/* must flush early everything before trigger word */ /* must flush early everything before trigger word */
ipath_flush_wc(); ipath_flush_wc();
__raw_writel(last, piobuf); __raw_writel(last, piobuf);
/* be sure trigger word is written */ /* be sure trigger word is written */
ipath_flush_wc(); ipath_flush_wc();
update_sge(ss, length);
} }
/** /**
...@@ -943,17 +944,18 @@ int ipath_verbs_send(struct ipath_devdata *dd, u32 hdrwords, ...@@ -943,17 +944,18 @@ int ipath_verbs_send(struct ipath_devdata *dd, u32 hdrwords,
if (likely(ss->num_sge == 1 && len <= ss->sge.length && if (likely(ss->num_sge == 1 && len <= ss->sge.length &&
!((unsigned long)ss->sge.vaddr & (sizeof(u32) - 1)))) { !((unsigned long)ss->sge.vaddr & (sizeof(u32) - 1)))) {
u32 w; u32 w;
u32 *addr = (u32 *) ss->sge.vaddr;
/* Update address before sending packet. */
update_sge(ss, len);
/* Need to round up for the last dword in the packet. */ /* Need to round up for the last dword in the packet. */
w = (len + 3) >> 2; w = (len + 3) >> 2;
__iowrite32_copy(piobuf, ss->sge.vaddr, w - 1); __iowrite32_copy(piobuf, addr, w - 1);
/* must flush early everything before trigger word */ /* must flush early everything before trigger word */
ipath_flush_wc(); ipath_flush_wc();
__raw_writel(((u32 *) ss->sge.vaddr)[w - 1], __raw_writel(addr[w - 1], piobuf + w - 1);
piobuf + w - 1);
/* be sure trigger word is written */ /* be sure trigger word is written */
ipath_flush_wc(); ipath_flush_wc();
update_sge(ss, len);
ret = 0; ret = 0;
goto bail; goto bail;
} }
......
...@@ -1180,6 +1180,8 @@ static int ipath_pe_early_init(struct ipath_devdata *dd) ...@@ -1180,6 +1180,8 @@ static int ipath_pe_early_init(struct ipath_devdata *dd)
*/ */
dd->ipath_rhdrhead_intr_off = 1ULL<<32; dd->ipath_rhdrhead_intr_off = 1ULL<<32;
ipath_get_eeprom_info(dd);
return 0; return 0;
} }
......
...@@ -375,10 +375,10 @@ static void ipath_error_qp(struct ipath_qp *qp) ...@@ -375,10 +375,10 @@ static void ipath_error_qp(struct ipath_qp *qp)
spin_lock(&dev->pending_lock); spin_lock(&dev->pending_lock);
/* XXX What if its already removed by the timeout code? */ /* XXX What if its already removed by the timeout code? */
if (qp->timerwait.next != LIST_POISON1) if (!list_empty(&qp->timerwait))
list_del(&qp->timerwait); list_del_init(&qp->timerwait);
if (qp->piowait.next != LIST_POISON1) if (!list_empty(&qp->piowait))
list_del(&qp->piowait); list_del_init(&qp->piowait);
spin_unlock(&dev->pending_lock); spin_unlock(&dev->pending_lock);
wc.status = IB_WC_WR_FLUSH_ERR; wc.status = IB_WC_WR_FLUSH_ERR;
...@@ -427,6 +427,7 @@ static void ipath_error_qp(struct ipath_qp *qp) ...@@ -427,6 +427,7 @@ static void ipath_error_qp(struct ipath_qp *qp)
int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
int attr_mask) int attr_mask)
{ {
struct ipath_ibdev *dev = to_idev(ibqp->device);
struct ipath_qp *qp = to_iqp(ibqp); struct ipath_qp *qp = to_iqp(ibqp);
enum ib_qp_state cur_state, new_state; enum ib_qp_state cur_state, new_state;
unsigned long flags; unsigned long flags;
...@@ -443,6 +444,19 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, ...@@ -443,6 +444,19 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
attr_mask)) attr_mask))
goto inval; goto inval;
if (attr_mask & IB_QP_AV)
if (attr->ah_attr.dlid == 0 ||
attr->ah_attr.dlid >= IPS_MULTICAST_LID_BASE)
goto inval;
if (attr_mask & IB_QP_PKEY_INDEX)
if (attr->pkey_index >= ipath_layer_get_npkeys(dev->dd))
goto inval;
if (attr_mask & IB_QP_MIN_RNR_TIMER)
if (attr->min_rnr_timer > 31)
goto inval;
switch (new_state) { switch (new_state) {
case IB_QPS_RESET: case IB_QPS_RESET:
ipath_reset_qp(qp); ipath_reset_qp(qp);
...@@ -457,13 +471,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, ...@@ -457,13 +471,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
} }
if (attr_mask & IB_QP_PKEY_INDEX) { if (attr_mask & IB_QP_PKEY_INDEX)
struct ipath_ibdev *dev = to_idev(ibqp->device);
if (attr->pkey_index >= ipath_layer_get_npkeys(dev->dd))
goto inval;
qp->s_pkey_index = attr->pkey_index; qp->s_pkey_index = attr->pkey_index;
}
if (attr_mask & IB_QP_DEST_QPN) if (attr_mask & IB_QP_DEST_QPN)
qp->remote_qpn = attr->dest_qp_num; qp->remote_qpn = attr->dest_qp_num;
...@@ -479,12 +488,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, ...@@ -479,12 +488,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
if (attr_mask & IB_QP_ACCESS_FLAGS) if (attr_mask & IB_QP_ACCESS_FLAGS)
qp->qp_access_flags = attr->qp_access_flags; qp->qp_access_flags = attr->qp_access_flags;
if (attr_mask & IB_QP_AV) { if (attr_mask & IB_QP_AV)
if (attr->ah_attr.dlid == 0 ||
attr->ah_attr.dlid >= IPS_MULTICAST_LID_BASE)
goto inval;
qp->remote_ah_attr = attr->ah_attr; qp->remote_ah_attr = attr->ah_attr;
}
if (attr_mask & IB_QP_PATH_MTU) if (attr_mask & IB_QP_PATH_MTU)
qp->path_mtu = attr->path_mtu; qp->path_mtu = attr->path_mtu;
...@@ -499,11 +504,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, ...@@ -499,11 +504,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
qp->s_rnr_retry_cnt = qp->s_rnr_retry; qp->s_rnr_retry_cnt = qp->s_rnr_retry;
} }
if (attr_mask & IB_QP_MIN_RNR_TIMER) { if (attr_mask & IB_QP_MIN_RNR_TIMER)
if (attr->min_rnr_timer > 31)
goto inval;
qp->s_min_rnr_timer = attr->min_rnr_timer; qp->s_min_rnr_timer = attr->min_rnr_timer;
}
if (attr_mask & IB_QP_QKEY) if (attr_mask & IB_QP_QKEY)
qp->qkey = attr->qkey; qp->qkey = attr->qkey;
...@@ -710,10 +712,8 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd, ...@@ -710,10 +712,8 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
init_attr->qp_type == IB_QPT_RC ? init_attr->qp_type == IB_QPT_RC ?
ipath_do_rc_send : ipath_do_uc_send, ipath_do_rc_send : ipath_do_uc_send,
(unsigned long)qp); (unsigned long)qp);
qp->piowait.next = LIST_POISON1; INIT_LIST_HEAD(&qp->piowait);
qp->piowait.prev = LIST_POISON2; INIT_LIST_HEAD(&qp->timerwait);
qp->timerwait.next = LIST_POISON1;
qp->timerwait.prev = LIST_POISON2;
qp->state = IB_QPS_RESET; qp->state = IB_QPS_RESET;
qp->s_wq = swq; qp->s_wq = swq;
qp->s_size = init_attr->cap.max_send_wr + 1; qp->s_size = init_attr->cap.max_send_wr + 1;
...@@ -734,7 +734,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd, ...@@ -734,7 +734,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
ipath_reset_qp(qp); ipath_reset_qp(qp);
/* Tell the core driver that the kernel SMA is present. */ /* Tell the core driver that the kernel SMA is present. */
if (qp->ibqp.qp_type == IB_QPT_SMI) if (init_attr->qp_type == IB_QPT_SMI)
ipath_layer_set_verbs_flags(dev->dd, ipath_layer_set_verbs_flags(dev->dd,
IPATH_VERBS_KERNEL_SMA); IPATH_VERBS_KERNEL_SMA);
break; break;
...@@ -783,10 +783,10 @@ int ipath_destroy_qp(struct ib_qp *ibqp) ...@@ -783,10 +783,10 @@ int ipath_destroy_qp(struct ib_qp *ibqp)
/* Make sure the QP isn't on the timeout list. */ /* Make sure the QP isn't on the timeout list. */
spin_lock_irqsave(&dev->pending_lock, flags); spin_lock_irqsave(&dev->pending_lock, flags);
if (qp->timerwait.next != LIST_POISON1) if (!list_empty(&qp->timerwait))
list_del(&qp->timerwait); list_del_init(&qp->timerwait);
if (qp->piowait.next != LIST_POISON1) if (!list_empty(&qp->piowait))
list_del(&qp->piowait); list_del_init(&qp->piowait);
spin_unlock_irqrestore(&dev->pending_lock, flags); spin_unlock_irqrestore(&dev->pending_lock, flags);
/* /*
...@@ -855,10 +855,10 @@ void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc) ...@@ -855,10 +855,10 @@ void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc)
spin_lock(&dev->pending_lock); spin_lock(&dev->pending_lock);
/* XXX What if its already removed by the timeout code? */ /* XXX What if its already removed by the timeout code? */
if (qp->timerwait.next != LIST_POISON1) if (!list_empty(&qp->timerwait))
list_del(&qp->timerwait); list_del_init(&qp->timerwait);
if (qp->piowait.next != LIST_POISON1) if (!list_empty(&qp->piowait))
list_del(&qp->piowait); list_del_init(&qp->piowait);
spin_unlock(&dev->pending_lock); spin_unlock(&dev->pending_lock);
ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1); ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1);
......
...@@ -57,7 +57,7 @@ static void ipath_init_restart(struct ipath_qp *qp, struct ipath_swqe *wqe) ...@@ -57,7 +57,7 @@ static void ipath_init_restart(struct ipath_qp *qp, struct ipath_swqe *wqe)
qp->s_len = wqe->length - len; qp->s_len = wqe->length - len;
dev = to_idev(qp->ibqp.device); dev = to_idev(qp->ibqp.device);
spin_lock(&dev->pending_lock); spin_lock(&dev->pending_lock);
if (qp->timerwait.next == LIST_POISON1) if (list_empty(&qp->timerwait))
list_add_tail(&qp->timerwait, list_add_tail(&qp->timerwait,
&dev->pending[dev->pending_index]); &dev->pending[dev->pending_index]);
spin_unlock(&dev->pending_lock); spin_unlock(&dev->pending_lock);
...@@ -356,7 +356,7 @@ static inline int ipath_make_rc_req(struct ipath_qp *qp, ...@@ -356,7 +356,7 @@ static inline int ipath_make_rc_req(struct ipath_qp *qp,
if ((int)(qp->s_psn - qp->s_next_psn) > 0) if ((int)(qp->s_psn - qp->s_next_psn) > 0)
qp->s_next_psn = qp->s_psn; qp->s_next_psn = qp->s_psn;
spin_lock(&dev->pending_lock); spin_lock(&dev->pending_lock);
if (qp->timerwait.next == LIST_POISON1) if (list_empty(&qp->timerwait))
list_add_tail(&qp->timerwait, list_add_tail(&qp->timerwait,
&dev->pending[dev->pending_index]); &dev->pending[dev->pending_index]);
spin_unlock(&dev->pending_lock); spin_unlock(&dev->pending_lock);
...@@ -726,8 +726,8 @@ void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc) ...@@ -726,8 +726,8 @@ void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc)
*/ */
dev = to_idev(qp->ibqp.device); dev = to_idev(qp->ibqp.device);
spin_lock(&dev->pending_lock); spin_lock(&dev->pending_lock);
if (qp->timerwait.next != LIST_POISON1) if (!list_empty(&qp->timerwait))
list_del(&qp->timerwait); list_del_init(&qp->timerwait);
spin_unlock(&dev->pending_lock); spin_unlock(&dev->pending_lock);
if (wqe->wr.opcode == IB_WR_RDMA_READ) if (wqe->wr.opcode == IB_WR_RDMA_READ)
...@@ -886,8 +886,8 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode) ...@@ -886,8 +886,8 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode)
* just won't find anything to restart if we ACK everything. * just won't find anything to restart if we ACK everything.
*/ */
spin_lock(&dev->pending_lock); spin_lock(&dev->pending_lock);
if (qp->timerwait.next != LIST_POISON1) if (!list_empty(&qp->timerwait))
list_del(&qp->timerwait); list_del_init(&qp->timerwait);
spin_unlock(&dev->pending_lock); spin_unlock(&dev->pending_lock);
/* /*
...@@ -1194,8 +1194,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, ...@@ -1194,8 +1194,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev,
IB_WR_RDMA_READ)) IB_WR_RDMA_READ))
goto ack_done; goto ack_done;
spin_lock(&dev->pending_lock); spin_lock(&dev->pending_lock);
if (qp->s_rnr_timeout == 0 && if (qp->s_rnr_timeout == 0 && !list_empty(&qp->timerwait))
qp->timerwait.next != LIST_POISON1)
list_move_tail(&qp->timerwait, list_move_tail(&qp->timerwait,
&dev->pending[dev->pending_index]); &dev->pending[dev->pending_index]);
spin_unlock(&dev->pending_lock); spin_unlock(&dev->pending_lock);
......
...@@ -435,7 +435,7 @@ void ipath_no_bufs_available(struct ipath_qp *qp, struct ipath_ibdev *dev) ...@@ -435,7 +435,7 @@ void ipath_no_bufs_available(struct ipath_qp *qp, struct ipath_ibdev *dev)
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&dev->pending_lock, flags); spin_lock_irqsave(&dev->pending_lock, flags);
if (qp->piowait.next == LIST_POISON1) if (list_empty(&qp->piowait))
list_add_tail(&qp->piowait, &dev->piowait); list_add_tail(&qp->piowait, &dev->piowait);
spin_unlock_irqrestore(&dev->pending_lock, flags); spin_unlock_irqrestore(&dev->pending_lock, flags);
/* /*
......
...@@ -464,7 +464,7 @@ static void ipath_ib_timer(void *arg) ...@@ -464,7 +464,7 @@ static void ipath_ib_timer(void *arg)
last = &dev->pending[dev->pending_index]; last = &dev->pending[dev->pending_index];
while (!list_empty(last)) { while (!list_empty(last)) {
qp = list_entry(last->next, struct ipath_qp, timerwait); qp = list_entry(last->next, struct ipath_qp, timerwait);
list_del(&qp->timerwait); list_del_init(&qp->timerwait);
qp->timer_next = resend; qp->timer_next = resend;
resend = qp; resend = qp;
atomic_inc(&qp->refcount); atomic_inc(&qp->refcount);
...@@ -474,7 +474,7 @@ static void ipath_ib_timer(void *arg) ...@@ -474,7 +474,7 @@ static void ipath_ib_timer(void *arg)
qp = list_entry(last->next, struct ipath_qp, timerwait); qp = list_entry(last->next, struct ipath_qp, timerwait);
if (--qp->s_rnr_timeout == 0) { if (--qp->s_rnr_timeout == 0) {
do { do {
list_del(&qp->timerwait); list_del_init(&qp->timerwait);
tasklet_hi_schedule(&qp->s_task); tasklet_hi_schedule(&qp->s_task);
if (list_empty(last)) if (list_empty(last))
break; break;
...@@ -554,7 +554,7 @@ static int ipath_ib_piobufavail(void *arg) ...@@ -554,7 +554,7 @@ static int ipath_ib_piobufavail(void *arg)
while (!list_empty(&dev->piowait)) { while (!list_empty(&dev->piowait)) {
qp = list_entry(dev->piowait.next, struct ipath_qp, qp = list_entry(dev->piowait.next, struct ipath_qp,
piowait); piowait);
list_del(&qp->piowait); list_del_init(&qp->piowait);
tasklet_hi_schedule(&qp->s_task); tasklet_hi_schedule(&qp->s_task);
} }
spin_unlock_irqrestore(&dev->pending_lock, flags); spin_unlock_irqrestore(&dev->pending_lock, flags);
...@@ -951,6 +951,7 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd) ...@@ -951,6 +951,7 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd)
idev->dd = dd; idev->dd = dd;
strlcpy(dev->name, "ipath%d", IB_DEVICE_NAME_MAX); strlcpy(dev->name, "ipath%d", IB_DEVICE_NAME_MAX);
dev->owner = THIS_MODULE;
dev->node_guid = ipath_layer_get_guid(dd); dev->node_guid = ipath_layer_get_guid(dd);
dev->uverbs_abi_ver = IPATH_UVERBS_ABI_VERSION; dev->uverbs_abi_ver = IPATH_UVERBS_ABI_VERSION;
dev->uverbs_cmd_mask = dev->uverbs_cmd_mask =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment