In i40e_hw_set_dcb_config(), both new_cfg and old_cfg are pointers to struct i40e_dcbx_config, so sizeof(new_cfg) evaluates to the size of a pointer (8 bytes on 64-bit) rather than the size of the struct. Likewise, &new_cfg and &old_cfg are the addresses of the pointer variables on the stack, not the addresses of the actual config structs. As a result, the memcmp never compares the actual configuration data, meaning the "no change needed" early return never fires. Every call to this function performs a full DCB reconfiguration (quiescing all VSIs, reprogramming via "Set LLDP MIB" AQC, and reconfiguring VEB/VSIs) even when the configuration has not changed. Fix this by comparing the structs themselves rather than the pointers. Fixes: 4b208eaa8078 ("i40e: Add init and default config of software based DCB") Cc: stable@vger.kernel.org Signed-off-by: Aaron Esau --- Found using Coccinelle/spatch with a semantic patch that matches sizeof(ptr) and &ptr used together where ptr is a pointer type. drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index XXXXXXX..XXXXXXX 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -6904,7 +6904,7 @@ static int i40e_hw_set_dcb_config(struct i40e_pf *pf, int ret; /* Check if need reconfiguration */ - if (!memcmp(&new_cfg, &old_cfg, sizeof(new_cfg))) { + if (!memcmp(new_cfg, old_cfg, sizeof(*new_cfg))) { dev_dbg(&pf->pdev->dev, "No Change in DCB Config required.\n"); return 0; } -- 2.49.0