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

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
RDMA/cma: Do not issue MRA if user rejects connection request
mlx4_core: Move table_find from fmr_alloc to fmr_enable
IB/mlx4: mlx4_ib_fmr_alloc() should call mlx4_fmr_enable()
IPoIB: Remove unused struct ipoib_cm_tx.ibwc member
IPoIB: On P_Key change event, reset state properly
IB/mthca: Convert to use be16_add_cpu()
RDMA/cxgb3: Fail loopback connections
IB/cm: Fix infiniband_cm class kobject ref counting
IB/cm: Remove debug printk()s that snuck upstream
IB/mthca: Add missing sg_init_table() in mthca_map_user_db()

+51 -30
+8 -18
drivers/infiniband/core/cm.c
··· 3587 3587 { 3588 3588 struct cm_port *cm_port; 3589 3589 3590 - printk(KERN_ERR "free cm port\n"); 3591 - 3592 3590 cm_port = container_of(obj, struct cm_port, port_obj); 3593 3591 kfree(cm_port); 3594 3592 } ··· 3598 3600 static void cm_release_dev_obj(struct kobject *obj) 3599 3601 { 3600 3602 struct cm_device *cm_dev; 3601 - 3602 - printk(KERN_ERR "free cm dev\n"); 3603 3603 3604 3604 cm_dev = container_of(obj, struct cm_device, dev_obj); 3605 3605 kfree(cm_dev); ··· 3612 3616 }; 3613 3617 EXPORT_SYMBOL(cm_class); 3614 3618 3615 - static void cm_remove_fs_obj(struct kobject *obj) 3616 - { 3617 - kobject_put(obj->parent); 3618 - kobject_put(obj); 3619 - } 3620 - 3621 3619 static int cm_create_port_fs(struct cm_port *port) 3622 3620 { 3623 3621 int i, ret; 3624 3622 3625 3623 ret = kobject_init_and_add(&port->port_obj, &cm_port_obj_type, 3626 - kobject_get(&port->cm_dev->dev_obj), 3624 + &port->cm_dev->dev_obj, 3627 3625 "%d", port->port_num); 3628 3626 if (ret) { 3629 3627 kfree(port); ··· 3627 3637 for (i = 0; i < CM_COUNTER_GROUPS; i++) { 3628 3638 ret = kobject_init_and_add(&port->counter_group[i].obj, 3629 3639 &cm_counter_obj_type, 3630 - kobject_get(&port->port_obj), 3640 + &port->port_obj, 3631 3641 "%s", counter_group_names[i]); 3632 3642 if (ret) 3633 3643 goto error; ··· 3637 3647 3638 3648 error: 3639 3649 while (i--) 3640 - cm_remove_fs_obj(&port->counter_group[i].obj); 3641 - cm_remove_fs_obj(&port->port_obj); 3650 + kobject_put(&port->counter_group[i].obj); 3651 + kobject_put(&port->port_obj); 3642 3652 return ret; 3643 3653 3644 3654 } ··· 3648 3658 int i; 3649 3659 3650 3660 for (i = 0; i < CM_COUNTER_GROUPS; i++) 3651 - cm_remove_fs_obj(&port->counter_group[i].obj); 3661 + kobject_put(&port->counter_group[i].obj); 3652 3662 3653 - cm_remove_fs_obj(&port->port_obj); 3663 + kobject_put(&port->port_obj); 3654 3664 } 3655 3665 3656 3666 static void cm_add_one(struct ib_device *device) ··· 3734 3744 ib_unregister_mad_agent(port->mad_agent); 3735 3745 cm_remove_port_fs(port); 3736 3746 } 3737 - cm_remove_fs_obj(&cm_dev->dev_obj); 3747 + kobject_put(&cm_dev->dev_obj); 3738 3748 } 3739 3749 3740 3750 static void cm_remove_one(struct ib_device *device) ··· 3761 3771 ib_unregister_mad_agent(port->mad_agent); 3762 3772 cm_remove_port_fs(port); 3763 3773 } 3764 - cm_remove_fs_obj(&cm_dev->dev_obj); 3774 + kobject_put(&cm_dev->dev_obj); 3765 3775 } 3766 3776 3767 3777 static int __init ib_cm_init(void)
+9 -1
drivers/infiniband/core/cma.c
··· 1107 1107 event.param.ud.private_data_len = 1108 1108 IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE - offset; 1109 1109 } else { 1110 - ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0); 1111 1110 conn_id = cma_new_conn_id(&listen_id->id, ib_event); 1112 1111 cma_set_req_event_data(&event, &ib_event->param.req_rcvd, 1113 1112 ib_event->private_data, offset); ··· 1129 1130 1130 1131 ret = conn_id->id.event_handler(&conn_id->id, &event); 1131 1132 if (!ret) { 1133 + /* 1134 + * Acquire mutex to prevent user executing rdma_destroy_id() 1135 + * while we're accessing the cm_id. 1136 + */ 1137 + mutex_lock(&lock); 1138 + if (cma_comp(conn_id, CMA_CONNECT) && 1139 + !cma_is_ud_ps(conn_id->id.ps)) 1140 + ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0); 1141 + mutex_unlock(&lock); 1132 1142 cma_enable_remove(conn_id); 1133 1143 goto out; 1134 1144 }
+17
drivers/infiniband/hw/cxgb3/iwch_cm.c
··· 35 35 #include <linux/skbuff.h> 36 36 #include <linux/timer.h> 37 37 #include <linux/notifier.h> 38 + #include <linux/inetdevice.h> 38 39 39 40 #include <net/neighbour.h> 40 41 #include <net/netevent.h> ··· 1785 1784 return err; 1786 1785 } 1787 1786 1787 + static int is_loopback_dst(struct iw_cm_id *cm_id) 1788 + { 1789 + struct net_device *dev; 1790 + 1791 + dev = ip_dev_find(&init_net, cm_id->remote_addr.sin_addr.s_addr); 1792 + if (!dev) 1793 + return 0; 1794 + dev_put(dev); 1795 + return 1; 1796 + } 1797 + 1788 1798 int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) 1789 1799 { 1790 1800 int err = 0; 1791 1801 struct iwch_dev *h = to_iwch_dev(cm_id->device); 1792 1802 struct iwch_ep *ep; 1793 1803 struct rtable *rt; 1804 + 1805 + if (is_loopback_dst(cm_id)) { 1806 + err = -ENOSYS; 1807 + goto out; 1808 + } 1794 1809 1795 1810 ep = alloc_ep(sizeof(*ep), GFP_KERNEL); 1796 1811 if (!ep) {
+1 -1
drivers/infiniband/hw/mlx4/mr.c
··· 199 199 if (err) 200 200 goto err_free; 201 201 202 - err = mlx4_mr_enable(to_mdev(pd->device)->dev, &fmr->mfmr.mr); 202 + err = mlx4_fmr_enable(to_mdev(pd->device)->dev, &fmr->mfmr); 203 203 if (err) 204 204 goto err_mr; 205 205
+1 -1
drivers/infiniband/hw/mthca/mthca_cq.c
··· 473 473 if (!(new_wqe & cpu_to_be32(0x3f)) || (!cqe->db_cnt && dbd)) 474 474 return; 475 475 476 - cqe->db_cnt = cpu_to_be16(be16_to_cpu(cqe->db_cnt) - dbd); 476 + be16_add_cpu(&cqe->db_cnt, -dbd); 477 477 cqe->wqe = new_wqe; 478 478 cqe->syndrome = SYNDROME_WR_FLUSH_ERR; 479 479
+1
drivers/infiniband/hw/mthca/mthca_memfree.c
··· 542 542 for (i = 0; i < npages; ++i) { 543 543 db_tab->page[i].refcount = 0; 544 544 db_tab->page[i].uvirt = 0; 545 + sg_init_table(&db_tab->page[i].mem, 1); 545 546 } 546 547 547 548 return db_tab;
-1
drivers/infiniband/ulp/ipoib/ipoib.h
··· 209 209 unsigned tx_tail; 210 210 unsigned long flags; 211 211 u32 mtu; 212 - struct ib_wc ibwc[IPOIB_NUM_WC]; 213 212 }; 214 213 215 214 struct ipoib_cm_rx_buf {
+1
drivers/infiniband/ulp/ipoib/ipoib_ib.c
··· 780 780 if (ib_find_pkey(priv->ca, priv->port, priv->pkey, &new_index)) { 781 781 clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); 782 782 ipoib_ib_dev_down(dev, 0); 783 + ipoib_ib_dev_stop(dev, 0); 783 784 ipoib_pkey_dev_delay_open(dev); 784 785 return; 785 786 }
+13 -8
drivers/net/mlx4/mr.c
··· 578 578 goto err_free; 579 579 } 580 580 581 - fmr->mpt = mlx4_table_find(&priv->mr_table.dmpt_table, 582 - key_to_hw_index(fmr->mr.key), NULL); 583 - if (!fmr->mpt) { 584 - err = -ENOMEM; 585 - goto err_free; 586 - } 587 - 588 581 return 0; 589 582 590 583 err_free: ··· 588 595 589 596 int mlx4_fmr_enable(struct mlx4_dev *dev, struct mlx4_fmr *fmr) 590 597 { 591 - return mlx4_mr_enable(dev, &fmr->mr); 598 + struct mlx4_priv *priv = mlx4_priv(dev); 599 + int err; 600 + 601 + err = mlx4_mr_enable(dev, &fmr->mr); 602 + if (err) 603 + return err; 604 + 605 + fmr->mpt = mlx4_table_find(&priv->mr_table.dmpt_table, 606 + key_to_hw_index(fmr->mr.key), NULL); 607 + if (!fmr->mpt) 608 + return -ENOMEM; 609 + 610 + return 0; 592 611 } 593 612 EXPORT_SYMBOL_GPL(mlx4_fmr_enable); 594 613