Skip to content

Commit d723338

Browse files
Jack Morgensteindavem330
authored andcommitted
mlx4_core: cq modifications for SRIOV
CQs are resources which are allocated and tracked by the PF driver. In multifunction mode, the allocation and icm mapping is done in the resource tracker (later patch in this sequence). To accomplish this, we have "work" functions whose names start with "__", and "request" functions (same name, no __). If we are operating in multifunction mode, the request function actually results in comm-channel commands being sent (ALLOC_RES or FREE_RES). The PF-driver comm-channel handler will ultimately invoke the "work" (__) function and return the result. If we are not in multifunction mode, the "work" handler is invoked immediately. Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent fe9a260 commit d723338

File tree

1 file changed

+89
-27
lines changed
  • drivers/net/ethernet/mellanox/mlx4

1 file changed

+89
-27
lines changed

drivers/net/ethernet/mellanox/mlx4/cq.c

Lines changed: 89 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434
* SOFTWARE.
3535
*/
3636

37+
#include <linux/init.h>
3738
#include <linux/hardirq.h>
3839
#include <linux/export.h>
39-
#include <linux/gfp.h>
4040

4141
#include <linux/mlx4/cmd.h>
4242
#include <linux/mlx4/cq.h>
@@ -81,7 +81,7 @@ void mlx4_cq_completion(struct mlx4_dev *dev, u32 cqn)
8181
cq = radix_tree_lookup(&mlx4_priv(dev)->cq_table.tree,
8282
cqn & (dev->caps.num_cqs - 1));
8383
if (!cq) {
84-
mlx4_warn(dev, "Completion event for bogus CQ %08x\n", cqn);
84+
mlx4_dbg(dev, "Completion event for bogus CQ %08x\n", cqn);
8585
return;
8686
}
8787

@@ -117,8 +117,9 @@ void mlx4_cq_event(struct mlx4_dev *dev, u32 cqn, int event_type)
117117
static int mlx4_SW2HW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox,
118118
int cq_num)
119119
{
120-
return mlx4_cmd(dev, mailbox->dma, cq_num, 0, MLX4_CMD_SW2HW_CQ,
121-
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
120+
return mlx4_cmd(dev, mailbox->dma | dev->caps.function, cq_num, 0,
121+
MLX4_CMD_SW2HW_CQ, MLX4_CMD_TIME_CLASS_A,
122+
MLX4_CMD_WRAPPED);
122123
}
123124

124125
static int mlx4_MODIFY_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox,
@@ -131,8 +132,8 @@ static int mlx4_MODIFY_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox
131132
static int mlx4_HW2SW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox,
132133
int cq_num)
133134
{
134-
return mlx4_cmd_box(dev, 0, mailbox ? mailbox->dma : 0, cq_num,
135-
mailbox ? 0 : 1, MLX4_CMD_HW2SW_CQ,
135+
return mlx4_cmd_box(dev, dev->caps.function, mailbox ? mailbox->dma : 0,
136+
cq_num, mailbox ? 0 : 1, MLX4_CMD_HW2SW_CQ,
136137
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
137138
}
138139

@@ -188,6 +189,78 @@ int mlx4_cq_resize(struct mlx4_dev *dev, struct mlx4_cq *cq,
188189
}
189190
EXPORT_SYMBOL_GPL(mlx4_cq_resize);
190191

192+
static int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn)
193+
{
194+
struct mlx4_priv *priv = mlx4_priv(dev);
195+
struct mlx4_cq_table *cq_table = &priv->cq_table;
196+
int err;
197+
198+
*cqn = mlx4_bitmap_alloc(&cq_table->bitmap);
199+
if (*cqn == -1)
200+
return -ENOMEM;
201+
202+
err = mlx4_table_get(dev, &cq_table->table, *cqn);
203+
if (err)
204+
goto err_out;
205+
206+
err = mlx4_table_get(dev, &cq_table->cmpt_table, *cqn);
207+
if (err)
208+
goto err_put;
209+
return 0;
210+
211+
err_put:
212+
mlx4_table_put(dev, &cq_table->table, *cqn);
213+
214+
err_out:
215+
mlx4_bitmap_free(&cq_table->bitmap, *cqn);
216+
return err;
217+
}
218+
219+
static int mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn)
220+
{
221+
u64 out_param;
222+
int err;
223+
224+
if (mlx4_is_mfunc(dev)) {
225+
err = mlx4_cmd_imm(dev, 0, &out_param, RES_CQ,
226+
RES_OP_RESERVE_AND_MAP, MLX4_CMD_ALLOC_RES,
227+
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
228+
if (err)
229+
return err;
230+
else {
231+
*cqn = get_param_l(&out_param);
232+
return 0;
233+
}
234+
}
235+
return __mlx4_cq_alloc_icm(dev, cqn);
236+
}
237+
238+
static void __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn)
239+
{
240+
struct mlx4_priv *priv = mlx4_priv(dev);
241+
struct mlx4_cq_table *cq_table = &priv->cq_table;
242+
243+
mlx4_table_put(dev, &cq_table->cmpt_table, cqn);
244+
mlx4_table_put(dev, &cq_table->table, cqn);
245+
mlx4_bitmap_free(&cq_table->bitmap, cqn);
246+
}
247+
248+
static void mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn)
249+
{
250+
u64 in_param;
251+
int err;
252+
253+
if (mlx4_is_mfunc(dev)) {
254+
set_param_l(&in_param, cqn);
255+
err = mlx4_cmd(dev, in_param, RES_CQ, RES_OP_RESERVE_AND_MAP,
256+
MLX4_CMD_FREE_RES,
257+
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
258+
if (err)
259+
mlx4_warn(dev, "Failed freeing cq:%d\n", cqn);
260+
} else
261+
__mlx4_cq_free_icm(dev, cqn);
262+
}
263+
191264
int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt,
192265
struct mlx4_uar *uar, u64 db_rec, struct mlx4_cq *cq,
193266
unsigned vector, int collapsed)
@@ -204,23 +277,15 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt,
204277

