On Wed, May 15, 2024 at 06:02:15PM +0200, Larysa Zaremba wrote: > Commit 6624e780a577 ("ice: split ice_vsi_setup into smaller functions") > has placed ice_vsi_free_q_vectors() after ice_destroy_xdp_rings() in > the rebuild process. The behaviour of the XDP rings config functions is > context-dependent, so the change of order has led to > ice_destroy_xdp_rings() doing additional work and removing XDP prog, when > it was supposed to be preserved. > > Also, dependency on the PF state reset flags creates an additional, > fortunately less common problem: > > * PFR is requested e.g. by tx_timeout handler > * .ndo_bpf() is asked to delete the program, calls ice_destroy_xdp_rings(), > but reset flag is set, so rings are destroyed without deleting the > program > * ice_vsi_rebuild tries to delete non-existent XDP rings, because the > program is still on the VSI > * system crashes > > With a similar race, when requested to attach a program, > ice_prepare_xdp_rings() can actually skip setting the program in the VSI > and nevertheless report success. > > Instead of reverting to the old order of function calls, add an enum > argument to both ice_prepare_xdp_rings() and ice_destroy_xdp_rings() in > order to distinguish between calls from rebuild and .ndo_bpf(). > > Fixes: efc2214b6047 ("ice: Add support for XDP") > Reviewed-by: Igor Bagnucki <igor.bagnucki@xxxxxxxxx> > Signed-off-by: Larysa Zaremba <larysa.zaremba@xxxxxxxxx> Reviewed-by: Simon Horman <horms@xxxxxxxxxx>