diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx4/mcg.c')
-rw-r--r-- | drivers/infiniband/hw/mlx4/mcg.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/infiniband/hw/mlx4/mcg.c b/drivers/infiniband/hw/mlx4/mcg.c index 3c3b54c3fdd9..25b2cdff00f8 100644 --- a/drivers/infiniband/hw/mlx4/mcg.c +++ b/drivers/infiniband/hw/mlx4/mcg.c | |||
@@ -233,7 +233,8 @@ static int send_mad_to_slave(int slave, struct mlx4_ib_demux_ctx *ctx, | |||
233 | 233 | ||
234 | ib_query_ah(dev->sm_ah[ctx->port - 1], &ah_attr); | 234 | ib_query_ah(dev->sm_ah[ctx->port - 1], &ah_attr); |
235 | 235 | ||
236 | wc.pkey_index = 0; | 236 | if (ib_find_cached_pkey(&dev->ib_dev, ctx->port, IB_DEFAULT_PKEY_FULL, &wc.pkey_index)) |
237 | return -EINVAL; | ||
237 | wc.sl = 0; | 238 | wc.sl = 0; |
238 | wc.dlid_path_bits = 0; | 239 | wc.dlid_path_bits = 0; |
239 | wc.port_num = ctx->port; | 240 | wc.port_num = ctx->port; |
@@ -1074,10 +1075,6 @@ static void _mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy | |||
1074 | unsigned long end; | 1075 | unsigned long end; |
1075 | int count; | 1076 | int count; |
1076 | 1077 | ||
1077 | if (ctx->flushing) | ||
1078 | return; | ||
1079 | |||
1080 | ctx->flushing = 1; | ||
1081 | for (i = 0; i < MAX_VFS; ++i) | 1078 | for (i = 0; i < MAX_VFS; ++i) |
1082 | clean_vf_mcast(ctx, i); | 1079 | clean_vf_mcast(ctx, i); |
1083 | 1080 | ||
@@ -1107,9 +1104,6 @@ static void _mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy | |||
1107 | force_clean_group(group); | 1104 | force_clean_group(group); |
1108 | } | 1105 | } |
1109 | mutex_unlock(&ctx->mcg_table_lock); | 1106 | mutex_unlock(&ctx->mcg_table_lock); |
1110 | |||
1111 | if (!destroy_wq) | ||
1112 | ctx->flushing = 0; | ||
1113 | } | 1107 | } |
1114 | 1108 | ||
1115 | struct clean_work { | 1109 | struct clean_work { |
@@ -1123,6 +1117,7 @@ static void mcg_clean_task(struct work_struct *work) | |||
1123 | struct clean_work *cw = container_of(work, struct clean_work, work); | 1117 | struct clean_work *cw = container_of(work, struct clean_work, work); |
1124 | 1118 | ||
1125 | _mlx4_ib_mcg_port_cleanup(cw->ctx, cw->destroy_wq); | 1119 | _mlx4_ib_mcg_port_cleanup(cw->ctx, cw->destroy_wq); |
1120 | cw->ctx->flushing = 0; | ||
1126 | kfree(cw); | 1121 | kfree(cw); |
1127 | } | 1122 | } |
1128 | 1123 | ||
@@ -1130,13 +1125,20 @@ void mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy_wq) | |||
1130 | { | 1125 | { |
1131 | struct clean_work *work; | 1126 | struct clean_work *work; |
1132 | 1127 | ||
1128 | if (ctx->flushing) | ||
1129 | return; | ||
1130 | |||
1131 | ctx->flushing = 1; | ||
1132 | |||
1133 | if (destroy_wq) { | 1133 | if (destroy_wq) { |
1134 | _mlx4_ib_mcg_port_cleanup(ctx, destroy_wq); | 1134 | _mlx4_ib_mcg_port_cleanup(ctx, destroy_wq); |
1135 | ctx->flushing = 0; | ||
1135 | return; | 1136 | return; |
1136 | } | 1137 | } |
1137 | 1138 | ||
1138 | work = kmalloc(sizeof *work, GFP_KERNEL); | 1139 | work = kmalloc(sizeof *work, GFP_KERNEL); |
1139 | if (!work) { | 1140 | if (!work) { |
1141 | ctx->flushing = 0; | ||
1140 | mcg_warn("failed allocating work for cleanup\n"); | 1142 | mcg_warn("failed allocating work for cleanup\n"); |
1141 | return; | 1143 | return; |
1142 | } | 1144 | } |