diff options
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r-- | include/linux/netdevice.h | 80 |
1 files changed, 28 insertions, 52 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index bdf5465deb91..58856b6737fb 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -314,8 +314,9 @@ struct napi_struct { | |||
314 | spinlock_t poll_lock; | 314 | spinlock_t poll_lock; |
315 | int poll_owner; | 315 | int poll_owner; |
316 | struct net_device *dev; | 316 | struct net_device *dev; |
317 | struct list_head dev_list; | ||
318 | #endif | 317 | #endif |
318 | struct list_head dev_list; | ||
319 | struct sk_buff *gro_list; | ||
319 | }; | 320 | }; |
320 | 321 | ||
321 | enum | 322 | enum |
@@ -376,22 +377,8 @@ static inline int napi_reschedule(struct napi_struct *napi) | |||
376 | * | 377 | * |
377 | * Mark NAPI processing as complete. | 378 | * Mark NAPI processing as complete. |
378 | */ | 379 | */ |
379 | static inline void __napi_complete(struct napi_struct *n) | 380 | extern void __napi_complete(struct napi_struct *n); |
380 | { | 381 | extern void napi_complete(struct napi_struct *n); |
381 | BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state)); | ||
382 | list_del(&n->poll_list); | ||
383 | smp_mb__before_clear_bit(); | ||
384 | clear_bit(NAPI_STATE_SCHED, &n->state); | ||
385 | } | ||
386 | |||
387 | static inline void napi_complete(struct napi_struct *n) | ||
388 | { | ||
389 | unsigned long flags; | ||
390 | |||
391 | local_irq_save(flags); | ||
392 | __napi_complete(n); | ||
393 | local_irq_restore(flags); | ||
394 | } | ||
395 | 382 | ||
396 | /** | 383 | /** |
397 | * napi_disable - prevent NAPI from scheduling | 384 | * napi_disable - prevent NAPI from scheduling |
@@ -640,9 +627,7 @@ struct net_device | |||
640 | unsigned long state; | 627 | unsigned long state; |
641 | 628 | ||
642 | struct list_head dev_list; | 629 | struct list_head dev_list; |
643 | #ifdef CONFIG_NETPOLL | ||
644 | struct list_head napi_list; | 630 | struct list_head napi_list; |
645 | #endif | ||
646 | 631 | ||
647 | /* Net device features */ | 632 | /* Net device features */ |
648 | unsigned long features; | 633 | unsigned long features; |
@@ -661,6 +646,7 @@ struct net_device | |||
661 | #define NETIF_F_LLTX 4096 /* LockLess TX - deprecated. Please */ | 646 | #define NETIF_F_LLTX 4096 /* LockLess TX - deprecated. Please */ |
662 | /* do not use LLTX in new drivers */ | 647 | /* do not use LLTX in new drivers */ |
663 | #define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */ | 648 | #define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */ |
649 | #define NETIF_F_GRO 16384 /* Generic receive offload */ | ||
664 | #define NETIF_F_LRO 32768 /* large receive offload */ | 650 | #define NETIF_F_LRO 32768 /* large receive offload */ |
665 | 651 | ||
666 | /* Segmentation offload features */ | 652 | /* Segmentation offload features */ |
@@ -984,22 +970,8 @@ static inline void *netdev_priv(const struct net_device *dev) | |||
984 | * netif_napi_add() must be used to initialize a napi context prior to calling | 970 | * netif_napi_add() must be used to initialize a napi context prior to calling |
985 | * *any* of the other napi related functions. | 971 | * *any* of the other napi related functions. |
986 | */ | 972 | */ |
987 | static inline void netif_napi_add(struct net_device *dev, | 973 | void netif_napi_add(struct net_device *dev, struct napi_struct *napi, |
988 | struct napi_struct *napi, | 974 | int (*poll)(struct napi_struct *, int), int weight); |
989 | int (*poll)(struct napi_struct *, int), | ||
990 | int weight) | ||
991 | { | ||
992 | INIT_LIST_HEAD(&napi->poll_list); | ||
993 | napi->poll = poll; | ||
994 | napi->weight = weight; | ||
995 | #ifdef CONFIG_NETPOLL | ||
996 | napi->dev = dev; | ||
997 | list_add(&napi->dev_list, &dev->napi_list); | ||
998 | spin_lock_init(&napi->poll_lock); | ||
999 | napi->poll_owner = -1; | ||
1000 | #endif | ||
1001 | set_bit(NAPI_STATE_SCHED, &napi->state); | ||
1002 | } | ||
1003 | 975 | ||
1004 | /** | 976 | /** |
1005 | * netif_napi_del - remove a napi context | 977 | * netif_napi_del - remove a napi context |
@@ -1007,12 +979,20 @@ static inline void netif_napi_add(struct net_device *dev, | |||
1007 | * | 979 | * |
1008 | * netif_napi_del() removes a napi context from the network device napi list | 980 | * netif_napi_del() removes a napi context from the network device napi list |
1009 | */ | 981 | */ |
1010 | static inline void netif_napi_del(struct napi_struct *napi) | 982 | void netif_napi_del(struct napi_struct *napi); |
1011 | { | 983 | |
1012 | #ifdef CONFIG_NETPOLL | 984 | struct napi_gro_cb { |
1013 | list_del(&napi->dev_list); | 985 | /* This is non-zero if the packet may be of the same flow. */ |
1014 | #endif | 986 | int same_flow; |
1015 | } | 987 | |
988 | /* This is non-zero if the packet cannot be merged with the new skb. */ | ||
989 | int flush; | ||
990 | |||
991 | /* Number of segments aggregated. */ | ||
992 | int count; | ||
993 | }; | ||
994 | |||
995 | #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb) | ||
1016 | 996 | ||
1017 | struct packet_type { | 997 | struct packet_type { |
1018 | __be16 type; /* This is really htons(ether_type). */ | 998 | __be16 type; /* This is really htons(ether_type). */ |
@@ -1024,6 +1004,9 @@ struct packet_type { | |||
1024 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, | 1004 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, |
1025 | int features); | 1005 | int features); |
1026 | int (*gso_send_check)(struct sk_buff *skb); | 1006 | int (*gso_send_check)(struct sk_buff *skb); |
1007 | struct sk_buff **(*gro_receive)(struct sk_buff **head, | ||
1008 | struct sk_buff *skb); | ||
1009 | int (*gro_complete)(struct sk_buff *skb); | ||
1027 | void *af_packet_priv; | 1010 | void *af_packet_priv; |
1028 | struct list_head list; | 1011 | struct list_head list; |
1029 | }; | 1012 | }; |
@@ -1377,6 +1360,9 @@ extern int netif_rx(struct sk_buff *skb); | |||
1377 | extern int netif_rx_ni(struct sk_buff *skb); | 1360 | extern int netif_rx_ni(struct sk_buff *skb); |
1378 | #define HAVE_NETIF_RECEIVE_SKB 1 | 1361 | #define HAVE_NETIF_RECEIVE_SKB 1 |
1379 | extern int netif_receive_skb(struct sk_buff *skb); | 1362 | extern int netif_receive_skb(struct sk_buff *skb); |
1363 | extern void napi_gro_flush(struct napi_struct *napi); | ||
1364 | extern int napi_gro_receive(struct napi_struct *napi, | ||
1365 | struct sk_buff *skb); | ||
1380 | extern void netif_nit_deliver(struct sk_buff *skb); | 1366 | extern void netif_nit_deliver(struct sk_buff *skb); |
1381 | extern int dev_valid_name(const char *name); | 1367 | extern int dev_valid_name(const char *name); |
1382 | extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); | 1368 | extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); |
@@ -1621,17 +1607,7 @@ static inline void __netif_rx_complete(struct net_device *dev, | |||
1621 | static inline void netif_rx_complete(struct net_device *dev, | 1607 | static inline void netif_rx_complete(struct net_device *dev, |
1622 | struct napi_struct *napi) | 1608 | struct napi_struct *napi) |
1623 | { | 1609 | { |
1624 | unsigned long flags; | 1610 | napi_complete(napi); |
1625 | |||
1626 | /* | ||
1627 | * don't let napi dequeue from the cpu poll list | ||
1628 | * just in case its running on a different cpu | ||
1629 | */ | ||
1630 | if (unlikely(test_bit(NAPI_STATE_NPSVC, &napi->state))) | ||
1631 | return; | ||
1632 | local_irq_save(flags); | ||
1633 | __netif_rx_complete(dev, napi); | ||
1634 | local_irq_restore(flags); | ||
1635 | } | 1611 | } |
1636 | 1612 | ||
1637 | static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu) | 1613 | static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu) |