@@ -124,6 +124,11 @@ struct virtnet_info {
124
124
/* Lock for config space updates */
125
125
struct mutex config_lock ;
126
126
127
+ /* Page_frag for GFP_KERNEL packet buffer allocation when we run
128
+ * low on memory.
129
+ */
130
+ struct page_frag alloc_frag ;
131
+
127
132
/* Does the affinity hint is set for virtqueues? */
128
133
bool affinity_hint_set ;
129
134
@@ -217,33 +222,18 @@ static void skb_xmit_done(struct virtqueue *vq)
217
222
netif_wake_subqueue (vi -> dev , vq2txq (vq ));
218
223
}
219
224
220
- static void set_skb_frag (struct sk_buff * skb , struct page * page ,
221
- unsigned int offset , unsigned int * len )
222
- {
223
- int size = min ((unsigned )PAGE_SIZE - offset , * len );
224
- int i = skb_shinfo (skb )-> nr_frags ;
225
-
226
- __skb_fill_page_desc (skb , i , page , offset , size );
227
-
228
- skb -> data_len += size ;
229
- skb -> len += size ;
230
- skb -> truesize += PAGE_SIZE ;
231
- skb_shinfo (skb )-> nr_frags ++ ;
232
- skb_shinfo (skb )-> tx_flags |= SKBTX_SHARED_FRAG ;
233
- * len -= size ;
234
- }
235
-
236
225
/* Called from bottom half context */
237
226
static struct sk_buff * page_to_skb (struct receive_queue * rq ,
238
- struct page * page , unsigned int len )
227
+ struct page * page , unsigned int offset ,
228
+ unsigned int len , unsigned int truesize )
239
229
{
240
230
struct virtnet_info * vi = rq -> vq -> vdev -> priv ;
241
231
struct sk_buff * skb ;
242
232
struct skb_vnet_hdr * hdr ;
243
- unsigned int copy , hdr_len , offset ;
233
+ unsigned int copy , hdr_len , hdr_padded_len ;
244
234
char * p ;
245
235
246
- p = page_address (page );
236
+ p = page_address (page ) + offset ;
247
237
248
238
/* copy small packet so we can reuse these pages for small data */
249
239
skb = netdev_alloc_skb_ip_align (vi -> dev , GOOD_COPY_LEN );
@@ -254,16 +244,17 @@ static struct sk_buff *page_to_skb(struct receive_queue *rq,
254
244
255
245
if (vi -> mergeable_rx_bufs ) {
256
246
hdr_len = sizeof hdr -> mhdr ;
257
- offset = hdr_len ;
247
+ hdr_padded_len = sizeof hdr -> mhdr ;
258
248
} else {
259
249
hdr_len = sizeof hdr -> hdr ;
260
- offset = sizeof (struct padded_vnet_hdr );
250
+ hdr_padded_len = sizeof (struct padded_vnet_hdr );
261
251
}
262
252
263
253
memcpy (hdr , p , hdr_len );
264
254
265
255
len -= hdr_len ;
266
- p += offset ;
256
+ offset += hdr_padded_len ;
257
+ p += hdr_padded_len ;
267
258
268
259
copy = len ;
269
260
if (copy > skb_tailroom (skb ))
@@ -273,6 +264,14 @@ static struct sk_buff *page_to_skb(struct receive_queue *rq,
273
264
len -= copy ;
274
265
offset += copy ;
275
266
267
+ if (vi -> mergeable_rx_bufs ) {
268
+ if (len )
269
+ skb_add_rx_frag (skb , 0 , page , offset , len , truesize );
270
+ else
271
+ put_page (page );
272
+ return skb ;
273
+ }
274
+
276
275
/*
277
276
* Verify that we can indeed put this data into a skb.
278
277
* This is here to handle cases when the device erroneously
@@ -284,9 +283,12 @@ static struct sk_buff *page_to_skb(struct receive_queue *rq,
284
283
dev_kfree_skb (skb );
285
284
return NULL ;
286
285
}
287
-
286
+ BUG_ON ( offset >= PAGE_SIZE );
288
287
while (len ) {
289
- set_skb_frag (skb , page , offset , & len );
288
+ unsigned int frag_size = min ((unsigned )PAGE_SIZE - offset , len );
289
+ skb_add_rx_frag (skb , skb_shinfo (skb )-> nr_frags , page , offset ,
290
+ frag_size , truesize );
291
+ len -= frag_size ;
290
292
page = (struct page * )page -> private ;
291
293
offset = 0 ;
292
294
}
@@ -297,33 +299,52 @@ static struct sk_buff *page_to_skb(struct receive_queue *rq,
297
299
return skb ;
298
300
}
299
301
300
- static int receive_mergeable (struct receive_queue * rq , struct sk_buff * skb )
302
+ static int receive_mergeable (struct receive_queue * rq , struct sk_buff * head_skb )
301
303
{
302
- struct skb_vnet_hdr * hdr = skb_vnet_hdr (skb );
304
+ struct skb_vnet_hdr * hdr = skb_vnet_hdr (head_skb );
305
+ struct sk_buff * curr_skb = head_skb ;
306
+ char * buf ;
303
307
struct page * page ;
304
- int num_buf , i , len ;
308
+ int num_buf , len ;
305
309
306
310
num_buf = hdr -> mhdr .num_buffers ;
307
311
while (-- num_buf ) {
308
- i = skb_shinfo (skb )-> nr_frags ;
309
- if (i >= MAX_SKB_FRAGS ) {
310
- pr_debug ("%s: packet too long\n" , skb -> dev -> name );
311
- skb -> dev -> stats .rx_length_errors ++ ;
312
- return - EINVAL ;
313
- }
314
- page = virtqueue_get_buf (rq -> vq , & len );
315
- if (!page ) {
312
+ int num_skb_frags = skb_shinfo (curr_skb )-> nr_frags ;
313
+ buf = virtqueue_get_buf (rq -> vq , & len );
314
+ if (unlikely (!buf )) {
316
315
pr_debug ("%s: rx error: %d buffers missing\n" ,
317
- skb -> dev -> name , hdr -> mhdr .num_buffers );
318
- skb -> dev -> stats .rx_length_errors ++ ;
316
+ head_skb -> dev -> name , hdr -> mhdr .num_buffers );
317
+ head_skb -> dev -> stats .rx_length_errors ++ ;
319
318
return - EINVAL ;
320
319
}
321
-
322
- if (len > PAGE_SIZE )
323
- len = PAGE_SIZE ;
324
-
325
- set_skb_frag (skb , page , 0 , & len );
326
-
320
+ if (unlikely (len > MAX_PACKET_LEN )) {
321
+ pr_debug ("%s: rx error: merge buffer too long\n" ,
322
+ head_skb -> dev -> name );
323
+ len = MAX_PACKET_LEN ;
324
+ }
325
+ if (unlikely (num_skb_frags == MAX_SKB_FRAGS )) {
326
+ struct sk_buff * nskb = alloc_skb (0 , GFP_ATOMIC );
327
+ if (unlikely (!nskb )) {
328
+ head_skb -> dev -> stats .rx_dropped ++ ;
329
+ return - ENOMEM ;
330
+ }
331
+ if (curr_skb == head_skb )
332
+ skb_shinfo (curr_skb )-> frag_list = nskb ;
333
+ else
334
+ curr_skb -> next = nskb ;
335
+ curr_skb = nskb ;
336
+ head_skb -> truesize += nskb -> truesize ;
337
+ num_skb_frags = 0 ;
338
+ }
339
+ if (curr_skb != head_skb ) {
340
+ head_skb -> data_len += len ;
341
+ head_skb -> len += len ;
342
+ head_skb -> truesize += MAX_PACKET_LEN ;
343
+ }
344
+ page = virt_to_head_page (buf );
345
+ skb_add_rx_frag (curr_skb , num_skb_frags , page ,
346
+ buf - (char * )page_address (page ), len ,
347
+ MAX_PACKET_LEN );
327
348
-- rq -> num ;
328
349
}
329
350
return 0 ;
@@ -341,8 +362,10 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
341
362
if (unlikely (len < sizeof (struct virtio_net_hdr ) + ETH_HLEN )) {
342
363
pr_debug ("%s: short packet %i\n" , dev -> name , len );
343
364
dev -> stats .rx_length_errors ++ ;
344
- if (vi -> mergeable_rx_bufs || vi -> big_packets )
365
+ if (vi -> big_packets )
345
366
give_pages (rq , buf );
367
+ else if (vi -> mergeable_rx_bufs )
368
+ put_page (virt_to_head_page (buf ));
346
369
else
347
370
dev_kfree_skb (buf );
348
371
return ;
@@ -352,19 +375,28 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
352
375
skb = buf ;
353
376
len -= sizeof (struct virtio_net_hdr );
354
377
skb_trim (skb , len );
378
+ } else if (vi -> mergeable_rx_bufs ) {
379
+ struct page * page = virt_to_head_page (buf );
380
+ skb = page_to_skb (rq , page ,
381
+ (char * )buf - (char * )page_address (page ),
382
+ len , MAX_PACKET_LEN );
383
+ if (unlikely (!skb )) {
384
+ dev -> stats .rx_dropped ++ ;
385
+ put_page (page );
386
+ return ;
387
+ }
388
+ if (receive_mergeable (rq , skb )) {
389
+ dev_kfree_skb (skb );
390
+ return ;
391
+ }
355
392
} else {
356
393
page = buf ;
357
- skb = page_to_skb (rq , page , len );
394
+ skb = page_to_skb (rq , page , 0 , len , PAGE_SIZE );
358
395
if (unlikely (!skb )) {
359
396
dev -> stats .rx_dropped ++ ;
360
397
give_pages (rq , page );
361
398
return ;
362
399
}
363
- if (vi -> mergeable_rx_bufs )
364
- if (receive_mergeable (rq , skb )) {
365
- dev_kfree_skb (skb );
366
- return ;
367
- }
368
400
}
369
401
370
402
hdr = skb_vnet_hdr (skb );
@@ -501,18 +533,28 @@ static int add_recvbuf_big(struct receive_queue *rq, gfp_t gfp)
501
533
502
534
static int add_recvbuf_mergeable (struct receive_queue * rq , gfp_t gfp )
503
535
{
504
- struct page * page ;
536
+ struct virtnet_info * vi = rq -> vq -> vdev -> priv ;
537
+ char * buf = NULL ;
505
538
int err ;
506
539
507
- page = get_a_page (rq , gfp );
508
- if (!page )
540
+ if (gfp & __GFP_WAIT ) {
541
+ if (skb_page_frag_refill (MAX_PACKET_LEN , & vi -> alloc_frag ,
542
+ gfp )) {
543
+ buf = (char * )page_address (vi -> alloc_frag .page ) +
544
+ vi -> alloc_frag .offset ;
545
+ get_page (vi -> alloc_frag .page );
546
+ vi -> alloc_frag .offset += MAX_PACKET_LEN ;
547
+ }
548
+ } else {
549
+ buf = netdev_alloc_frag (MAX_PACKET_LEN );
550
+ }
551
+ if (!buf )
509
552
return - ENOMEM ;
510
553
511
- sg_init_one (rq -> sg , page_address (page ), PAGE_SIZE );
512
-
513
- err = virtqueue_add_inbuf (rq -> vq , rq -> sg , 1 , page , gfp );
554
+ sg_init_one (rq -> sg , buf , MAX_PACKET_LEN );
555
+ err = virtqueue_add_inbuf (rq -> vq , rq -> sg , 1 , buf , gfp );
514
556
if (err < 0 )
515
- give_pages ( rq , page );
557
+ put_page ( virt_to_head_page ( buf ) );
516
558
517
559
return err ;
518
560
}
@@ -1343,8 +1385,10 @@ static void free_unused_bufs(struct virtnet_info *vi)
1343
1385
struct virtqueue * vq = vi -> rq [i ].vq ;
1344
1386
1345
1387
while ((buf = virtqueue_detach_unused_buf (vq )) != NULL ) {
1346
- if (vi -> mergeable_rx_bufs || vi -> big_packets )
1388
+ if (vi -> big_packets )
1347
1389
give_pages (& vi -> rq [i ], buf );
1390
+ else if (vi -> mergeable_rx_bufs )
1391
+ put_page (virt_to_head_page (buf ));
1348
1392
else
1349
1393
dev_kfree_skb (buf );
1350
1394
-- vi -> rq [i ].num ;
@@ -1650,6 +1694,8 @@ static int virtnet_probe(struct virtio_device *vdev)
1650
1694
free_vqs :
1651
1695
cancel_delayed_work_sync (& vi -> refill );
1652
1696
virtnet_del_vqs (vi );
1697
+ if (vi -> alloc_frag .page )
1698
+ put_page (vi -> alloc_frag .page );
1653
1699
free_index :
1654
1700
free_percpu (vi -> vq_index );
1655
1701
free_stats :
@@ -1685,6 +1731,8 @@ static void virtnet_remove(struct virtio_device *vdev)
1685
1731
unregister_netdev (vi -> dev );
1686
1732
1687
1733
remove_vq_common (vi );
1734
+ if (vi -> alloc_frag .page )
1735
+ put_page (vi -> alloc_frag .page );
1688
1736
1689
1737
flush_work (& vi -> config_work );
1690
1738
0 commit comments