Message ID | 20241215205943.2341612-3-michael.chan@broadcom.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | bnxt_en: Driver update | expand |
Hi Michael, kernel test robot noticed the following build warnings: [auto build test WARNING on net-next/main] url: https://github.com/intel-lab-lkp/linux/commits/Michael-Chan/bnxt_en-Use-FW-defined-resource-limits-for-RoCE/20241216-050303 base: net-next/main patch link: https://lore.kernel.org/r/20241215205943.2341612-3-michael.chan%40broadcom.com patch subject: [PATCH net-next 2/6] bnxt_en: Do not allow ethtool -m on an untrusted VF config: riscv-randconfig-002-20241216 (https://download.01.org/0day-ci/archive/20241216/202412162242.yQ3MVnZ5-lkp@intel.com/config) compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241216/202412162242.yQ3MVnZ5-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202412162242.yQ3MVnZ5-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/net/ethernet/broadcom/bnxt/bnxt.c:8287:7: warning: variable 'flags' is uninitialized when used here [-Wuninitialized] if (flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF) ^~~~~ drivers/net/ethernet/broadcom/bnxt/bnxt.c:8269:11: note: initialize the variable 'flags' to silence this warning u16 flags; ^ = 0 1 warning generated. vim +/flags +8287 drivers/net/ethernet/broadcom/bnxt/bnxt.c 8264 8265 static int bnxt_hwrm_func_qcfg(struct bnxt *bp) 8266 { 8267 struct hwrm_func_qcfg_output *resp; 8268 struct hwrm_func_qcfg_input *req; 8269 u16 flags; 8270 int rc; 8271 8272 rc = hwrm_req_init(bp, req, HWRM_FUNC_QCFG); 8273 if (rc) 8274 return rc; 8275 8276 req->fid = cpu_to_le16(0xffff); 8277 resp = hwrm_req_hold(bp, req); 8278 rc = hwrm_req_send(bp, req); 8279 if (rc) 8280 goto func_qcfg_exit; 8281 8282 #ifdef CONFIG_BNXT_SRIOV 8283 if (BNXT_VF(bp)) { 8284 struct bnxt_vf_info *vf = &bp->vf; 8285 8286 vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK; > 8287 if (flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF) 8288 vf->flags |= BNXT_VF_TRUST; 8289 else 8290 vf->flags &= ~BNXT_VF_TRUST; 8291 } else { 8292 bp->pf.registered_vfs = le16_to_cpu(resp->registered_vfs); 8293 } 8294 #endif 8295 flags = le16_to_cpu(resp->flags); 8296 if (flags & (FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED | 8297 FUNC_QCFG_RESP_FLAGS_FW_LLDP_AGENT_ENABLED)) { 8298 bp->fw_cap |= BNXT_FW_CAP_LLDP_AGENT; 8299 if (flags & FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED) 8300 bp->fw_cap |= BNXT_FW_CAP_DCBX_AGENT; 8301 } 8302 if (BNXT_PF(bp) && (flags & FUNC_QCFG_RESP_FLAGS_MULTI_HOST)) 8303 bp->flags |= BNXT_FLAG_MULTI_HOST; 8304 8305 if (flags & FUNC_QCFG_RESP_FLAGS_RING_MONITOR_ENABLED) 8306 bp->fw_cap |= BNXT_FW_CAP_RING_MONITOR; 8307 8308 if (flags & FUNC_QCFG_RESP_FLAGS_ENABLE_RDMA_SRIOV) 8309 bp->fw_cap |= BNXT_FW_CAP_ENABLE_RDMA_SRIOV; 8310 8311 switch (resp->port_partition_type) { 8312 case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_0: 8313 case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_5: 8314 case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR2_0: 8315 bp->port_partition_type = resp->port_partition_type; 8316 break; 8317 } 8318 if (bp->hwrm_spec_code < 0x10707 || 8319 resp->evb_mode == FUNC_QCFG_RESP_EVB_MODE_VEB) 8320 bp->br_mode = BRIDGE_MODE_VEB; 8321 else if (resp->evb_mode == FUNC_QCFG_RESP_EVB_MODE_VEPA) 8322 bp->br_mode = BRIDGE_MODE_VEPA; 8323 else 8324 bp->br_mode = BRIDGE_MODE_UNDEF; 8325 8326 bp->max_mtu = le16_to_cpu(resp->max_mtu_configured); 8327 if (!bp->max_mtu) 8328 bp->max_mtu = BNXT_MAX_MTU; 8329 8330 if (bp->db_size) 8331 goto func_qcfg_exit; 8332 8333 bp->db_offset = le16_to_cpu(resp->legacy_l2_db_size_kb) * 1024; 8334 if (BNXT_CHIP_P5(bp)) { 8335 if (BNXT_PF(bp)) 8336 bp->db_offset = DB_PF_OFFSET_P5; 8337 else 8338 bp->db_offset = DB_VF_OFFSET_P5; 8339 } 8340 bp->db_size = PAGE_ALIGN(le16_to_cpu(resp->l2_doorbell_bar_size_kb) * 8341 1024); 8342 if (!bp->db_size || bp->db_size > pci_resource_len(bp->pdev, 2) || 8343 bp->db_size <= bp->db_offset) 8344 bp->db_size = pci_resource_len(bp->pdev, 2); 8345 8346 func_qcfg_exit: 8347 hwrm_req_drop(bp, req); 8348 return rc; 8349 } 8350
On Sun, Dec 15, 2024 at 12:59:39PM -0800, Michael Chan wrote: > @@ -4480,6 +4486,9 @@ static int bnxt_get_module_eeprom_by_page(struct net_device *dev, > struct bnxt *bp = netdev_priv(dev); > int rc; > > + if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) > + return -EPERM; > + Nit: You can use 'extack' here to help users understand why the operation failed. > rc = bnxt_get_module_status(bp, extack); > if (rc) > return rc;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 469352ac1f7e..631dbda725ab 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -8284,6 +8284,10 @@ static int bnxt_hwrm_func_qcfg(struct bnxt *bp) struct bnxt_vf_info *vf = &bp->vf; vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK; + if (flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF) + vf->flags |= BNXT_VF_TRUST; + else + vf->flags &= ~BNXT_VF_TRUST; } else { bp->pf.registered_vfs = le16_to_cpu(resp->registered_vfs); } diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 3e20d200da62..d5e81e008ab5 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2270,6 +2270,11 @@ struct bnxt { #define BNXT_PF(bp) (!((bp)->flags & BNXT_FLAG_VF)) #define BNXT_VF(bp) ((bp)->flags & BNXT_FLAG_VF) +#ifdef CONFIG_BNXT_SRIOV +#define BNXT_VF_IS_TRUSTED(bp) ((bp)->vf.flags & BNXT_VF_TRUST) +#else +#define BNXT_VF_IS_TRUSTED(bp) 0 +#endif #define BNXT_NPAR(bp) ((bp)->port_partition_type) #define BNXT_MH(bp) ((bp)->flags & BNXT_FLAG_MULTI_HOST) #define BNXT_SINGLE_PF(bp) (BNXT_PF(bp) && !BNXT_NPAR(bp) && !BNXT_MH(bp)) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index d87681d71106..8de488f7cb6b 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -4375,6 +4375,9 @@ static int bnxt_get_module_info(struct net_device *dev, struct bnxt *bp = netdev_priv(dev); int rc; + if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) + return -EPERM; + /* No point in going further if phy status indicates * module is not inserted or if it is powered down or * if it is of type 10GBase-T @@ -4426,6 +4429,9 @@ static int bnxt_get_module_eeprom(struct net_device *dev, u16 start = eeprom->offset, length = eeprom->len; int rc = 0; + if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) + return -EPERM; + memset(data, 0, eeprom->len); /* Read A0 portion of the EEPROM */ @@ -4480,6 +4486,9 @@ static int bnxt_get_module_eeprom_by_page(struct net_device *dev, struct bnxt *bp = netdev_priv(dev); int rc; + if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) + return -EPERM; + rc = bnxt_get_module_status(bp, extack); if (rc) return rc;