* [bug report] mlx5, xsk: Migrate to new MEM_TYPE_XSK_BUFF_POOL
@ 2020-05-26 10:53 Dan Carpenter
0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2020-05-26 10:53 UTC (permalink / raw)
To: bjorn.topel; +Cc: linux-rdma
Hello Björn Töpel,
This is a semi-automatic email about new static checker warnings.
The patch 39d6443c8daf: "mlx5, xsk: Migrate to new
MEM_TYPE_XSK_BUFF_POOL" from May 20, 2020, leads to the following
Smatch complaint:
drivers/net/ethernet/mellanox/mlx5/core/en_main.c:521 mlx5e_alloc_rq()
error: we previously assumed 'rq->umem' could be null (see line 396)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
365 static int mlx5e_alloc_rq(struct mlx5e_channel *c,
366 struct mlx5e_params *params,
367 struct mlx5e_xsk_param *xsk,
368 struct xdp_umem *umem,
369 struct mlx5e_rq_param *rqp,
370 struct mlx5e_rq *rq)
371 {
372 struct page_pool_params pp_params = { 0 };
373 struct mlx5_core_dev *mdev = c->mdev;
374 void *rqc = rqp->rqc;
375 void *rqc_wq = MLX5_ADDR_OF(rqc, rqc, wq);
376 u32 rq_xdp_ix;
377 u32 pool_size;
378 int wq_sz;
379 int err;
380 int i;
381
382 rqp->wq.db_numa_node = cpu_to_node(c->cpu);
383
384 rq->wq_type = params->rq_wq_type;
385 rq->pdev = c->pdev;
386 rq->netdev = c->netdev;
387 rq->tstamp = c->tstamp;
388 rq->clock = &mdev->clock;
389 rq->channel = c;
390 rq->ix = c->ix;
391 rq->mdev = mdev;
392 rq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu);
393 rq->xdpsq = &c->rq_xdpsq;
394 rq->umem = umem;
^^^^^^^^^^^^^^^^^^
395
396 if (rq->umem)
^^^^^^^^
Check
397 rq->stats = &c->priv->channel_stats[c->ix].xskrq;
398 else
399 rq->stats = &c->priv->channel_stats[c->ix].rq;
400 INIT_WORK(&rq->recover_work, mlx5e_rq_err_cqe_work);
401
402 if (params->xdp_prog)
403 bpf_prog_inc(params->xdp_prog);
404 rq->xdp_prog = params->xdp_prog;
405
406 rq_xdp_ix = rq->ix;
407 if (xsk)
408 rq_xdp_ix += params->num_channels * MLX5E_RQ_GROUP_XSK;
409 err = xdp_rxq_info_reg(&rq->xdp_rxq, rq->netdev, rq_xdp_ix);
410 if (err < 0)
411 goto err_rq_wq_destroy;
412
413 rq->buff.map_dir = rq->xdp_prog ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE;
414 rq->buff.headroom = mlx5e_get_rq_headroom(mdev, params, xsk);
415 pool_size = 1 << params->log_rq_mtu_frames;
416
417 switch (rq->wq_type) {
418 case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ:
419 err = mlx5_wq_ll_create(mdev, &rqp->wq, rqc_wq, &rq->mpwqe.wq,
420 &rq->wq_ctrl);
421 if (err)
422 return err;
423
424 rq->mpwqe.wq.db = &rq->mpwqe.wq.db[MLX5_RCV_DBR];
425
426 wq_sz = mlx5_wq_ll_get_size(&rq->mpwqe.wq);
427
428 pool_size = MLX5_MPWRQ_PAGES_PER_WQE <<
429 mlx5e_mpwqe_get_log_rq_size(params, xsk);
430
431 rq->post_wqes = mlx5e_post_rx_mpwqes;
432 rq->dealloc_wqe = mlx5e_dealloc_rx_mpwqe;
433
434 rq->handle_rx_cqe = c->priv->profile->rx_handlers.handle_rx_cqe_mpwqe;
435 #ifdef CONFIG_MLX5_EN_IPSEC
436 if (MLX5_IPSEC_DEV(mdev)) {
437 err = -EINVAL;
438 netdev_err(c->netdev, "MPWQE RQ with IPSec offload not supported\n");
439 goto err_rq_wq_destroy;
440 }
441 #endif
442 if (!rq->handle_rx_cqe) {
443 err = -EINVAL;
444 netdev_err(c->netdev, "RX handler of MPWQE RQ is not set, err %d\n", err);
445 goto err_rq_wq_destroy;
446 }
447
448 rq->mpwqe.skb_from_cqe_mpwrq = xsk ?
449 mlx5e_xsk_skb_from_cqe_mpwrq_linear :
450 mlx5e_rx_mpwqe_is_linear_skb(mdev, params, NULL) ?
451 mlx5e_skb_from_cqe_mpwrq_linear :
452 mlx5e_skb_from_cqe_mpwrq_nonlinear;
453
454 rq->mpwqe.log_stride_sz = mlx5e_mpwqe_get_log_stride_size(mdev, params, xsk);
455 rq->mpwqe.num_strides =
456 BIT(mlx5e_mpwqe_get_log_num_strides(mdev, params, xsk));
457
458 rq->buff.frame0_sz = (1 << rq->mpwqe.log_stride_sz);
459
460 err = mlx5e_create_rq_umr_mkey(mdev, rq);
461 if (err)
462 goto err_rq_wq_destroy;
463 rq->mkey_be = cpu_to_be32(rq->umr_mkey.key);
464
465 err = mlx5e_rq_alloc_mpwqe_info(rq, c);
466 if (err)
467 goto err_free;
468 break;
469 default: /* MLX5_WQ_TYPE_CYCLIC */
470 err = mlx5_wq_cyc_create(mdev, &rqp->wq, rqc_wq, &rq->wqe.wq,
471 &rq->wq_ctrl);
472 if (err)
473 return err;
474
475 rq->wqe.wq.db = &rq->wqe.wq.db[MLX5_RCV_DBR];
476
477 wq_sz = mlx5_wq_cyc_get_size(&rq->wqe.wq);
478
479 rq->wqe.info = rqp->frags_info;
480 rq->buff.frame0_sz = rq->wqe.info.arr[0].frag_stride;
481
482 rq->wqe.frags =
483 kvzalloc_node(array_size(sizeof(*rq->wqe.frags),
484 (wq_sz << rq->wqe.info.log_num_frags)),
485 GFP_KERNEL, cpu_to_node(c->cpu));
486 if (!rq->wqe.frags) {
487 err = -ENOMEM;
488 goto err_free;
489 }
490
491 err = mlx5e_init_di_list(rq, wq_sz, c->cpu);
492 if (err)
493 goto err_free;
494
495 rq->post_wqes = mlx5e_post_rx_wqes;
496 rq->dealloc_wqe = mlx5e_dealloc_rx_wqe;
497
498 #ifdef CONFIG_MLX5_EN_IPSEC
499 if (c->priv->ipsec)
500 rq->handle_rx_cqe = mlx5e_ipsec_handle_rx_cqe;
501 else
502 #endif
503 rq->handle_rx_cqe = c->priv->profile->rx_handlers.handle_rx_cqe;
504 if (!rq->handle_rx_cqe) {
505 err = -EINVAL;
506 netdev_err(c->netdev, "RX handler of RQ is not set, err %d\n", err);
507 goto err_free;
508 }
509
510 rq->wqe.skb_from_cqe = xsk ?
511 mlx5e_xsk_skb_from_cqe_linear :
512 mlx5e_rx_is_linear_skb(params, NULL) ?
513 mlx5e_skb_from_cqe_linear :
514 mlx5e_skb_from_cqe_nonlinear;
515 rq->mkey_be = c->mkey_be;
516 }
517
518 if (xsk) {
519 err = xdp_rxq_info_reg_mem_model(&rq->xdp_rxq,
520 MEM_TYPE_XSK_BUFF_POOL, NULL);
521 xsk_buff_set_rxq_info(rq->umem, &rq->xdp_rxq);
^^^^^^^^
Unchecked dereference inside function call.
522 } else {
523 /* Create a page_pool and register it with rxq */
regards,
dan carpenter
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-05-26 10:55 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-26 10:53 [bug report] mlx5, xsk: Migrate to new MEM_TYPE_XSK_BUFF_POOL Dan Carpenter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).