virtio_net.c (18117a842ab029df139f776bf31eebff6d0e0730) | virtio_net.c (fab89bafa95b6f333b0e2dca0ae07a0b3600e954) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* A network driver using virtio. 3 * 4 * Copyright 2007 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation 5 */ 6//#define DEBUG 7#include <linux/netdevice.h> 8#include <linux/etherdevice.h> --- 1076 unchanged lines hidden (view full) --- 1085 struct virtio_net_hdr_mrg_rxbuf *hdr = buf; 1086 u16 num_buf = virtio16_to_cpu(vi->vdev, hdr->num_buffers); 1087 struct page *page = virt_to_head_page(buf); 1088 int offset = buf - page_address(page); 1089 struct sk_buff *head_skb, *curr_skb; 1090 struct bpf_prog *xdp_prog; 1091 unsigned int truesize = mergeable_ctx_to_truesize(ctx); 1092 unsigned int headroom = mergeable_ctx_to_headroom(ctx); | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* A network driver using virtio. 3 * 4 * Copyright 2007 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation 5 */ 6//#define DEBUG 7#include <linux/netdevice.h> 8#include <linux/etherdevice.h> --- 1076 unchanged lines hidden (view full) --- 1085 struct virtio_net_hdr_mrg_rxbuf *hdr = buf; 1086 u16 num_buf = virtio16_to_cpu(vi->vdev, hdr->num_buffers); 1087 struct page *page = virt_to_head_page(buf); 1088 int offset = buf - page_address(page); 1089 struct sk_buff *head_skb, *curr_skb; 1090 struct bpf_prog *xdp_prog; 1091 unsigned int truesize = mergeable_ctx_to_truesize(ctx); 1092 unsigned int headroom = mergeable_ctx_to_headroom(ctx); |
1093 unsigned int metasize = 0; | |
1094 unsigned int tailroom = headroom ? sizeof(struct skb_shared_info) : 0; 1095 unsigned int room = SKB_DATA_ALIGN(headroom + tailroom); 1096 unsigned int frame_sz, xdp_room; 1097 int err; 1098 1099 head_skb = NULL; 1100 stats->bytes += len - vi->hdr_len; 1101 --- 79 unchanged lines hidden (view full) --- 1181 if (unlikely(err)) 1182 goto err_xdp_frags; 1183 1184 act = bpf_prog_run_xdp(xdp_prog, &xdp); 1185 stats->xdp_packets++; 1186 1187 switch (act) { 1188 case XDP_PASS: | 1093 unsigned int tailroom = headroom ? sizeof(struct skb_shared_info) : 0; 1094 unsigned int room = SKB_DATA_ALIGN(headroom + tailroom); 1095 unsigned int frame_sz, xdp_room; 1096 int err; 1097 1098 head_skb = NULL; 1099 stats->bytes += len - vi->hdr_len; 1100 --- 79 unchanged lines hidden (view full) --- 1180 if (unlikely(err)) 1181 goto err_xdp_frags; 1182 1183 act = bpf_prog_run_xdp(xdp_prog, &xdp); 1184 stats->xdp_packets++; 1185 1186 switch (act) { 1187 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)) |
1224 put_page(page); | 1189 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; |
1230 case XDP_TX: 1231 stats->xdp_tx++; 1232 xdpf = xdp_convert_buff_to_frame(&xdp); 1233 if (unlikely(!xdpf)) { | 1193 case XDP_TX: 1194 stats->xdp_tx++; 1195 xdpf = xdp_convert_buff_to_frame(&xdp); 1196 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; |
1237 } 1238 err = virtnet_xdp_xmit(dev, 1, &xdpf, 0); 1239 if (unlikely(!err)) { 1240 xdp_return_frame_rx_napi(xdpf); 1241 } else if (unlikely(err < 0)) { 1242 trace_xdp_exception(vi->dev, xdp_prog, act); | 1199 } 1200 err = virtnet_xdp_xmit(dev, 1, &xdpf, 0); 1201 if (unlikely(!err)) { 1202 xdp_return_frame_rx_napi(xdpf); 1203 } else if (unlikely(err < 0)) { 1204 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; |
1246 } 1247 *xdp_xmit |= VIRTIO_XDP_TX; 1248 if (unlikely(xdp_page != page)) 1249 put_page(page); 1250 rcu_read_unlock(); 1251 goto xdp_xmit; 1252 case XDP_REDIRECT: 1253 stats->xdp_redirects++; 1254 err = xdp_do_redirect(dev, &xdp, xdp_prog); | 1206 } 1207 *xdp_xmit |= VIRTIO_XDP_TX; 1208 if (unlikely(xdp_page != page)) 1209 put_page(page); 1210 rcu_read_unlock(); 1211 goto xdp_xmit; 1212 case XDP_REDIRECT: 1213 stats->xdp_redirects++; 1214 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; |
1260 *xdp_xmit |= VIRTIO_XDP_REDIR; 1261 if (unlikely(xdp_page != page)) 1262 put_page(page); 1263 rcu_read_unlock(); 1264 goto xdp_xmit; 1265 default: 1266 bpf_warn_invalid_xdp_action(vi->dev, xdp_prog, act); 1267 fallthrough; 1268 case XDP_ABORTED: 1269 trace_xdp_exception(vi->dev, xdp_prog, act); 1270 fallthrough; 1271 case XDP_DROP: | 1217 *xdp_xmit |= VIRTIO_XDP_REDIR; 1218 if (unlikely(xdp_page != page)) 1219 put_page(page); 1220 rcu_read_unlock(); 1221 goto xdp_xmit; 1222 default: 1223 bpf_warn_invalid_xdp_action(vi->dev, xdp_prog, act); 1224 fallthrough; 1225 case XDP_ABORTED: 1226 trace_xdp_exception(vi->dev, xdp_prog, act); 1227 fallthrough; 1228 case XDP_DROP: |
1272 if (unlikely(xdp_page != page)) 1273 __free_pages(xdp_page, 0); 1274 goto err_xdp; | 1229 goto err_xdp_frags; |
1275 } 1276err_xdp_frags: 1277 if (unlikely(xdp_page != page)) 1278 __free_pages(xdp_page, 0); 1279 1280 if (xdp_buff_has_frags(&xdp)) { 1281 shinfo = xdp_get_shared_info_from_buff(&xdp); 1282 for (i = 0; i < shinfo->nr_frags; i++) { --- 3015 unchanged lines hidden --- | 1230 } 1231err_xdp_frags: 1232 if (unlikely(xdp_page != page)) 1233 __free_pages(xdp_page, 0); 1234 1235 if (xdp_buff_has_frags(&xdp)) { 1236 shinfo = xdp_get_shared_info_from_buff(&xdp); 1237 for (i = 0; i < shinfo->nr_frags; i++) { --- 3015 unchanged lines hidden --- |