net: Convert GRO SKB handling to list_head.
Manage pending per-NAPI GRO packets via list_head. Return an SKB pointer from the GRO receive handlers. When GRO receive handlers return non-NULL, it means that this SKB needs to be completed at this time and removed from the NAPI queue. Several operations are greatly simplified by this transformation, especially timing out the oldest SKB in the list when gro_count exceeds MAX_GRO_SKBS, and napi_gro_flush() which walks the queue in reverse order. Signed-off-by: David S. Miller <davem@davemloft.net>
这个提交包含在:
@@ -343,10 +343,11 @@ out:
|
||||
return segs;
|
||||
}
|
||||
|
||||
struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
|
||||
struct udphdr *uh, udp_lookup_t lookup)
|
||||
struct sk_buff *udp_gro_receive(struct list_head *head, struct sk_buff *skb,
|
||||
struct udphdr *uh, udp_lookup_t lookup)
|
||||
{
|
||||
struct sk_buff *p, **pp = NULL;
|
||||
struct sk_buff *pp = NULL;
|
||||
struct sk_buff *p;
|
||||
struct udphdr *uh2;
|
||||
unsigned int off = skb_gro_offset(skb);
|
||||
int flush = 1;
|
||||
@@ -371,7 +372,7 @@ struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
|
||||
unflush:
|
||||
flush = 0;
|
||||
|
||||
for (p = *head; p; p = p->next) {
|
||||
list_for_each_entry(p, head, list) {
|
||||
if (!NAPI_GRO_CB(p)->same_flow)
|
||||
continue;
|
||||
|
||||
@@ -399,8 +400,8 @@ out:
|
||||
}
|
||||
EXPORT_SYMBOL(udp_gro_receive);
|
||||
|
||||
static struct sk_buff **udp4_gro_receive(struct sk_buff **head,
|
||||
struct sk_buff *skb)
|
||||
static struct sk_buff *udp4_gro_receive(struct list_head *head,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct udphdr *uh = udp_gro_udphdr(skb);
|
||||
|
||||
|
在新工单中引用
屏蔽一个用户