Loading drivers/infiniband/hw/ehca/ehca_classes.h +7 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,13 @@ struct ehca_queue_map { unsigned int next_wqe_idx; /* Idx to first wqe to be flushed */ }; /* function to calculate the next index for the qmap */ static inline unsigned int next_index(unsigned int cur_index, unsigned int limit) { unsigned int temp = cur_index + 1; return (temp == limit) ? 0 : temp; } struct ehca_qp { union { struct ib_qp ib_qp; Loading drivers/infiniband/hw/ehca/ehca_eq.c +1 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ int ehca_create_eq(struct ehca_shca *shca, if (h_ret != H_SUCCESS || vpage) goto create_eq_exit2; } else { if (h_ret != H_PAGE_REGISTERED || !vpage) if (h_ret != H_PAGE_REGISTERED) goto create_eq_exit2; } } Loading drivers/infiniband/hw/ehca/ehca_main.c +10 −7 Original line number Diff line number Diff line Loading @@ -717,6 +717,7 @@ static int __devinit ehca_probe(struct of_device *dev, const u64 *handle; struct ib_pd *ibpd; int ret, i, eq_size; unsigned long flags; handle = of_get_property(dev->node, "ibm,hca-handle", NULL); if (!handle) { Loading Loading @@ -830,9 +831,9 @@ static int __devinit ehca_probe(struct of_device *dev, ehca_err(&shca->ib_device, "Cannot create device attributes ret=%d", ret); spin_lock(&shca_list_lock); spin_lock_irqsave(&shca_list_lock, flags); list_add(&shca->shca_list, &shca_list); spin_unlock(&shca_list_lock); spin_unlock_irqrestore(&shca_list_lock, flags); return 0; Loading Loading @@ -878,6 +879,7 @@ static int __devinit ehca_probe(struct of_device *dev, static int __devexit ehca_remove(struct of_device *dev) { struct ehca_shca *shca = dev->dev.driver_data; unsigned long flags; int ret; sysfs_remove_group(&dev->dev.kobj, &ehca_dev_attr_grp); Loading Loading @@ -915,9 +917,9 @@ static int __devexit ehca_remove(struct of_device *dev) ib_dealloc_device(&shca->ib_device); spin_lock(&shca_list_lock); spin_lock_irqsave(&shca_list_lock, flags); list_del(&shca->shca_list); spin_unlock(&shca_list_lock); spin_unlock_irqrestore(&shca_list_lock, flags); return ret; } Loading Loading @@ -975,6 +977,7 @@ static int ehca_mem_notifier(struct notifier_block *nb, unsigned long action, void *data) { static unsigned long ehca_dmem_warn_time; unsigned long flags; switch (action) { case MEM_CANCEL_OFFLINE: Loading @@ -985,12 +988,12 @@ static int ehca_mem_notifier(struct notifier_block *nb, case MEM_GOING_ONLINE: case MEM_GOING_OFFLINE: /* only ok if no hca is attached to the lpar */ spin_lock(&shca_list_lock); spin_lock_irqsave(&shca_list_lock, flags); if (list_empty(&shca_list)) { spin_unlock(&shca_list_lock); spin_unlock_irqrestore(&shca_list_lock, flags); return NOTIFY_OK; } else { spin_unlock(&shca_list_lock); spin_unlock_irqrestore(&shca_list_lock, flags); if (printk_timed_ratelimit(&ehca_dmem_warn_time, 30 * 1000)) ehca_gen_err("DMEM operations are not allowed" Loading drivers/infiniband/hw/ehca/ehca_qp.c +6 −6 Original line number Diff line number Diff line Loading @@ -1138,14 +1138,14 @@ static int calc_left_cqes(u64 wqe_p, struct ipz_queue *ipz_queue, return -EFAULT; } tail_idx = (qmap->tail + 1) % qmap->entries; tail_idx = next_index(qmap->tail, qmap->entries); wqe_idx = q_ofs / ipz_queue->qe_size; /* check all processed wqes, whether a cqe is requested or not */ while (tail_idx != wqe_idx) { if (qmap->map[tail_idx].cqe_req) qmap->left_to_poll++; tail_idx = (tail_idx + 1) % qmap->entries; tail_idx = next_index(tail_idx, qmap->entries); } /* save index in queue, where we have to start flushing */ qmap->next_wqe_idx = wqe_idx; Loading Loading @@ -1195,14 +1195,14 @@ static int check_for_left_cqes(struct ehca_qp *my_qp, struct ehca_shca *shca) } else { spin_lock_irqsave(&my_qp->send_cq->spinlock, flags); my_qp->sq_map.left_to_poll = 0; my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % my_qp->sq_map.entries; my_qp->sq_map.next_wqe_idx = next_index(my_qp->sq_map.tail, my_qp->sq_map.entries); spin_unlock_irqrestore(&my_qp->send_cq->spinlock, flags); spin_lock_irqsave(&my_qp->recv_cq->spinlock, flags); my_qp->rq_map.left_to_poll = 0; my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % my_qp->rq_map.entries; my_qp->rq_map.next_wqe_idx = next_index(my_qp->rq_map.tail, my_qp->rq_map.entries); spin_unlock_irqrestore(&my_qp->recv_cq->spinlock, flags); } Loading drivers/infiniband/hw/ehca/ehca_reqs.c +6 −7 Original line number Diff line number Diff line Loading @@ -726,13 +726,13 @@ static inline int ehca_poll_cq_one(struct ib_cq *cq, struct ib_wc *wc) * set left_to_poll to 0 because in error state, we will not * get any additional CQEs */ my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % my_qp->sq_map.entries; my_qp->sq_map.next_wqe_idx = next_index(my_qp->sq_map.tail, my_qp->sq_map.entries); my_qp->sq_map.left_to_poll = 0; ehca_add_to_err_list(my_qp, 1); my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % my_qp->rq_map.entries; my_qp->rq_map.next_wqe_idx = next_index(my_qp->rq_map.tail, my_qp->rq_map.entries); my_qp->rq_map.left_to_poll = 0; if (HAS_RQ(my_qp)) ehca_add_to_err_list(my_qp, 0); Loading Loading @@ -860,9 +860,8 @@ static int generate_flush_cqes(struct ehca_qp *my_qp, struct ib_cq *cq, /* mark as reported and advance next_wqe pointer */ qmap_entry->reported = 1; qmap->next_wqe_idx++; if (qmap->next_wqe_idx == qmap->entries) qmap->next_wqe_idx = 0; qmap->next_wqe_idx = next_index(qmap->next_wqe_idx, qmap->entries); qmap_entry = &qmap->map[qmap->next_wqe_idx]; wc++; nr++; Loading Loading
drivers/infiniband/hw/ehca/ehca_classes.h +7 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,13 @@ struct ehca_queue_map { unsigned int next_wqe_idx; /* Idx to first wqe to be flushed */ }; /* function to calculate the next index for the qmap */ static inline unsigned int next_index(unsigned int cur_index, unsigned int limit) { unsigned int temp = cur_index + 1; return (temp == limit) ? 0 : temp; } struct ehca_qp { union { struct ib_qp ib_qp; Loading
drivers/infiniband/hw/ehca/ehca_eq.c +1 −1 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ int ehca_create_eq(struct ehca_shca *shca, if (h_ret != H_SUCCESS || vpage) goto create_eq_exit2; } else { if (h_ret != H_PAGE_REGISTERED || !vpage) if (h_ret != H_PAGE_REGISTERED) goto create_eq_exit2; } } Loading
drivers/infiniband/hw/ehca/ehca_main.c +10 −7 Original line number Diff line number Diff line Loading @@ -717,6 +717,7 @@ static int __devinit ehca_probe(struct of_device *dev, const u64 *handle; struct ib_pd *ibpd; int ret, i, eq_size; unsigned long flags; handle = of_get_property(dev->node, "ibm,hca-handle", NULL); if (!handle) { Loading Loading @@ -830,9 +831,9 @@ static int __devinit ehca_probe(struct of_device *dev, ehca_err(&shca->ib_device, "Cannot create device attributes ret=%d", ret); spin_lock(&shca_list_lock); spin_lock_irqsave(&shca_list_lock, flags); list_add(&shca->shca_list, &shca_list); spin_unlock(&shca_list_lock); spin_unlock_irqrestore(&shca_list_lock, flags); return 0; Loading Loading @@ -878,6 +879,7 @@ static int __devinit ehca_probe(struct of_device *dev, static int __devexit ehca_remove(struct of_device *dev) { struct ehca_shca *shca = dev->dev.driver_data; unsigned long flags; int ret; sysfs_remove_group(&dev->dev.kobj, &ehca_dev_attr_grp); Loading Loading @@ -915,9 +917,9 @@ static int __devexit ehca_remove(struct of_device *dev) ib_dealloc_device(&shca->ib_device); spin_lock(&shca_list_lock); spin_lock_irqsave(&shca_list_lock, flags); list_del(&shca->shca_list); spin_unlock(&shca_list_lock); spin_unlock_irqrestore(&shca_list_lock, flags); return ret; } Loading Loading @@ -975,6 +977,7 @@ static int ehca_mem_notifier(struct notifier_block *nb, unsigned long action, void *data) { static unsigned long ehca_dmem_warn_time; unsigned long flags; switch (action) { case MEM_CANCEL_OFFLINE: Loading @@ -985,12 +988,12 @@ static int ehca_mem_notifier(struct notifier_block *nb, case MEM_GOING_ONLINE: case MEM_GOING_OFFLINE: /* only ok if no hca is attached to the lpar */ spin_lock(&shca_list_lock); spin_lock_irqsave(&shca_list_lock, flags); if (list_empty(&shca_list)) { spin_unlock(&shca_list_lock); spin_unlock_irqrestore(&shca_list_lock, flags); return NOTIFY_OK; } else { spin_unlock(&shca_list_lock); spin_unlock_irqrestore(&shca_list_lock, flags); if (printk_timed_ratelimit(&ehca_dmem_warn_time, 30 * 1000)) ehca_gen_err("DMEM operations are not allowed" Loading
drivers/infiniband/hw/ehca/ehca_qp.c +6 −6 Original line number Diff line number Diff line Loading @@ -1138,14 +1138,14 @@ static int calc_left_cqes(u64 wqe_p, struct ipz_queue *ipz_queue, return -EFAULT; } tail_idx = (qmap->tail + 1) % qmap->entries; tail_idx = next_index(qmap->tail, qmap->entries); wqe_idx = q_ofs / ipz_queue->qe_size; /* check all processed wqes, whether a cqe is requested or not */ while (tail_idx != wqe_idx) { if (qmap->map[tail_idx].cqe_req) qmap->left_to_poll++; tail_idx = (tail_idx + 1) % qmap->entries; tail_idx = next_index(tail_idx, qmap->entries); } /* save index in queue, where we have to start flushing */ qmap->next_wqe_idx = wqe_idx; Loading Loading @@ -1195,14 +1195,14 @@ static int check_for_left_cqes(struct ehca_qp *my_qp, struct ehca_shca *shca) } else { spin_lock_irqsave(&my_qp->send_cq->spinlock, flags); my_qp->sq_map.left_to_poll = 0; my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % my_qp->sq_map.entries; my_qp->sq_map.next_wqe_idx = next_index(my_qp->sq_map.tail, my_qp->sq_map.entries); spin_unlock_irqrestore(&my_qp->send_cq->spinlock, flags); spin_lock_irqsave(&my_qp->recv_cq->spinlock, flags); my_qp->rq_map.left_to_poll = 0; my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % my_qp->rq_map.entries; my_qp->rq_map.next_wqe_idx = next_index(my_qp->rq_map.tail, my_qp->rq_map.entries); spin_unlock_irqrestore(&my_qp->recv_cq->spinlock, flags); } Loading
drivers/infiniband/hw/ehca/ehca_reqs.c +6 −7 Original line number Diff line number Diff line Loading @@ -726,13 +726,13 @@ static inline int ehca_poll_cq_one(struct ib_cq *cq, struct ib_wc *wc) * set left_to_poll to 0 because in error state, we will not * get any additional CQEs */ my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % my_qp->sq_map.entries; my_qp->sq_map.next_wqe_idx = next_index(my_qp->sq_map.tail, my_qp->sq_map.entries); my_qp->sq_map.left_to_poll = 0; ehca_add_to_err_list(my_qp, 1); my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % my_qp->rq_map.entries; my_qp->rq_map.next_wqe_idx = next_index(my_qp->rq_map.tail, my_qp->rq_map.entries); my_qp->rq_map.left_to_poll = 0; if (HAS_RQ(my_qp)) ehca_add_to_err_list(my_qp, 0); Loading Loading @@ -860,9 +860,8 @@ static int generate_flush_cqes(struct ehca_qp *my_qp, struct ib_cq *cq, /* mark as reported and advance next_wqe pointer */ qmap_entry->reported = 1; qmap->next_wqe_idx++; if (qmap->next_wqe_idx == qmap->entries) qmap->next_wqe_idx = 0; qmap->next_wqe_idx = next_index(qmap->next_wqe_idx, qmap->entries); qmap_entry = &qmap->map[qmap->next_wqe_idx]; wc++; nr++; Loading