All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Carpenter <dan.carpenter@oracle.com>
To: bjorn.topel@intel.com
Cc: linux-rdma@vger.kernel.org
Subject: [bug report] mlx5, xsk: Migrate to new MEM_TYPE_XSK_BUFF_POOL
Date: Tue, 26 May 2020 13:53:19 +0300	[thread overview]
Message-ID: <20200526105319.GA182291@mwanda> (raw)

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

                 reply	other threads:[~2020-05-26 10:55 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200526105319.GA182291@mwanda \
    --to=dan.carpenter@oracle.com \
    --cc=bjorn.topel@intel.com \
    --cc=linux-rdma@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.