@@ -2519,64 +2519,25 @@ void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
25192519}
25202520EXPORT_SYMBOL (napi_reuse_skb );
25212521
2522- struct sk_buff * napi_fraginfo_skb (struct napi_struct * napi ,
2523- struct napi_gro_fraginfo * info )
2522+ struct sk_buff * napi_get_frags (struct napi_struct * napi )
25242523{
25252524 struct net_device * dev = napi -> dev ;
25262525 struct sk_buff * skb = napi -> skb ;
2527- struct ethhdr * eth ;
2528- skb_frag_t * frag ;
2529- int i ;
2530-
2531- napi -> skb = NULL ;
25322526
25332527 if (!skb ) {
25342528 skb = netdev_alloc_skb (dev , GRO_MAX_HEAD + NET_IP_ALIGN );
25352529 if (!skb )
25362530 goto out ;
25372531
25382532 skb_reserve (skb , NET_IP_ALIGN );
2539- }
2540-
2541- BUG_ON (info -> nr_frags > MAX_SKB_FRAGS );
2542- frag = & info -> frags [info -> nr_frags - 1 ];
25432533
2544- for (i = skb_shinfo (skb )-> nr_frags ; i < info -> nr_frags ; i ++ ) {
2545- skb_fill_page_desc (skb , i , frag -> page , frag -> page_offset ,
2546- frag -> size );
2547- frag ++ ;
2534+ napi -> skb = skb ;
25482535 }
2549- skb_shinfo (skb )-> nr_frags = info -> nr_frags ;
2550-
2551- skb -> data_len = info -> len ;
2552- skb -> len += info -> len ;
2553- skb -> truesize += info -> len ;
2554-
2555- skb_reset_mac_header (skb );
2556- skb_gro_reset_offset (skb );
2557-
2558- eth = skb_gro_header (skb , sizeof (* eth ));
2559- if (!eth ) {
2560- napi_reuse_skb (napi , skb );
2561- skb = NULL ;
2562- goto out ;
2563- }
2564-
2565- skb_gro_pull (skb , sizeof (* eth ));
2566-
2567- /*
2568- * This works because the only protocols we care about don't require
2569- * special handling. We'll fix it up properly at the end.
2570- */
2571- skb -> protocol = eth -> h_proto ;
2572-
2573- skb -> ip_summed = info -> ip_summed ;
2574- skb -> csum = info -> csum ;
25752536
25762537out :
25772538 return skb ;
25782539}
2579- EXPORT_SYMBOL (napi_fraginfo_skb );
2540+ EXPORT_SYMBOL (napi_get_frags );
25802541
25812542int napi_frags_finish (struct napi_struct * napi , struct sk_buff * skb , int ret )
25822543{
@@ -2606,9 +2567,39 @@ int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, int ret)
26062567}
26072568EXPORT_SYMBOL (napi_frags_finish );
26082569
2609- int napi_gro_frags (struct napi_struct * napi , struct napi_gro_fraginfo * info )
2570+ struct sk_buff * napi_frags_skb (struct napi_struct * napi )
2571+ {
2572+ struct sk_buff * skb = napi -> skb ;
2573+ struct ethhdr * eth ;
2574+
2575+ napi -> skb = NULL ;
2576+
2577+ skb_reset_mac_header (skb );
2578+ skb_gro_reset_offset (skb );
2579+
2580+ eth = skb_gro_header (skb , sizeof (* eth ));
2581+ if (!eth ) {
2582+ napi_reuse_skb (napi , skb );
2583+ skb = NULL ;
2584+ goto out ;
2585+ }
2586+
2587+ skb_gro_pull (skb , sizeof (* eth ));
2588+
2589+ /*
2590+ * This works because the only protocols we care about don't require
2591+ * special handling. We'll fix it up properly at the end.
2592+ */
2593+ skb -> protocol = eth -> h_proto ;
2594+
2595+ out :
2596+ return skb ;
2597+ }
2598+ EXPORT_SYMBOL (napi_frags_skb );
2599+
2600+ int napi_gro_frags (struct napi_struct * napi )
26102601{
2611- struct sk_buff * skb = napi_fraginfo_skb (napi , info );
2602+ struct sk_buff * skb = napi_frags_skb (napi );
26122603
26132604 if (!skb )
26142605 return NET_RX_DROP ;
@@ -2712,7 +2703,7 @@ void netif_napi_del(struct napi_struct *napi)
27122703 struct sk_buff * skb , * next ;
27132704
27142705 list_del_init (& napi -> dev_list );
2715- kfree_skb (napi -> skb );
2706+ napi_free_frags (napi );
27162707
27172708 for (skb = napi -> gro_list ; skb ; skb = next ) {
27182709 next = skb -> next ;
0 commit comments