205278
cq->vector = vector;
206279

207-
cq->cqn = mlx4_bitmap_alloc(&cq_table->bitmap);
208-
if (cq->cqn == -1)
209-
return -ENOMEM;
210-
211-
err = mlx4_table_get(dev, &cq_table->table, cq->cqn);
212-
if (err)
213-
goto err_out;
214-
215-
err = mlx4_table_get(dev, &cq_table->cmpt_table, cq->cqn);
280+
err = mlx4_cq_alloc_icm(dev, &cq->cqn);
216281
if (err)
217-
goto err_put;
282+
return err;
218283

219284
spin_lock_irq(&cq_table->lock);
220285
err = radix_tree_insert(&cq_table->tree, cq->cqn, cq);
221286
spin_unlock_irq(&cq_table->lock);
222287
if (err)
223-
goto err_cmpt_put;
288+
goto err_icm;
224289

225290
mailbox = mlx4_alloc_cmd_mailbox(dev);
226291
if (IS_ERR(mailbox)) {
@@ -259,14 +324,8 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt,
259324
radix_tree_delete(&cq_table->tree, cq->cqn);
260325
spin_unlock_irq(&cq_table->lock);
261326

262-
err_cmpt_put:
263-
mlx4_table_put(dev, &cq_table->cmpt_table, cq->cqn);
264-
265-
err_put:
266-
mlx4_table_put(dev, &cq_table->table, cq->cqn);
267-
268-
err_out:
269-
mlx4_bitmap_free(&cq_table->bitmap, cq->cqn);
327+
err_icm:
328+
mlx4_cq_free_icm(dev, cq->cqn);
270329

271330
return err;
272331
}
@@ -292,8 +351,7 @@ void mlx4_cq_free(struct mlx4_dev *dev, struct mlx4_cq *cq)
292351
complete(&cq->free);
293352
wait_for_completion(&cq->free);
294353

295-
mlx4_table_put(dev, &cq_table->table, cq->cqn);
296-
mlx4_bitmap_free(&cq_table->bitmap, cq->cqn);
354+
mlx4_cq_free_icm(dev, cq->cqn);
297355
}
298356
EXPORT_SYMBOL_GPL(mlx4_cq_free);
299357

@@ -304,6 +362,8 @@ int mlx4_init_cq_table(struct mlx4_dev *dev)
304362

305363
spin_lock_init(&cq_table->lock);
306364
INIT_RADIX_TREE(&cq_table->tree, GFP_ATOMIC);
365+
if (mlx4_is_slave(dev))
366+
return 0;
307367

308368
err = mlx4_bitmap_init(&cq_table->bitmap, dev->caps.num_cqs,
309369
dev->caps.num_cqs - 1, dev->caps.reserved_cqs, 0);
@@ -315,6 +375,8 @@ int mlx4_init_cq_table(struct mlx4_dev *dev)
315375

316376
void mlx4_cleanup_cq_table(struct mlx4_dev *dev)
317377
{
378+
if (mlx4_is_slave(dev))
379+
return;
318380
/* Nothing to do to clean up radix_tree */
319381
mlx4_bitmap_cleanup(&mlx4_priv(dev)->cq_table.bitmap);
320382
}

0 commit comments

Comments
 (0)