ice: gather page_count()'s of each frag right before XDP prog call
[ Upstream commit 11c4aa07 ] If we store the pgcnt on few fragments while being in the middle of gathering the whole frame and we stumbled upon DD bit not being set, we terminate the NAPI Rx processing loop and come back later on. Then on next NAPI execution we work on previously stored pgcnt. Imagine that second half of page was used actively by networking stack and by the time we came back, stack is not busy with this page anymore and decremented the refcnt. The page reuse algorithm in this case should be good to reuse the page but given the old refcnt it will not do so and attempt to release the page via page_frag_cache_drain() with pagecnt_bias used as an arg. This in turn will result in negative refcnt on struct page, which was initially observed by Xu Du. Therefore, move the page count storage from ice_get_rx_buf() to a place where we are sure that whole frame has been collected, but before calling XDP program as it internally can also change the page count of fragments belonging to xdp_buff. Fixes: ac075339 ("ice: Store page count inside ice_rx_buf") Reported-and-tested-by:Xu Du <xudu@redhat.com> Reviewed-by:
Przemek Kitszel <przemyslaw.kitszel@intel.com> Reviewed-by:
Simon Horman <horms@kernel.org> Co-developed-by:
Jacob Keller <jacob.e.keller@intel.com> Signed-off-by:
Jacob Keller <jacob.e.keller@intel.com> Signed-off-by:
Maciej Fijalkowski <maciej.fijalkowski@intel.com> Tested-by: Chandan Kumar Rout <chandanx.rout@intel.com> (A Contingent Worker at Intel) Signed-off-by:
Tony Nguyen <anthony.l.nguyen@intel.com> Stable-dep-of: b1a0c977 ("ice: fix incorrect counter for buffer allocation failures") Signed-off-by:
Sasha Levin <sashal@kernel.org>
Loading