8383#include <net/netfilter/nf_conntrack_bpf.h>
8484#include <net/netkit.h>
8585#include <linux/un.h>
86+ #include <net/xdp_sock_drv.h>
8687
8788#include "dev.h"
8889
@@ -4096,6 +4097,35 @@ static int bpf_xdp_frags_increase_tail(struct xdp_buff *xdp, int offset)
40964097 return 0 ;
40974098}
40984099
4100+ static void __shrink_data (struct xdp_buff * xdp , struct xdp_mem_info * mem_info ,
4101+ skb_frag_t * frag , int shrink )
4102+ {
4103+ if (mem_info -> type == MEM_TYPE_XSK_BUFF_POOL )
4104+ xsk_buff_get_tail (xdp )-> data_end -= shrink ;
4105+ skb_frag_size_sub (frag , shrink );
4106+ }
4107+
4108+ static bool shrink_data (struct xdp_buff * xdp , skb_frag_t * frag , int shrink )
4109+ {
4110+ struct xdp_mem_info * mem_info = & xdp -> rxq -> mem ;
4111+
4112+ if (skb_frag_size (frag ) == shrink ) {
4113+ struct page * page = skb_frag_page (frag );
4114+ struct xdp_buff * zc_frag = NULL ;
4115+
4116+ if (mem_info -> type == MEM_TYPE_XSK_BUFF_POOL ) {
4117+ zc_frag = xsk_buff_get_tail (xdp );
4118+
4119+ xsk_buff_del_tail (zc_frag );
4120+ }
4121+
4122+ __xdp_return (page_address (page ), mem_info , false, zc_frag );
4123+ return true;
4124+ }
4125+ __shrink_data (xdp , mem_info , frag , shrink );
4126+ return false;
4127+ }
4128+
40994129static int bpf_xdp_frags_shrink_tail (struct xdp_buff * xdp , int offset )
41004130{
41014131 struct skb_shared_info * sinfo = xdp_get_shared_info_from_buff (xdp );
@@ -4110,17 +4140,10 @@ static int bpf_xdp_frags_shrink_tail(struct xdp_buff *xdp, int offset)
41104140
41114141 len_free += shrink ;
41124142 offset -= shrink ;
4113-
4114- if (skb_frag_size (frag ) == shrink ) {
4115- struct page * page = skb_frag_page (frag );
4116-
4117- __xdp_return (page_address (page ), & xdp -> rxq -> mem ,
4118- false, NULL );
4143+ if (shrink_data (xdp , frag , shrink ))
41194144 n_frags_free ++ ;
4120- } else {
4121- skb_frag_size_sub (frag , shrink );
4145+ else
41224146 break ;
4123- }
41244147 }
41254148 sinfo -> nr_frags -= n_frags_free ;
41264149 sinfo -> xdp_frags_size -= len_free ;
0 commit comments