diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx4')
-rw-r--r-- | drivers/infiniband/hw/mlx4/mcg.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/infiniband/hw/mlx4/mcg.c b/drivers/infiniband/hw/mlx4/mcg.c index 44ff480f79f5..25b2cdff00f8 100644 --- a/drivers/infiniband/hw/mlx4/mcg.c +++ b/drivers/infiniband/hw/mlx4/mcg.c | |||
@@ -1075,10 +1075,6 @@ static void _mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy | |||
1075 | unsigned long end; | 1075 | unsigned long end; |
1076 | int count; | 1076 | int count; |
1077 | 1077 | ||
1078 | if (ctx->flushing) | ||
1079 | return; | ||
1080 | |||
1081 | ctx->flushing = 1; | ||
1082 | for (i = 0; i < MAX_VFS; ++i) | 1078 | for (i = 0; i < MAX_VFS; ++i) |
1083 | clean_vf_mcast(ctx, i); | 1079 | clean_vf_mcast(ctx, i); |
1084 | 1080 | ||
@@ -1108,9 +1104,6 @@ static void _mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy | |||
1108 | force_clean_group(group); | 1104 | force_clean_group(group); |
1109 | } | 1105 | } |
1110 | mutex_unlock(&ctx->mcg_table_lock); | 1106 | mutex_unlock(&ctx->mcg_table_lock); |
1111 | |||
1112 | if (!destroy_wq) | ||
1113 | ctx->flushing = 0; | ||
1114 | } | 1107 | } |
1115 | 1108 | ||
1116 | struct clean_work { | 1109 | struct clean_work { |
@@ -1124,6 +1117,7 @@ static void mcg_clean_task(struct work_struct *work) | |||
1124 | struct clean_work *cw = container_of(work, struct clean_work, work); | 1117 | struct clean_work *cw = container_of(work, struct clean_work, work); |
1125 | 1118 | ||
1126 | _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; | ||
1127 | kfree(cw); | 1121 | kfree(cw); |
1128 | } | 1122 | } |
1129 | 1123 | ||
@@ -1131,13 +1125,20 @@ void mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy_wq) | |||
1131 | { | 1125 | { |
1132 | struct clean_work *work; | 1126 | struct clean_work *work; |
1133 | 1127 | ||
1128 | if (ctx->flushing) | ||
1129 | return; | ||
1130 | |||
1131 | ctx->flushing = 1; | ||
1132 | |||
1134 | if (destroy_wq) { | 1133 | if (destroy_wq) { |
1135 | _mlx4_ib_mcg_port_cleanup(ctx, destroy_wq); | 1134 | _mlx4_ib_mcg_port_cleanup(ctx, destroy_wq); |
1135 | ctx->flushing = 0; | ||
1136 | return; | 1136 | return; |
1137 | } | 1137 | } |
1138 | 1138 | ||
1139 | work = kmalloc(sizeof *work, GFP_KERNEL); | 1139 | work = kmalloc(sizeof *work, GFP_KERNEL); |
1140 | if (!work) { | 1140 | if (!work) { |
1141 | ctx->flushing = 0; | ||
1141 | mcg_warn("failed allocating work for cleanup\n"); | 1142 | mcg_warn("failed allocating work for cleanup\n"); |
1142 | return; | 1143 | return; |
1143 | } | 1144 | } |