37
37
#endif
38
38
#include <net/net_debug.h>
39
39
#include <net/dropreason-core.h>
40
+ #include <net/netmem.h>
40
41
41
42
/**
42
43
* DOC: skb checksums
@@ -359,15 +360,19 @@ extern int sysctl_max_skb_frags;
359
360
*/
360
361
#define GSO_BY_FRAGS 0xFFFF
361
362
362
- typedef struct bio_vec skb_frag_t ;
363
+ typedef struct skb_frag {
364
+ netmem_ref netmem ;
365
+ unsigned int len ;
366
+ unsigned int offset ;
367
+ } skb_frag_t ;
363
368
364
369
/**
365
370
* skb_frag_size() - Returns the size of a skb fragment
366
371
* @frag: skb fragment
367
372
*/
368
373
static inline unsigned int skb_frag_size (const skb_frag_t * frag )
369
374
{
370
- return frag -> bv_len ;
375
+ return frag -> len ;
371
376
}
372
377
373
378
/**
@@ -377,7 +382,7 @@ static inline unsigned int skb_frag_size(const skb_frag_t *frag)
377
382
*/
378
383
static inline void skb_frag_size_set (skb_frag_t * frag , unsigned int size )
379
384
{
380
- frag -> bv_len = size ;
385
+ frag -> len = size ;
381
386
}
382
387
383
388
/**
@@ -387,7 +392,7 @@ static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size)
387
392
*/
388
393
static inline void skb_frag_size_add (skb_frag_t * frag , int delta )
389
394
{
390
- frag -> bv_len += delta ;
395
+ frag -> len += delta ;
391
396
}
392
397
393
398
/**
@@ -397,7 +402,7 @@ static inline void skb_frag_size_add(skb_frag_t *frag, int delta)
397
402
*/
398
403
static inline void skb_frag_size_sub (skb_frag_t * frag , int delta )
399
404
{
400
- frag -> bv_len -= delta ;
405
+ frag -> len -= delta ;
401
406
}
402
407
403
408
/**
@@ -417,7 +422,7 @@ static inline bool skb_frag_must_loop(struct page *p)
417
422
* skb_frag_foreach_page - loop over pages in a fragment
418
423
*
419
424
* @f: skb frag to operate on
420
- * @f_off: offset from start of f->bv_page
425
+ * @f_off: offset from start of f->netmem
421
426
* @f_len: length from f_off to loop over
422
427
* @p: (temp var) current page
423
428
* @p_off: (temp var) offset from start of current page,
@@ -2429,22 +2434,37 @@ static inline unsigned int skb_pagelen(const struct sk_buff *skb)
2429
2434
return skb_headlen (skb ) + __skb_pagelen (skb );
2430
2435
}
2431
2436
2437
+ static inline void skb_frag_fill_netmem_desc (skb_frag_t * frag ,
2438
+ netmem_ref netmem , int off ,
2439
+ int size )
2440
+ {
2441
+ frag -> netmem = netmem ;
2442
+ frag -> offset = off ;
2443
+ skb_frag_size_set (frag , size );
2444
+ }
2445
+
2432
2446
static inline void skb_frag_fill_page_desc (skb_frag_t * frag ,
2433
2447
struct page * page ,
2434
2448
int off , int size )
2435
2449
{
2436
- frag -> bv_page = page ;
2437
- frag -> bv_offset = off ;
2438
- skb_frag_size_set (frag , size );
2450
+ skb_frag_fill_netmem_desc (frag , page_to_netmem (page ), off , size );
2451
+ }
2452
+
2453
+ static inline void __skb_fill_netmem_desc_noacc (struct skb_shared_info * shinfo ,
2454
+ int i , netmem_ref netmem ,
2455
+ int off , int size )
2456
+ {
2457
+ skb_frag_t * frag = & shinfo -> frags [i ];
2458
+
2459
+ skb_frag_fill_netmem_desc (frag , netmem , off , size );
2439
2460
}
2440
2461
2441
2462
static inline void __skb_fill_page_desc_noacc (struct skb_shared_info * shinfo ,
2442
2463
int i , struct page * page ,
2443
2464
int off , int size )
2444
2465
{
2445
- skb_frag_t * frag = & shinfo -> frags [i ];
2446
-
2447
- skb_frag_fill_page_desc (frag , page , off , size );
2466
+ __skb_fill_netmem_desc_noacc (shinfo , i , page_to_netmem (page ), off ,
2467
+ size );
2448
2468
}
2449
2469
2450
2470
/**
@@ -2460,10 +2480,10 @@ static inline void skb_len_add(struct sk_buff *skb, int delta)
2460
2480
}
2461
2481
2462
2482
/**
2463
- * __skb_fill_page_desc - initialise a paged fragment in an skb
2483
+ * __skb_fill_netmem_desc - initialise a fragment in an skb
2464
2484
* @skb: buffer containing fragment to be initialised
2465
- * @i: paged fragment index to initialise
2466
- * @page : the page to use for this fragment
2485
+ * @i: fragment index to initialise
2486
+ * @netmem : the netmem to use for this fragment
2467
2487
* @off: the offset to the data with @page
2468
2488
* @size: the length of the data
2469
2489
*
@@ -2472,18 +2492,33 @@ static inline void skb_len_add(struct sk_buff *skb, int delta)
2472
2492
*
2473
2493
* Does not take any additional reference on the fragment.
2474
2494
*/
2475
- static inline void __skb_fill_page_desc (struct sk_buff * skb , int i ,
2476
- struct page * page , int off , int size )
2495
+ static inline void __skb_fill_netmem_desc (struct sk_buff * skb , int i ,
2496
+ netmem_ref netmem , int off , int size )
2477
2497
{
2478
- __skb_fill_page_desc_noacc (skb_shinfo (skb ), i , page , off , size );
2498
+ struct page * page = netmem_to_page (netmem );
2499
+
2500
+ __skb_fill_netmem_desc_noacc (skb_shinfo (skb ), i , netmem , off , size );
2479
2501
2480
2502
/* Propagate page pfmemalloc to the skb if we can. The problem is
2481
2503
* that not all callers have unique ownership of the page but rely
2482
2504
* on page_is_pfmemalloc doing the right thing(tm).
2483
2505
*/
2484
2506
page = compound_head (page );
2485
2507
if (page_is_pfmemalloc (page ))
2486
- skb -> pfmemalloc = true;
2508
+ skb -> pfmemalloc = true;
2509
+ }
2510
+
2511
+ static inline void __skb_fill_page_desc (struct sk_buff * skb , int i ,
2512
+ struct page * page , int off , int size )
2513
+ {
2514
+ __skb_fill_netmem_desc (skb , i , page_to_netmem (page ), off , size );
2515
+ }
2516
+
2517
+ static inline void skb_fill_netmem_desc (struct sk_buff * skb , int i ,
2518
+ netmem_ref netmem , int off , int size )
2519
+ {
2520
+ __skb_fill_netmem_desc (skb , i , netmem , off , size );
2521
+ skb_shinfo (skb )-> nr_frags = i + 1 ;
2487
2522
}
2488
2523
2489
2524
/**
@@ -2503,8 +2538,7 @@ static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
2503
2538
static inline void skb_fill_page_desc (struct sk_buff * skb , int i ,
2504
2539
struct page * page , int off , int size )
2505
2540
{
2506
- __skb_fill_page_desc (skb , i , page , off , size );
2507
- skb_shinfo (skb )-> nr_frags = i + 1 ;
2541
+ skb_fill_netmem_desc (skb , i , page_to_netmem (page ), off , size );
2508
2542
}
2509
2543
2510
2544
/**
@@ -2528,8 +2562,16 @@ static inline void skb_fill_page_desc_noacc(struct sk_buff *skb, int i,
2528
2562
shinfo -> nr_frags = i + 1 ;
2529
2563
}
2530
2564
2531
- void skb_add_rx_frag (struct sk_buff * skb , int i , struct page * page , int off ,
2532
- int size , unsigned int truesize );
2565
+ void skb_add_rx_frag_netmem (struct sk_buff * skb , int i , netmem_ref netmem ,
2566
+ int off , int size , unsigned int truesize );
2567
+
2568
+ static inline void skb_add_rx_frag (struct sk_buff * skb , int i ,
2569
+ struct page * page , int off , int size ,
2570
+ unsigned int truesize )
2571
+ {
2572
+ skb_add_rx_frag_netmem (skb , i , page_to_netmem (page ), off , size ,
2573
+ truesize );
2574
+ }
2533
2575
2534
2576
void skb_coalesce_rx_frag (struct sk_buff * skb , int i , int size ,
2535
2577
unsigned int truesize );
@@ -3378,7 +3420,7 @@ static inline void skb_propagate_pfmemalloc(const struct page *page,
3378
3420
*/
3379
3421
static inline unsigned int skb_frag_off (const skb_frag_t * frag )
3380
3422
{
3381
- return frag -> bv_offset ;
3423
+ return frag -> offset ;
3382
3424
}
3383
3425
3384
3426
/**
@@ -3388,7 +3430,7 @@ static inline unsigned int skb_frag_off(const skb_frag_t *frag)
3388
3430
*/
3389
3431
static inline void skb_frag_off_add (skb_frag_t * frag , int delta )
3390
3432
{
3391
- frag -> bv_offset += delta ;
3433
+ frag -> offset += delta ;
3392
3434
}
3393
3435
3394
3436
/**
@@ -3398,7 +3440,7 @@ static inline void skb_frag_off_add(skb_frag_t *frag, int delta)
3398
3440
*/
3399
3441
static inline void skb_frag_off_set (skb_frag_t * frag , unsigned int offset )
3400
3442
{
3401
- frag -> bv_offset = offset ;
3443
+ frag -> offset = offset ;
3402
3444
}
3403
3445
3404
3446
/**
@@ -3409,7 +3451,7 @@ static inline void skb_frag_off_set(skb_frag_t *frag, unsigned int offset)
3409
3451
static inline void skb_frag_off_copy (skb_frag_t * fragto ,
3410
3452
const skb_frag_t * fragfrom )
3411
3453
{
3412
- fragto -> bv_offset = fragfrom -> bv_offset ;
3454
+ fragto -> offset = fragfrom -> offset ;
3413
3455
}
3414
3456
3415
3457
/**
@@ -3420,7 +3462,7 @@ static inline void skb_frag_off_copy(skb_frag_t *fragto,
3420
3462
*/
3421
3463
static inline struct page * skb_frag_page (const skb_frag_t * frag )
3422
3464
{
3423
- return frag -> bv_page ;
3465
+ return netmem_to_page ( frag -> netmem ) ;
3424
3466
}
3425
3467
3426
3468
/**
@@ -3528,7 +3570,7 @@ static inline void *skb_frag_address_safe(const skb_frag_t *frag)
3528
3570
static inline void skb_frag_page_copy (skb_frag_t * fragto ,
3529
3571
const skb_frag_t * fragfrom )
3530
3572
{
3531
- fragto -> bv_page = fragfrom -> bv_page ;
3573
+ fragto -> netmem = fragfrom -> netmem ;
3532
3574
}
3533
3575
3534
3576
bool skb_page_frag_refill (unsigned int sz , struct page_frag * pfrag , gfp_t prio );
0 commit comments