@@ -1090,7 +1090,6 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
10901090 struct bpf_prog * xdp_prog ;
10911091 unsigned int truesize = mergeable_ctx_to_truesize (ctx );
10921092 unsigned int headroom = mergeable_ctx_to_headroom (ctx );
1093- unsigned int metasize = 0 ;
10941093 unsigned int tailroom = headroom ? sizeof (struct skb_shared_info ) : 0 ;
10951094 unsigned int room = SKB_DATA_ALIGN (headroom + tailroom );
10961095 unsigned int frame_sz , xdp_room ;
@@ -1186,63 +1185,24 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
11861185
11871186 switch (act ) {
11881187 case XDP_PASS :
1189- metasize = xdp .data - xdp .data_meta ;
1190-
1191- /* recalculate offset to account for any header
1192- * adjustments and minus the metasize to copy the
1193- * metadata in page_to_skb(). Note other cases do not
1194- * build an skb and avoid using offset
1195- */
1196- offset = xdp .data - page_address (xdp_page ) -
1197- vi -> hdr_len - metasize ;
1198-
1199- /* recalculate len if xdp.data, xdp.data_end or
1200- * xdp.data_meta were adjusted
1201- */
1202- len = xdp .data_end - xdp .data + vi -> hdr_len + metasize ;
1203-
1204- /* recalculate headroom if xdp.data or xdp_data_meta
1205- * were adjusted, note that offset should always point
1206- * to the start of the reserved bytes for virtio_net
1207- * header which are followed by xdp.data, that means
1208- * that offset is equal to the headroom (when buf is
1209- * starting at the beginning of the page, otherwise
1210- * there is a base offset inside the page) but it's used
1211- * with a different starting point (buf start) than
1212- * xdp.data (buf start + vnet hdr size). If xdp.data or
1213- * data_meta were adjusted by the xdp prog then the
1214- * headroom size has changed and so has the offset, we
1215- * can use data_hard_start, which points at buf start +
1216- * vnet hdr size, to calculate the new headroom and use
1217- * it later to compute buf start in page_to_skb()
1218- */
1219- headroom = xdp .data - xdp .data_hard_start - metasize ;
1220-
1221- /* We can only create skb based on xdp_page. */
1222- if (unlikely (xdp_page != page )) {
1223- rcu_read_unlock ();
1188+ if (unlikely (xdp_page != page ))
12241189 put_page (page );
1225- head_skb = page_to_skb (vi , rq , xdp_page , offset ,
1226- len , PAGE_SIZE );
1227- return head_skb ;
1228- }
1229- break ;
1190+ head_skb = build_skb_from_xdp_buff (dev , vi , & xdp , xdp_frags_truesz );
1191+ rcu_read_unlock ();
1192+ return head_skb ;
12301193 case XDP_TX :
12311194 stats -> xdp_tx ++ ;
12321195 xdpf = xdp_convert_buff_to_frame (& xdp );
12331196 if (unlikely (!xdpf )) {
1234- if (unlikely (xdp_page != page ))
1235- put_page (xdp_page );
1236- goto err_xdp ;
1197+ netdev_dbg (dev , "convert buff to frame failed for xdp\n" );
1198+ goto err_xdp_frags ;
12371199 }
12381200 err = virtnet_xdp_xmit (dev , 1 , & xdpf , 0 );
12391201 if (unlikely (!err )) {
12401202 xdp_return_frame_rx_napi (xdpf );
12411203 } else if (unlikely (err < 0 )) {
12421204 trace_xdp_exception (vi -> dev , xdp_prog , act );
1243- if (unlikely (xdp_page != page ))
1244- put_page (xdp_page );
1245- goto err_xdp ;
1205+ goto err_xdp_frags ;
12461206 }
12471207 * xdp_xmit |= VIRTIO_XDP_TX ;
12481208 if (unlikely (xdp_page != page ))
@@ -1252,11 +1212,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
12521212 case XDP_REDIRECT :
12531213 stats -> xdp_redirects ++ ;
12541214 err = xdp_do_redirect (dev , & xdp , xdp_prog );
1255- if (err ) {
1256- if (unlikely (xdp_page != page ))
1257- put_page (xdp_page );
1258- goto err_xdp ;
1259- }
1215+ if (err )
1216+ goto err_xdp_frags ;
12601217 * xdp_xmit |= VIRTIO_XDP_REDIR ;
12611218 if (unlikely (xdp_page != page ))
12621219 put_page (page );
@@ -1269,9 +1226,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
12691226 trace_xdp_exception (vi -> dev , xdp_prog , act );
12701227 fallthrough ;
12711228 case XDP_DROP :
1272- if (unlikely (xdp_page != page ))
1273- __free_pages (xdp_page , 0 );
1274- goto err_xdp ;
1229+ goto err_xdp_frags ;
12751230 }
12761231err_xdp_frags :
12771232 if (unlikely (xdp_page != page ))
0 commit comments