aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c14
-rw-r--r--drivers/infiniband/hw/cxgb4/device.c18
-rw-r--r--drivers/infiniband/hw/cxgb4/iw_cxgb4.h2
-rw-r--r--drivers/infiniband/hw/mlx5/qp.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/mr.c19
5 files changed, 39 insertions, 16 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index 5e153f6d4b48..768a0fb67dd6 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -432,8 +432,17 @@ static void arp_failure_discard(void *handle, struct sk_buff *skb)
432 */ 432 */
433static void act_open_req_arp_failure(void *handle, struct sk_buff *skb) 433static void act_open_req_arp_failure(void *handle, struct sk_buff *skb)
434{ 434{
435 struct c4iw_ep *ep = handle;
436
435 printk(KERN_ERR MOD "ARP failure duing connect\n"); 437 printk(KERN_ERR MOD "ARP failure duing connect\n");
436 kfree_skb(skb); 438 kfree_skb(skb);
439 connect_reply_upcall(ep, -EHOSTUNREACH);
440 state_set(&ep->com, DEAD);
441 remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid);
442 cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);
443 dst_release(ep->dst);
444 cxgb4_l2t_release(ep->l2t);
445 c4iw_put_ep(&ep->com);
437} 446}
438 447
439/* 448/*
@@ -658,7 +667,7 @@ static int send_connect(struct c4iw_ep *ep)
658 opt2 |= T5_OPT_2_VALID; 667 opt2 |= T5_OPT_2_VALID;
659 opt2 |= V_CONG_CNTRL(CONG_ALG_TAHOE); 668 opt2 |= V_CONG_CNTRL(CONG_ALG_TAHOE);
660 } 669 }
661 t4_set_arp_err_handler(skb, NULL, act_open_req_arp_failure); 670 t4_set_arp_err_handler(skb, ep, act_open_req_arp_failure);
662 671
663 if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) { 672 if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) {
664 if (ep->com.remote_addr.ss_family == AF_INET) { 673 if (ep->com.remote_addr.ss_family == AF_INET) {
@@ -2180,7 +2189,6 @@ static void reject_cr(struct c4iw_dev *dev, u32 hwtid, struct sk_buff *skb)
2180 PDBG("%s c4iw_dev %p tid %u\n", __func__, dev, hwtid); 2189 PDBG("%s c4iw_dev %p tid %u\n", __func__, dev, hwtid);
2181 BUG_ON(skb_cloned(skb)); 2190 BUG_ON(skb_cloned(skb));
2182 skb_trim(skb, sizeof(struct cpl_tid_release)); 2191 skb_trim(skb, sizeof(struct cpl_tid_release));
2183 skb_get(skb);
2184 release_tid(&dev->rdev, hwtid, skb); 2192 release_tid(&dev->rdev, hwtid, skb);
2185 return; 2193 return;
2186} 2194}
@@ -3917,7 +3925,7 @@ int __init c4iw_cm_init(void)
3917 return 0; 3925 return 0;
3918} 3926}
3919 3927
3920void __exit c4iw_cm_term(void) 3928void c4iw_cm_term(void)
3921{ 3929{
3922 WARN_ON(!list_empty(&timeout_list)); 3930 WARN_ON(!list_empty(&timeout_list));
3923 flush_workqueue(workq); 3931 flush_workqueue(workq);
diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c
index dd93aadc996e..7db82b24302b 100644
--- a/drivers/infiniband/hw/cxgb4/device.c
+++ b/drivers/infiniband/hw/cxgb4/device.c
@@ -696,6 +696,7 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev)
696 pr_err(MOD "error allocating status page\n"); 696 pr_err(MOD "error allocating status page\n");
697 goto err4; 697 goto err4;
698 } 698 }
699 rdev->status_page->db_off = 0;
699 return 0; 700 return 0;
700err4: 701err4:
701 c4iw_rqtpool_destroy(rdev); 702 c4iw_rqtpool_destroy(rdev);
@@ -729,7 +730,6 @@ static void c4iw_dealloc(struct uld_ctx *ctx)
729 if (ctx->dev->rdev.oc_mw_kva) 730 if (ctx->dev->rdev.oc_mw_kva)
730 iounmap(ctx->dev->rdev.oc_mw_kva); 731 iounmap(ctx->dev->rdev.oc_mw_kva);
731 ib_dealloc_device(&ctx->dev->ibdev); 732 ib_dealloc_device(&ctx->dev->ibdev);
732 iwpm_exit(RDMA_NL_C4IW);
733 ctx->dev = NULL; 733 ctx->dev = NULL;
734} 734}
735 735
@@ -826,12 +826,6 @@ static struct c4iw_dev *c4iw_alloc(const struct cxgb4_lld_info *infop)
826 setup_debugfs(devp); 826 setup_debugfs(devp);
827 } 827 }
828 828
829 ret = iwpm_init(RDMA_NL_C4IW);
830 if (ret) {
831 pr_err("port mapper initialization failed with %d\n", ret);
832 ib_dealloc_device(&devp->ibdev);
833 return ERR_PTR(ret);
834 }
835 829
836 return devp; 830 return devp;
837} 831}
@@ -1332,6 +1326,15 @@ static int __init c4iw_init_module(void)
1332 pr_err("%s[%u]: Failed to add netlink callback\n" 1326 pr_err("%s[%u]: Failed to add netlink callback\n"
1333 , __func__, __LINE__); 1327 , __func__, __LINE__);
1334 1328
1329 err = iwpm_init(RDMA_NL_C4IW);
1330 if (err) {
1331 pr_err("port mapper initialization failed with %d\n", err);
1332 ibnl_remove_client(RDMA_NL_C4IW);
1333 c4iw_cm_term();
1334 debugfs_remove_recursive(c4iw_debugfs_root);
1335 return err;
1336 }
1337
1335 cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info); 1338 cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info);
1336 1339
1337 return 0; 1340 return 0;
@@ -1349,6 +1352,7 @@ static void __exit c4iw_exit_module(void)
1349 } 1352 }
1350 mutex_unlock(&dev_mutex); 1353 mutex_unlock(&dev_mutex);
1351 cxgb4_unregister_uld(CXGB4_ULD_RDMA); 1354 cxgb4_unregister_uld(CXGB4_ULD_RDMA);
1355 iwpm_exit(RDMA_NL_C4IW);
1352 ibnl_remove_client(RDMA_NL_C4IW); 1356 ibnl_remove_client(RDMA_NL_C4IW);
1353 c4iw_cm_term(); 1357 c4iw_cm_term();
1354 debugfs_remove_recursive(c4iw_debugfs_root); 1358 debugfs_remove_recursive(c4iw_debugfs_root);
diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
index 125bc5d1e175..361fff7a0742 100644
--- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
+++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
@@ -908,7 +908,7 @@ int c4iw_destroy_ctrl_qp(struct c4iw_rdev *rdev);
908int c4iw_register_device(struct c4iw_dev *dev); 908int c4iw_register_device(struct c4iw_dev *dev);
909void c4iw_unregister_device(struct c4iw_dev *dev); 909void c4iw_unregister_device(struct c4iw_dev *dev);
910int __init c4iw_cm_init(void); 910int __init c4iw_cm_init(void);
911void __exit c4iw_cm_term(void); 911void c4iw_cm_term(void);
912void c4iw_release_dev_ucontext(struct c4iw_rdev *rdev, 912void c4iw_release_dev_ucontext(struct c4iw_rdev *rdev,
913 struct c4iw_dev_ucontext *uctx); 913 struct c4iw_dev_ucontext *uctx);
914void c4iw_init_dev_ucontext(struct c4iw_rdev *rdev, 914void c4iw_init_dev_ucontext(struct c4iw_rdev *rdev,
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index d13ddf1c0033..bbbcf389272c 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -675,7 +675,7 @@ static int create_kernel_qp(struct mlx5_ib_dev *dev,
675 int err; 675 int err;
676 676
677 uuari = &dev->mdev.priv.uuari; 677 uuari = &dev->mdev.priv.uuari;
678 if (init_attr->create_flags & ~IB_QP_CREATE_SIGNATURE_EN) 678 if (init_attr->create_flags & ~(IB_QP_CREATE_SIGNATURE_EN | IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK))
679 return -EINVAL; 679 return -EINVAL;
680 680
681 if (init_attr->qp_type == MLX5_IB_QPT_REG_UMR) 681 if (init_attr->qp_type == MLX5_IB_QPT_REG_UMR)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mr.c b/drivers/net/ethernet/mellanox/mlx5/core/mr.c
index ba0401d4af50..184c3615f479 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/mr.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/mr.c
@@ -94,6 +94,11 @@ int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr,
94 write_lock_irq(&table->lock); 94 write_lock_irq(&table->lock);
95 err = radix_tree_insert(&table->tree, mlx5_base_mkey(mr->key), mr); 95 err = radix_tree_insert(&table->tree, mlx5_base_mkey(mr->key), mr);
96 write_unlock_irq(&table->lock); 96 write_unlock_irq(&table->lock);
97 if (err) {
98 mlx5_core_warn(dev, "failed radix tree insert of mr 0x%x, %d\n",
99 mlx5_base_mkey(mr->key), err);
100 mlx5_core_destroy_mkey(dev, mr);
101 }
97 102
98 return err; 103 return err;
99} 104}
@@ -104,12 +109,22 @@ int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr)
104 struct mlx5_mr_table *table = &dev->priv.mr_table; 109 struct mlx5_mr_table *table = &dev->priv.mr_table;
105 struct mlx5_destroy_mkey_mbox_in in; 110 struct mlx5_destroy_mkey_mbox_in in;
106 struct mlx5_destroy_mkey_mbox_out out; 111 struct mlx5_destroy_mkey_mbox_out out;
112 struct mlx5_core_mr *deleted_mr;
107 unsigned long flags; 113 unsigned long flags;
108 int err; 114 int err;
109 115
110 memset(&in, 0, sizeof(in)); 116 memset(&in, 0, sizeof(in));
111 memset(&out, 0, sizeof(out)); 117 memset(&out, 0, sizeof(out));
112 118
119 write_lock_irqsave(&table->lock, flags);
120 deleted_mr = radix_tree_delete(&table->tree, mlx5_base_mkey(mr->key));
121 write_unlock_irqrestore(&table->lock, flags);
122 if (!deleted_mr) {
123 mlx5_core_warn(dev, "failed radix tree delete of mr 0x%x\n",
124 mlx5_base_mkey(mr->key));
125 return -ENOENT;
126 }
127
113 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_DESTROY_MKEY); 128 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_DESTROY_MKEY);
114 in.mkey = cpu_to_be32(mlx5_mkey_to_idx(mr->key)); 129 in.mkey = cpu_to_be32(mlx5_mkey_to_idx(mr->key));
115 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out)); 130 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
@@ -119,10 +134,6 @@ int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr)
119 if (out.hdr.status) 134 if (out.hdr.status)
120 return mlx5_cmd_status_to_err(&out.hdr); 135 return mlx5_cmd_status_to_err(&out.hdr);
121 136
122 write_lock_irqsave(&table->lock, flags);
123 radix_tree_delete(&table->tree, mlx5_base_mkey(mr->key));
124 write_unlock_irqrestore(&table->lock, flags);
125
126 return err; 137 return err;
127} 138}
128EXPORT_SYMBOL(mlx5_core_destroy_mkey); 139EXPORT_SYMBOL(mlx5_core_destroy_mkey);