#include <net/udp.h>
 
 struct napi_gro_cb {
-       /* Virtual address of skb_shinfo(skb)->frags[0].page + offset. */
-       void    *frag0;
+       union {
+               struct {
+                       /* Virtual address of skb_shinfo(skb)->frags[0].page + offset. */
+                       void    *frag0;
 
-       /* Length of frag0. */
-       unsigned int frag0_len;
+                       /* Length of frag0. */
+                       unsigned int frag0_len;
+               };
+
+               struct {
+                       /* used in skb_gro_receive() slow path */
+                       struct sk_buff *last;
+
+                       /* jiffies when first packet was created/queued */
+                       unsigned long age;
+               };
+       };
 
        /* This indicates where we are processing relative to skb->data. */
        int     data_offset;
        /* Used in ipv6_gro_receive() and foo-over-udp */
        u16     proto;
 
-       /* jiffies when first packet was created/queued */
-       unsigned long age;
-
 /* Used in napi_gro_cb::free */
 #define NAPI_GRO_FREE             1
 #define NAPI_GRO_FREE_STOLEN_HEAD 2
 
        /* used to support CHECKSUM_COMPLETE for tunneling protocols */
        __wsum  csum;
-
-       /* used in skb_gro_receive() slow path */
-       struct sk_buff *last;
 };
 
 #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb)
 
        }
 }
 
+static void gro_try_pull_from_frag0(struct sk_buff *skb)
+{
+       int grow = skb_gro_offset(skb) - skb_headlen(skb);
+
+       if (grow > 0)
+               gro_pull_from_frag0(skb, grow);
+}
+
 static void gro_flush_oldest(struct napi_struct *napi, struct list_head *head)
 {
        struct sk_buff *oldest;
        struct sk_buff *pp = NULL;
        enum gro_result ret;
        int same_flow;
-       int grow;
 
        if (netif_elide_gro(skb->dev))
                goto normal;
        else
                gro_list->count++;
 
+       /* Must be called before setting NAPI_GRO_CB(skb)->{age|last} */
+       gro_try_pull_from_frag0(skb);
        NAPI_GRO_CB(skb)->age = jiffies;
        NAPI_GRO_CB(skb)->last = skb;
        if (!skb_is_gso(skb))
                skb_shinfo(skb)->gso_size = skb_gro_len(skb);
        list_add(&skb->list, &gro_list->list);
        ret = GRO_HELD;
-
-pull:
-       grow = skb_gro_offset(skb) - skb_headlen(skb);
-       if (grow > 0)
-               gro_pull_from_frag0(skb, grow);
 ok:
        if (gro_list->count) {
                if (!test_bit(bucket, &napi->gro_bitmask))
 
 normal:
        ret = GRO_NORMAL;
-       goto pull;
+       gro_try_pull_from_frag0(skb);
+       goto ok;
 }
 
 struct packet_offload *gro_find_receive_by_type(__be16 type)