diff mbox series

[net,1/3] bnxt_en: extend RTNL to VF check in devlink driver_reinit

Message ID 1636961881-17824-2-git-send-email-michael.chan@broadcom.com (mailing list archive)
State Accepted
Commit 46d08f55d24e69e921456b5a40717da09199267b
Delegated to: Netdev Maintainers
Headers show
Series bnxt_en: Bug fixes | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net
netdev/fixes_present success Fixes tag present in non-next series
netdev/subject_prefix success Link
netdev/cover_letter success Series has a cover letter
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers success CCed 3 of 3 maintainers
netdev/build_clang success Errors and warnings before: 3 this patch: 3
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 16 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Michael Chan Nov. 15, 2021, 7:37 a.m. UTC
From: Edwin Peer <edwin.peer@broadcom.com>

The fixes the race condition between configuring SR-IOV and devlink
reload.  The SR-IOV configure logic already takes the RTNL lock,
setting sriov_cfg under the lock while changes are underway. Extend
the lock scope in devlink driver_reinit to cover the VF check and
don't run concurrently with SR-IOV configure.

Reported-by: Leon Romanovsky <leon@kernel.org>
Fixes: 228ea8c187d8 ("bnxt_en: implement devlink dev reload driver_reinit")
Cc: Leon Romanovsky <leon@kernel.org>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Andy Gospodarek <gospo@broadcom.com>
Signed-off-by: Edwin Peer <edwin.peer@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

kernel test robot Nov. 15, 2021, 4:30 p.m. UTC | #1
Hi Michael,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net/master]

url:    https://github.com/0day-ci/linux/commits/Michael-Chan/bnxt_en-Bug-fixes/20211115-154005
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git 1aa3b2207e889a948049c9a8016cedb0218c2389
config: mips-randconfig-r031-20211115 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project fbe72e41b99dc7994daac300d208a955be3e4a0a)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install mips cross compiling tool for clang build
        # apt-get install binutils-mips-linux-gnu
        # https://github.com/0day-ci/linux/commit/b17bc036418692ffb8055b7cbcdff979ec378e37
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Michael-Chan/bnxt_en-Bug-fixes/20211115-154005
        git checkout b17bc036418692ffb8055b7cbcdff979ec378e37
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=mips SHELL=/bin/bash drivers/net/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c:363:62: warning: format specifies type 'char' but the argument has type 'int' [-Wformat]
                   netdev_err(bp->dev, "Unexpected live patch error: %hhd\n", err);
                                                                     ~~~~     ^~~
                                                                     %d
>> drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c:445:48: error: no member named 'sriov_cfg' in 'struct bnxt'
                   if (BNXT_PF(bp) && (bp->pf.active_vfs || bp->sriov_cfg)) {
                                                            ~~  ^
   1 warning and 1 error generated.


vim +445 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c

   433	
   434	static int bnxt_dl_reload_down(struct devlink *dl, bool netns_change,
   435				       enum devlink_reload_action action,
   436				       enum devlink_reload_limit limit,
   437				       struct netlink_ext_ack *extack)
   438	{
   439		struct bnxt *bp = bnxt_get_bp_from_dl(dl);
   440		int rc = 0;
   441	
   442		switch (action) {
   443		case DEVLINK_RELOAD_ACTION_DRIVER_REINIT: {
   444			rtnl_lock();
 > 445			if (BNXT_PF(bp) && (bp->pf.active_vfs || bp->sriov_cfg)) {
   446				NL_SET_ERR_MSG_MOD(extack,
   447						   "reload is unsupported while VFs are allocated or being configured");
   448				rtnl_unlock();
   449				return -EOPNOTSUPP;
   450			}
   451			if (bp->dev->reg_state == NETREG_UNREGISTERED) {
   452				rtnl_unlock();
   453				return -ENODEV;
   454			}
   455			bnxt_ulp_stop(bp);
   456			if (netif_running(bp->dev)) {
   457				rc = bnxt_close_nic(bp, true, true);
   458				if (rc) {
   459					NL_SET_ERR_MSG_MOD(extack, "Failed to close");
   460					dev_close(bp->dev);
   461					rtnl_unlock();
   462					break;
   463				}
   464			}
   465			bnxt_vf_reps_free(bp);
   466			rc = bnxt_hwrm_func_drv_unrgtr(bp);
   467			if (rc) {
   468				NL_SET_ERR_MSG_MOD(extack, "Failed to deregister");
   469				if (netif_running(bp->dev))
   470					dev_close(bp->dev);
   471				rtnl_unlock();
   472				break;
   473			}
   474			bnxt_cancel_reservations(bp, false);
   475			bnxt_free_ctx_mem(bp);
   476			kfree(bp->ctx);
   477			bp->ctx = NULL;
   478			break;
   479		}
   480		case DEVLINK_RELOAD_ACTION_FW_ACTIVATE: {
   481			if (limit == DEVLINK_RELOAD_LIMIT_NO_RESET)
   482				return bnxt_dl_livepatch_activate(bp, extack);
   483			if (~bp->fw_cap & BNXT_FW_CAP_HOT_RESET) {
   484				NL_SET_ERR_MSG_MOD(extack, "Device not capable, requires reboot");
   485				return -EOPNOTSUPP;
   486			}
   487			if (!bnxt_hwrm_reset_permitted(bp)) {
   488				NL_SET_ERR_MSG_MOD(extack,
   489						   "Reset denied by firmware, it may be inhibited by remote driver");
   490				return -EPERM;
   491			}
   492			rtnl_lock();
   493			if (bp->dev->reg_state == NETREG_UNREGISTERED) {
   494				rtnl_unlock();
   495				return -ENODEV;
   496			}
   497			if (netif_running(bp->dev))
   498				set_bit(BNXT_STATE_FW_ACTIVATE, &bp->state);
   499			rc = bnxt_hwrm_firmware_reset(bp->dev,
   500						      FW_RESET_REQ_EMBEDDED_PROC_TYPE_CHIP,
   501						      FW_RESET_REQ_SELFRST_STATUS_SELFRSTASAP,
   502						      FW_RESET_REQ_FLAGS_RESET_GRACEFUL |
   503						      FW_RESET_REQ_FLAGS_FW_ACTIVATION);
   504			if (rc) {
   505				NL_SET_ERR_MSG_MOD(extack, "Failed to activate firmware");
   506				clear_bit(BNXT_STATE_FW_ACTIVATE, &bp->state);
   507				rtnl_unlock();
   508			}
   509			break;
   510		}
   511		default:
   512			rc = -EOPNOTSUPP;
   513		}
   514	
   515		return rc;
   516	}
   517	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Jakub Kicinski Nov. 16, 2021, 2:39 p.m. UTC | #2
On Tue, 16 Nov 2021 00:30:34 +0800 kernel test robot wrote:
> >> drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c:445:48: error: no member named 'sriov_cfg' in 'struct bnxt'  
>                    if (BNXT_PF(bp) && (bp->pf.active_vfs || bp->sriov_cfg)) {
>                                                             ~~  ^

Hi Michael, is this a false positive? Is the fix coming?
Michael Chan Nov. 16, 2021, 4:20 p.m. UTC | #3
On Tue, Nov 16, 2021 at 6:39 AM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Tue, 16 Nov 2021 00:30:34 +0800 kernel test robot wrote:
> > >> drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c:445:48: error: no member named 'sriov_cfg' in 'struct bnxt'
> >                    if (BNXT_PF(bp) && (bp->pf.active_vfs || bp->sriov_cfg)) {
> >                                                             ~~  ^
>
> Hi Michael, is this a false positive? Is the fix coming?

It's a real error when CONFIG_BNXT_SRIOV is not enabled.  I'll send
the fix later today.  Thanks.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index 5c464ea73576..a0a9af402642 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -441,12 +441,13 @@  static int bnxt_dl_reload_down(struct devlink *dl, bool netns_change,
 
 	switch (action) {
 	case DEVLINK_RELOAD_ACTION_DRIVER_REINIT: {
-		if (BNXT_PF(bp) && bp->pf.active_vfs) {
+		rtnl_lock();
+		if (BNXT_PF(bp) && (bp->pf.active_vfs || bp->sriov_cfg)) {
 			NL_SET_ERR_MSG_MOD(extack,
-					   "reload is unsupported when VFs are allocated");
+					   "reload is unsupported while VFs are allocated or being configured");
+			rtnl_unlock();
 			return -EOPNOTSUPP;
 		}
-		rtnl_lock();
 		if (bp->dev->reg_state == NETREG_UNREGISTERED) {
 			rtnl_unlock();
 			return -ENODEV;