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:
RDMA/addr: Use client registration to fix module unload race
IB/mthca: Fix MAD extended header format for MAD_IFC firmware command
IB/uverbs: Return sq_draining value in query_qp response
IB/amso1100: Fix incorrect pr_debug()
IB/amso1100: Use dma_alloc_coherent() instead of kmalloc/dma_map_single
IB/ehca: Fix eHCA driver compilation for uniprocessor
RDMA/cma: rdma_bind_addr() leaks a cma_dev reference count
IB/iser: Start connection after enabling iSER

+113 -74
+27 -1
drivers/infiniband/core/addr.c
··· 47 47 struct sockaddr src_addr; 48 48 struct sockaddr dst_addr; 49 49 struct rdma_dev_addr *addr; 50 + struct rdma_addr_client *client; 50 51 void *context; 51 52 void (*callback)(int status, struct sockaddr *src_addr, 52 53 struct rdma_dev_addr *addr, void *context); ··· 61 60 static LIST_HEAD(req_list); 62 61 static DECLARE_WORK(work, process_req, NULL); 63 62 static struct workqueue_struct *addr_wq; 63 + 64 + void rdma_addr_register_client(struct rdma_addr_client *client) 65 + { 66 + atomic_set(&client->refcount, 1); 67 + init_completion(&client->comp); 68 + } 69 + EXPORT_SYMBOL(rdma_addr_register_client); 70 + 71 + static inline void put_client(struct rdma_addr_client *client) 72 + { 73 + if (atomic_dec_and_test(&client->refcount)) 74 + complete(&client->comp); 75 + } 76 + 77 + void rdma_addr_unregister_client(struct rdma_addr_client *client) 78 + { 79 + put_client(client); 80 + wait_for_completion(&client->comp); 81 + } 82 + EXPORT_SYMBOL(rdma_addr_unregister_client); 64 83 65 84 int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct net_device *dev, 66 85 const unsigned char *dst_dev_addr) ··· 250 229 list_del(&req->list); 251 230 req->callback(req->status, &req->src_addr, req->addr, 252 231 req->context); 232 + put_client(req->client); 253 233 kfree(req); 254 234 } 255 235 } ··· 286 264 return ret; 287 265 } 288 266 289 - int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr, 267 + int rdma_resolve_ip(struct rdma_addr_client *client, 268 + struct sockaddr *src_addr, struct sockaddr *dst_addr, 290 269 struct rdma_dev_addr *addr, int timeout_ms, 291 270 void (*callback)(int status, struct sockaddr *src_addr, 292 271 struct rdma_dev_addr *addr, void *context), ··· 308 285 req->addr = addr; 309 286 req->callback = callback; 310 287 req->context = context; 288 + req->client = client; 289 + atomic_inc(&client->refcount); 311 290 312 291 src_in = (struct sockaddr_in *) &req->src_addr; 313 292 dst_in = (struct sockaddr_in *) &req->dst_addr; ··· 330 305 break; 331 306 default: 332 307 ret = req->status; 308 + atomic_dec(&client->refcount); 333 309 kfree(req); 334 310 break; 335 311 }
+21 -10
drivers/infiniband/core/cma.c
··· 63 63 }; 64 64 65 65 static struct ib_sa_client sa_client; 66 + static struct rdma_addr_client addr_client; 66 67 static LIST_HEAD(dev_list); 67 68 static LIST_HEAD(listen_any_list); 68 69 static DEFINE_MUTEX(lock); ··· 1626 1625 if (cma_any_addr(dst_addr)) 1627 1626 ret = cma_resolve_loopback(id_priv); 1628 1627 else 1629 - ret = rdma_resolve_ip(&id->route.addr.src_addr, dst_addr, 1630 - &id->route.addr.dev_addr, 1628 + ret = rdma_resolve_ip(&addr_client, &id->route.addr.src_addr, 1629 + dst_addr, &id->route.addr.dev_addr, 1631 1630 timeout_ms, addr_handler, id_priv); 1632 1631 if (ret) 1633 1632 goto err; ··· 1763 1762 1764 1763 if (!cma_any_addr(addr)) { 1765 1764 ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); 1766 - if (!ret) { 1767 - mutex_lock(&lock); 1768 - ret = cma_acquire_dev(id_priv); 1769 - mutex_unlock(&lock); 1770 - } 1771 1765 if (ret) 1772 - goto err; 1766 + goto err1; 1767 + 1768 + mutex_lock(&lock); 1769 + ret = cma_acquire_dev(id_priv); 1770 + mutex_unlock(&lock); 1771 + if (ret) 1772 + goto err1; 1773 1773 } 1774 1774 1775 1775 memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr)); 1776 1776 ret = cma_get_port(id_priv); 1777 1777 if (ret) 1778 - goto err; 1778 + goto err2; 1779 1779 1780 1780 return 0; 1781 - err: 1781 + err2: 1782 + if (!cma_any_addr(addr)) { 1783 + mutex_lock(&lock); 1784 + cma_detach_from_dev(id_priv); 1785 + mutex_unlock(&lock); 1786 + } 1787 + err1: 1782 1788 cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE); 1783 1789 return ret; 1784 1790 } ··· 2218 2210 return -ENOMEM; 2219 2211 2220 2212 ib_sa_register_client(&sa_client); 2213 + rdma_addr_register_client(&addr_client); 2221 2214 2222 2215 ret = ib_register_client(&cma_client); 2223 2216 if (ret) ··· 2226 2217 return 0; 2227 2218 2228 2219 err: 2220 + rdma_addr_unregister_client(&addr_client); 2229 2221 ib_sa_unregister_client(&sa_client); 2230 2222 destroy_workqueue(cma_wq); 2231 2223 return ret; ··· 2235 2225 static void cma_cleanup(void) 2236 2226 { 2237 2227 ib_unregister_client(&cma_client); 2228 + rdma_addr_unregister_client(&addr_client); 2238 2229 ib_sa_unregister_client(&sa_client); 2239 2230 destroy_workqueue(cma_wq); 2240 2231 idr_destroy(&sdp_ps);
+1 -1
drivers/infiniband/core/uverbs_cmd.c
··· 1214 1214 resp.qp_access_flags = attr->qp_access_flags; 1215 1215 resp.pkey_index = attr->pkey_index; 1216 1216 resp.alt_pkey_index = attr->alt_pkey_index; 1217 - resp.en_sqd_async_notify = attr->en_sqd_async_notify; 1217 + resp.sq_draining = attr->sq_draining; 1218 1218 resp.max_rd_atomic = attr->max_rd_atomic; 1219 1219 resp.max_dest_rd_atomic = attr->max_dest_rd_atomic; 1220 1220 resp.min_rnr_timer = attr->min_rnr_timer;
+6 -7
drivers/infiniband/hw/amso1100/c2_alloc.c
··· 42 42 { 43 43 int i; 44 44 struct sp_chunk *new_head; 45 + dma_addr_t dma_addr; 45 46 46 - new_head = (struct sp_chunk *) __get_free_page(gfp_mask); 47 + new_head = dma_alloc_coherent(&c2dev->pcidev->dev, PAGE_SIZE, 48 + &dma_addr, gfp_mask); 47 49 if (new_head == NULL) 48 50 return -ENOMEM; 49 51 50 - new_head->dma_addr = dma_map_single(c2dev->ibdev.dma_device, new_head, 51 - PAGE_SIZE, DMA_FROM_DEVICE); 52 + new_head->dma_addr = dma_addr; 52 53 pci_unmap_addr_set(new_head, mapping, new_head->dma_addr); 53 54 54 55 new_head->next = NULL; ··· 81 80 82 81 while (root) { 83 82 next = root->next; 84 - dma_unmap_single(c2dev->ibdev.dma_device, 85 - pci_unmap_addr(root, mapping), PAGE_SIZE, 86 - DMA_FROM_DEVICE); 87 - __free_page((struct page *) root); 83 + dma_free_coherent(&c2dev->pcidev->dev, PAGE_SIZE, root, 84 + pci_unmap_addr(root, mapping)); 88 85 root = next; 89 86 } 90 87 }
+6 -12
drivers/infiniband/hw/amso1100/c2_cq.c
··· 246 246 247 247 static void c2_free_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq) 248 248 { 249 - 250 - dma_unmap_single(c2dev->ibdev.dma_device, pci_unmap_addr(mq, mapping), 251 - mq->q_size * mq->msg_size, DMA_FROM_DEVICE); 252 - free_pages((unsigned long) mq->msg_pool.host, 253 - get_order(mq->q_size * mq->msg_size)); 249 + dma_free_coherent(&c2dev->pcidev->dev, mq->q_size * mq->msg_size, 250 + mq->msg_pool.host, pci_unmap_addr(mq, mapping)); 254 251 } 255 252 256 253 static int c2_alloc_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq, int q_size, 257 254 int msg_size) 258 255 { 259 - unsigned long pool_start; 256 + u8 *pool_start; 260 257 261 - pool_start = __get_free_pages(GFP_KERNEL, 262 - get_order(q_size * msg_size)); 258 + pool_start = dma_alloc_coherent(&c2dev->pcidev->dev, q_size * msg_size, 259 + &mq->host_dma, GFP_KERNEL); 263 260 if (!pool_start) 264 261 return -ENOMEM; 265 262 ··· 264 267 0, /* index (currently unknown) */ 265 268 q_size, 266 269 msg_size, 267 - (u8 *) pool_start, 270 + pool_start, 268 271 NULL, /* peer (currently unknown) */ 269 272 C2_MQ_HOST_TARGET); 270 273 271 - mq->host_dma = dma_map_single(c2dev->ibdev.dma_device, 272 - (void *)pool_start, 273 - q_size * msg_size, DMA_FROM_DEVICE); 274 274 pci_unmap_addr_set(mq, mapping, mq->host_dma); 275 275 276 276 return 0;
+22 -32
drivers/infiniband/hw/amso1100/c2_rnic.c
··· 517 517 /* Initialize the Verbs Reply Queue */ 518 518 qsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q1_QSIZE)); 519 519 msgsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q1_MSGSIZE)); 520 - q1_pages = kmalloc(qsize * msgsize, GFP_KERNEL); 520 + q1_pages = dma_alloc_coherent(&c2dev->pcidev->dev, qsize * msgsize, 521 + &c2dev->rep_vq.host_dma, GFP_KERNEL); 521 522 if (!q1_pages) { 522 523 err = -ENOMEM; 523 524 goto bail1; 524 525 } 525 - c2dev->rep_vq.host_dma = dma_map_single(c2dev->ibdev.dma_device, 526 - (void *)q1_pages, qsize * msgsize, 527 - DMA_FROM_DEVICE); 528 526 pci_unmap_addr_set(&c2dev->rep_vq, mapping, c2dev->rep_vq.host_dma); 529 527 pr_debug("%s rep_vq va %p dma %llx\n", __FUNCTION__, q1_pages, 530 528 (unsigned long long) c2dev->rep_vq.host_dma); ··· 538 540 /* Initialize the Asynchronus Event Queue */ 539 541 qsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q2_QSIZE)); 540 542 msgsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q2_MSGSIZE)); 541 - q2_pages = kmalloc(qsize * msgsize, GFP_KERNEL); 543 + q2_pages = dma_alloc_coherent(&c2dev->pcidev->dev, qsize * msgsize, 544 + &c2dev->aeq.host_dma, GFP_KERNEL); 542 545 if (!q2_pages) { 543 546 err = -ENOMEM; 544 547 goto bail2; 545 548 } 546 - c2dev->aeq.host_dma = dma_map_single(c2dev->ibdev.dma_device, 547 - (void *)q2_pages, qsize * msgsize, 548 - DMA_FROM_DEVICE); 549 549 pci_unmap_addr_set(&c2dev->aeq, mapping, c2dev->aeq.host_dma); 550 - pr_debug("%s aeq va %p dma %llx\n", __FUNCTION__, q1_pages, 551 - (unsigned long long) c2dev->rep_vq.host_dma); 550 + pr_debug("%s aeq va %p dma %llx\n", __FUNCTION__, q2_pages, 551 + (unsigned long long) c2dev->aeq.host_dma); 552 552 c2_mq_rep_init(&c2dev->aeq, 553 553 2, 554 554 qsize, ··· 593 597 bail4: 594 598 vq_term(c2dev); 595 599 bail3: 596 - dma_unmap_single(c2dev->ibdev.dma_device, 597 - pci_unmap_addr(&c2dev->aeq, mapping), 598 - c2dev->aeq.q_size * c2dev->aeq.msg_size, 599 - DMA_FROM_DEVICE); 600 - kfree(q2_pages); 600 + dma_free_coherent(&c2dev->pcidev->dev, 601 + c2dev->aeq.q_size * c2dev->aeq.msg_size, 602 + q2_pages, pci_unmap_addr(&c2dev->aeq, mapping)); 601 603 bail2: 602 - dma_unmap_single(c2dev->ibdev.dma_device, 603 - pci_unmap_addr(&c2dev->rep_vq, mapping), 604 - c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size, 605 - DMA_FROM_DEVICE); 606 - kfree(q1_pages); 604 + dma_free_coherent(&c2dev->pcidev->dev, 605 + c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size, 606 + q1_pages, pci_unmap_addr(&c2dev->rep_vq, mapping)); 607 607 bail1: 608 608 c2_free_mqsp_pool(c2dev, c2dev->kern_mqsp_pool); 609 609 bail0: ··· 632 640 /* Free the verbs request allocator */ 633 641 vq_term(c2dev); 634 642 635 - /* Unmap and free the asynchronus event queue */ 636 - dma_unmap_single(c2dev->ibdev.dma_device, 637 - pci_unmap_addr(&c2dev->aeq, mapping), 638 - c2dev->aeq.q_size * c2dev->aeq.msg_size, 639 - DMA_FROM_DEVICE); 640 - kfree(c2dev->aeq.msg_pool.host); 643 + /* Free the asynchronus event queue */ 644 + dma_free_coherent(&c2dev->pcidev->dev, 645 + c2dev->aeq.q_size * c2dev->aeq.msg_size, 646 + c2dev->aeq.msg_pool.host, 647 + pci_unmap_addr(&c2dev->aeq, mapping)); 641 648 642 - /* Unmap and free the verbs reply queue */ 643 - dma_unmap_single(c2dev->ibdev.dma_device, 644 - pci_unmap_addr(&c2dev->rep_vq, mapping), 645 - c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size, 646 - DMA_FROM_DEVICE); 647 - kfree(c2dev->rep_vq.msg_pool.host); 649 + /* Free the verbs reply queue */ 650 + dma_free_coherent(&c2dev->pcidev->dev, 651 + c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size, 652 + c2dev->rep_vq.msg_pool.host, 653 + pci_unmap_addr(&c2dev->rep_vq, mapping)); 648 654 649 655 /* Free the MQ shared pointer pool */ 650 656 c2_free_mqsp_pool(c2dev, c2dev->kern_mqsp_pool);
+1
drivers/infiniband/hw/ehca/ehca_tools.h
··· 63 63 #include <asm/ibmebus.h> 64 64 #include <asm/io.h> 65 65 #include <asm/pgtable.h> 66 + #include <asm/hvcall.h> 66 67 67 68 extern int ehca_debug_level; 68 69
+7 -7
drivers/infiniband/hw/mthca/mthca_cmd.c
··· 1820 1820 1821 1821 #define MAD_IFC_BOX_SIZE 0x400 1822 1822 #define MAD_IFC_MY_QPN_OFFSET 0x100 1823 - #define MAD_IFC_RQPN_OFFSET 0x104 1824 - #define MAD_IFC_SL_OFFSET 0x108 1825 - #define MAD_IFC_G_PATH_OFFSET 0x109 1826 - #define MAD_IFC_RLID_OFFSET 0x10a 1827 - #define MAD_IFC_PKEY_OFFSET 0x10e 1823 + #define MAD_IFC_RQPN_OFFSET 0x108 1824 + #define MAD_IFC_SL_OFFSET 0x10c 1825 + #define MAD_IFC_G_PATH_OFFSET 0x10d 1826 + #define MAD_IFC_RLID_OFFSET 0x10e 1827 + #define MAD_IFC_PKEY_OFFSET 0x112 1828 1828 #define MAD_IFC_GRH_OFFSET 0x140 1829 1829 1830 1830 inmailbox = mthca_alloc_mailbox(dev, GFP_KERNEL); ··· 1862 1862 1863 1863 val = in_wc->dlid_path_bits | 1864 1864 (in_wc->wc_flags & IB_WC_GRH ? 0x80 : 0); 1865 - MTHCA_PUT(inbox, val, MAD_IFC_GRH_OFFSET); 1865 + MTHCA_PUT(inbox, val, MAD_IFC_G_PATH_OFFSET); 1866 1866 1867 1867 MTHCA_PUT(inbox, in_wc->slid, MAD_IFC_RLID_OFFSET); 1868 1868 MTHCA_PUT(inbox, in_wc->pkey_index, MAD_IFC_PKEY_OFFSET); ··· 1870 1870 if (in_grh) 1871 1871 memcpy(inbox + MAD_IFC_GRH_OFFSET, in_grh, 40); 1872 1872 1873 - op_modifier |= 0x10; 1873 + op_modifier |= 0x4; 1874 1874 1875 1875 in_modifier |= in_wc->slid << 16; 1876 1876 }
+2 -2
drivers/infiniband/ulp/iser/iscsi_iser.c
··· 363 363 struct iscsi_conn *conn = cls_conn->dd_data; 364 364 int err; 365 365 366 - err = iscsi_conn_start(cls_conn); 366 + err = iser_conn_set_full_featured_mode(conn); 367 367 if (err) 368 368 return err; 369 369 370 - return iser_conn_set_full_featured_mode(conn); 370 + return iscsi_conn_start(cls_conn); 371 371 } 372 372 373 373 static struct iscsi_transport iscsi_iser_transport;
+19 -1
include/rdma/ib_addr.h
··· 36 36 #include <linux/socket.h> 37 37 #include <rdma/ib_verbs.h> 38 38 39 + struct rdma_addr_client { 40 + atomic_t refcount; 41 + struct completion comp; 42 + }; 43 + 44 + /** 45 + * rdma_addr_register_client - Register an address client. 46 + */ 47 + void rdma_addr_register_client(struct rdma_addr_client *client); 48 + 49 + /** 50 + * rdma_addr_unregister_client - Deregister an address client. 51 + * @client: Client object to deregister. 52 + */ 53 + void rdma_addr_unregister_client(struct rdma_addr_client *client); 54 + 39 55 struct rdma_dev_addr { 40 56 unsigned char src_dev_addr[MAX_ADDR_LEN]; 41 57 unsigned char dst_dev_addr[MAX_ADDR_LEN]; ··· 68 52 /** 69 53 * rdma_resolve_ip - Resolve source and destination IP addresses to 70 54 * RDMA hardware addresses. 55 + * @client: Address client associated with request. 71 56 * @src_addr: An optional source address to use in the resolution. If a 72 57 * source address is not provided, a usable address will be returned via 73 58 * the callback. ··· 81 64 * or been canceled. A status of 0 indicates success. 82 65 * @context: User-specified context associated with the call. 83 66 */ 84 - int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr, 67 + int rdma_resolve_ip(struct rdma_addr_client *client, 68 + struct sockaddr *src_addr, struct sockaddr *dst_addr, 85 69 struct rdma_dev_addr *addr, int timeout_ms, 86 70 void (*callback)(int status, struct sockaddr *src_addr, 87 71 struct rdma_dev_addr *addr, void *context),
+1 -1
include/rdma/ib_user_verbs.h
··· 458 458 __u8 cur_qp_state; 459 459 __u8 path_mtu; 460 460 __u8 path_mig_state; 461 - __u8 en_sqd_async_notify; 461 + __u8 sq_draining; 462 462 __u8 max_rd_atomic; 463 463 __u8 max_dest_rd_atomic; 464 464 __u8 min_rnr_timer;