All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Carpenter <dan.carpenter@oracle.com>
To: matanb@mellanox.com
Cc: linux-rdma@vger.kernel.org
Subject: [bug report] net/mlx4_core: Support more than 64 VFs
Date: Fri, 22 Apr 2022 18:41:12 +0300	[thread overview]
Message-ID: <YmLMmEOcUrTRjqvh@kili> (raw)

Hello Matan Barak,

The patch de966c592802: "net/mlx4_core: Support more than 64 VFs"
from Nov 13, 2014, leads to the following Smatch static checker
warning:

	drivers/net/ethernet/mellanox/mlx4/main.c:3455 mlx4_load_one()
	warn: missing error code 'err'

drivers/net/ethernet/mellanox/mlx4/main.c
    3438         if (mlx4_is_master(dev)) {
    3439                 /* when we hit the goto slave_start below, dev_cap already initialized */
    3440                 if (!dev_cap) {
    3441                         dev_cap = kzalloc(sizeof(*dev_cap), GFP_KERNEL);
    3442 
    3443                         if (!dev_cap) {
    3444                                 err = -ENOMEM;
    3445                                 goto err_fw;
    3446                         }
    3447 
    3448                         err = mlx4_QUERY_DEV_CAP(dev, dev_cap);
    3449                         if (err) {
    3450                                 mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n");
    3451                                 goto err_fw;
    3452                         }
    3453 
    3454                         if (mlx4_check_dev_cap(dev, dev_cap, nvfs))
--> 3455                                 goto err_fw;
                                         ^^^^^^^^^^^^
Should this have an error code?

    3456 
    3457                         if (!(dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_SYS_EQS)) {
    3458                                 u64 dev_flags = mlx4_enable_sriov(dev, pdev,
    3459                                                                   total_vfs,
    3460                                                                   existing_vfs,
    3461                                                                   reset_flow);
    3462 
    3463                                 mlx4_close_fw(dev);
    3464                                 mlx4_cmd_cleanup(dev, MLX4_CMD_CLEANUP_ALL);
    3465                                 dev->flags = dev_flags;
    3466                                 if (!SRIOV_VALID_STATE(dev->flags)) {
    3467                                         mlx4_err(dev, "Invalid SRIOV state\n");
    3468                                         goto err_sriov;

Same

    3469                                 }
    3470                                 err = mlx4_reset(dev);
    3471                                 if (err) {
    3472                                         mlx4_err(dev, "Failed to reset HCA, aborting.\n");
    3473                                         goto err_sriov;
    3474                                 }
    3475                                 goto slave_start;
    3476                         }
    3477                 } else {
    3478                         /* Legacy mode FW requires SRIOV to be enabled before
    3479                          * doing QUERY_DEV_CAP, since max_eq's value is different if
    3480                          * SRIOV is enabled.
    3481                          */
    3482                         memset(dev_cap, 0, sizeof(*dev_cap));
    3483                         err = mlx4_QUERY_DEV_CAP(dev, dev_cap);
    3484                         if (err) {
    3485                                 mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n");
    3486                                 goto err_fw;
    3487                         }
    3488 
    3489                         if (mlx4_check_dev_cap(dev, dev_cap, nvfs))
    3490                                 goto err_fw;

Same

    3491                 }
    3492         }
    3493 
    3494         err = mlx4_init_hca(dev);
    3495         if (err) {
    3496                 if (err == -EACCES) {
    3497                         /* Not primary Physical function
    3498                          * Running in slave mode */
    3499                         mlx4_cmd_cleanup(dev, MLX4_CMD_CLEANUP_ALL);
    3500                         /* We're not a PF */
    3501                         if (dev->flags & MLX4_FLAG_SRIOV) {
    3502                                 if (!existing_vfs)
    3503                                         pci_disable_sriov(pdev);
    3504                                 if (mlx4_is_master(dev) && !reset_flow)
    3505                                         atomic_dec(&pf_loading);
    3506                                 dev->flags &= ~MLX4_FLAG_SRIOV;
    3507                         }
    3508                         if (!mlx4_is_slave(dev))
    3509                                 mlx4_free_ownership(dev);
    3510                         dev->flags |= MLX4_FLAG_SLAVE;
    3511                         dev->flags &= ~MLX4_FLAG_MASTER;
    3512                         goto slave_start;
    3513                 } else
    3514                         goto err_fw;
    3515         }
    3516 
    3517         if (mlx4_is_master(dev) && (dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_SYS_EQS)) {
    3518                 u64 dev_flags = mlx4_enable_sriov(dev, pdev, total_vfs,
    3519                                                   existing_vfs, reset_flow);
    3520 
    3521                 if ((dev->flags ^ dev_flags) & (MLX4_FLAG_MASTER | MLX4_FLAG_SLAVE)) {
    3522                         mlx4_cmd_cleanup(dev, MLX4_CMD_CLEANUP_VHCR);
    3523                         dev->flags = dev_flags;
    3524                         err = mlx4_cmd_init(dev);
    3525                         if (err) {
    3526                                 /* Only VHCR is cleaned up, so could still
    3527                                  * send FW commands
    3528                                  */
    3529                                 mlx4_err(dev, "Failed to init VHCR command interface, aborting\n");
    3530                                 goto err_close;
    3531                         }
    3532                 } else {
    3533                         dev->flags = dev_flags;
    3534                 }
    3535 
    3536                 if (!SRIOV_VALID_STATE(dev->flags)) {
    3537                         mlx4_err(dev, "Invalid SRIOV state\n");
    3538                         err = -EINVAL;
    3539                         goto err_close;
    3540                 }
    3541         }
    3542 
    3543         /* check if the device is functioning at its maximum possible speed.
    3544          * No return code for this call, just warn the user in case of PCI
    3545          * express device capabilities are under-satisfied by the bus.
    3546          */
    3547         if (!mlx4_is_slave(dev))
    3548                 pcie_print_link_status(dev->persist->pdev);
    3549 
    3550         /* In master functions, the communication channel must be initialized
    3551          * after obtaining its address from fw */
    3552         if (mlx4_is_master(dev)) {
    3553                 if (dev->caps.num_ports < 2 &&
    3554                     num_vfs_argc > 1) {
    3555                         err = -EINVAL;
    3556                         mlx4_err(dev,
    3557                                  "Error: Trying to configure VFs on port 2, but HCA has only %d physical ports\n",
    3558                                  dev->caps.num_ports);
    3559                         goto err_close;
    3560                 }
    3561                 memcpy(dev->persist->nvfs, nvfs, sizeof(dev->persist->nvfs));
    3562 
    3563                 for (i = 0;
    3564                      i < sizeof(dev->persist->nvfs)/
    3565                      sizeof(dev->persist->nvfs[0]); i++) {
    3566                         unsigned j;
    3567 
    3568                         for (j = 0; j < dev->persist->nvfs[i]; ++sum, ++j) {
    3569                                 dev->dev_vfs[sum].min_port = i < 2 ? i + 1 : 1;
    3570                                 dev->dev_vfs[sum].n_ports = i < 2 ? 1 :
    3571                                         dev->caps.num_ports;
    3572                         }
    3573                 }
    3574 
    3575                 /* In master functions, the communication channel
    3576                  * must be initialized after obtaining its address from fw
    3577                  */
    3578                 err = mlx4_multi_func_init(dev);
    3579                 if (err) {
    3580                         mlx4_err(dev, "Failed to init master mfunc interface, aborting.\n");
    3581                         goto err_close;
    3582                 }
    3583         }
    3584 
    3585         err = mlx4_alloc_eq_table(dev);
    3586         if (err)
    3587                 goto err_master_mfunc;
    3588 
    3589         bitmap_zero(priv->msix_ctl.pool_bm, MAX_MSIX);
    3590         mutex_init(&priv->msix_ctl.pool_lock);
    3591 
    3592         mlx4_enable_msi_x(dev);
    3593         if ((mlx4_is_mfunc(dev)) &&
    3594             !(dev->flags & MLX4_FLAG_MSI_X)) {
    3595                 err = -EOPNOTSUPP;
    3596                 mlx4_err(dev, "INTx is not supported in multi-function mode, aborting\n");
    3597                 goto err_free_eq;
    3598         }
    3599 
    3600         if (!mlx4_is_slave(dev)) {
    3601                 err = mlx4_init_steering(dev);
    3602                 if (err)
    3603                         goto err_disable_msix;
    3604         }
    3605 
    3606         mlx4_init_quotas(dev);
    3607 
    3608         err = mlx4_setup_hca(dev);
    3609         if (err == -EBUSY && (dev->flags & MLX4_FLAG_MSI_X) &&
    3610             !mlx4_is_mfunc(dev)) {
    3611                 dev->flags &= ~MLX4_FLAG_MSI_X;
    3612                 dev->caps.num_comp_vectors = 1;
    3613                 pci_disable_msix(pdev);
    3614                 err = mlx4_setup_hca(dev);
    3615         }
    3616 
    3617         if (err)
    3618                 goto err_steer;
    3619 
    3620         /* When PF resources are ready arm its comm channel to enable
    3621          * getting commands
    3622          */
    3623         if (mlx4_is_master(dev)) {
    3624                 err = mlx4_ARM_COMM_CHANNEL(dev);
    3625                 if (err) {
    3626                         mlx4_err(dev, " Failed to arm comm channel eq: %x\n",
    3627                                  err);
    3628                         goto err_steer;
    3629                 }
    3630         }
    3631 
    3632         for (port = 1; port <= dev->caps.num_ports; port++) {
    3633                 err = mlx4_init_port_info(dev, port);
    3634                 if (err)
    3635                         goto err_port;
    3636         }
    3637 
    3638         priv->v2p.port1 = 1;
    3639         priv->v2p.port2 = 2;
    3640 
    3641         err = mlx4_register_device(dev);
    3642         if (err)
    3643                 goto err_port;
    3644 
    3645         mlx4_request_modules(dev);
    3646 
    3647         mlx4_sense_init(dev);
    3648         mlx4_start_sense(dev);
    3649 
    3650         priv->removed = 0;
    3651 
    3652         if (mlx4_is_master(dev) && dev->persist->num_vfs && !reset_flow)
    3653                 atomic_dec(&pf_loading);
    3654 
    3655         kfree(dev_cap);
    3656         return 0;
    3657 
    3658 err_port:
    3659         for (--port; port >= 1; --port)
    3660                 mlx4_cleanup_port_info(&priv->port[port]);
    3661 
    3662         mlx4_cleanup_default_counters(dev);
    3663         if (!mlx4_is_slave(dev))
    3664                 mlx4_cleanup_counters_table(dev);
    3665         mlx4_cleanup_qp_table(dev);
    3666         mlx4_cleanup_srq_table(dev);
    3667         mlx4_cleanup_cq_table(dev);
    3668         mlx4_cmd_use_polling(dev);
    3669         mlx4_cleanup_eq_table(dev);
    3670         mlx4_cleanup_mcg_table(dev);
    3671         mlx4_cleanup_mr_table(dev);
    3672         mlx4_cleanup_xrcd_table(dev);
    3673         mlx4_cleanup_pd_table(dev);
    3674         mlx4_cleanup_uar_table(dev);
    3675 
    3676 err_steer:
    3677         if (!mlx4_is_slave(dev))
    3678                 mlx4_clear_steering(dev);
    3679 
    3680 err_disable_msix:
    3681         if (dev->flags & MLX4_FLAG_MSI_X)
    3682                 pci_disable_msix(pdev);
    3683 
    3684 err_free_eq:
    3685         mlx4_free_eq_table(dev);
    3686 
    3687 err_master_mfunc:
    3688         if (mlx4_is_master(dev)) {
    3689                 mlx4_free_resource_tracker(dev, RES_TR_FREE_STRUCTS_ONLY);
    3690                 mlx4_multi_func_cleanup(dev);
    3691         }
    3692 
    3693         if (mlx4_is_slave(dev))
    3694                 mlx4_slave_destroy_special_qp_cap(dev);
    3695 
    3696 err_close:
    3697         mlx4_close_hca(dev);
    3698 
    3699 err_fw:
    3700         mlx4_close_fw(dev);
    3701 
    3702 err_mfunc:
    3703         if (mlx4_is_slave(dev))
    3704                 mlx4_multi_func_cleanup(dev);
    3705 
    3706 err_cmd:
    3707         mlx4_cmd_cleanup(dev, MLX4_CMD_CLEANUP_ALL);
    3708 
    3709 err_sriov:
    3710         if (dev->flags & MLX4_FLAG_SRIOV && !existing_vfs) {
    3711                 pci_disable_sriov(pdev);
    3712                 dev->flags &= ~MLX4_FLAG_SRIOV;
    3713         }
    3714 
    3715         if (mlx4_is_master(dev) && dev->persist->num_vfs && !reset_flow)
    3716                 atomic_dec(&pf_loading);
    3717 
    3718         kfree(priv->dev.dev_vfs);
    3719 
    3720         if (!mlx4_is_slave(dev))
    3721                 mlx4_free_ownership(dev);
    3722 
    3723         kfree(dev_cap);
    3724         return err;
    3725 }

regards,
dan carpenter

             reply	other threads:[~2022-04-22 15:41 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-22 15:41 Dan Carpenter [this message]
2022-05-23 12:18 ` [bug report] net/mlx4_core: Support more than 64 VFs Leon Romanovsky

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=YmLMmEOcUrTRjqvh@kili \
    --to=dan.carpenter@oracle.com \
    --cc=linux-rdma@vger.kernel.org \
    --cc=matanb@mellanox.com \
    /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.