Message ID | 1305237348.6124.72.camel@Joe-Laptop |
---|---|
State | Rejected, archived |
Delegated to: | David Miller |
Headers | show |
From: Joe Perches <joe@perches.com> Date: Thu, 12 May 2011 14:55:48 -0700 > Save an initialization because when this structure > is used it's completely filled by memcpy_fromiovec. > > Add a new variable used for the 0 sized allocation > when this structure is not used. > > Signed-off-by: Joe Perches <joe@perches.com> > > --- > > On Thu, 2011-05-12 at 17:36 -0400, David Miller wrote: >> I would rather see the code rearranged such that this sort of >> hackish scheme isn't necessary. You misunderstood me. It's this: struct virtio_net_hdr vnet_hdr; if (po->has_vnet_hdr) { initialize &vnet_hdr } ... if (po->has_vnet_hdr) { use vnet_hdr } which I'm talking about when I say "hackish scheme". The compiler cannot conclusively see that the control flow always goes to the code that initialized vnet_hdr every time it reaches the code that uses it. I want _that_ part rearranged, not what you decided to tackle here. For the third time, I'm not applying your patch. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 549527b..cc1e83d 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -1123,9 +1123,10 @@ static int packet_snd(struct socket *sock, __be16 proto; unsigned char *addr; int ifindex, err, reserve = 0; - struct virtio_net_hdr vnet_hdr = { 0 }; + struct virtio_net_hdr vnet_hdr; int offset = 0; int vnet_hdr_len; + size_t alloc_vnet_hdr_len; struct packet_sock *po = pkt_sk(sk); unsigned short gso_type = 0; @@ -1206,7 +1207,10 @@ static int packet_snd(struct socket *sock, goto out_unlock; } - } + alloc_vnet_hdr_len = vnet_hdr.hdr_len; + } else + alloc_vnet_hdr_len = 0; + err = -EMSGSIZE; if (!gso_type && (len > dev->mtu + reserve + VLAN_HLEN)) @@ -1214,7 +1218,7 @@ static int packet_snd(struct socket *sock, err = -ENOBUFS; skb = packet_alloc_skb(sk, LL_ALLOCATED_SPACE(dev), - LL_RESERVED_SPACE(dev), len, vnet_hdr.hdr_len, + LL_RESERVED_SPACE(dev), len, alloc_vnet_hdr_len, msg->msg_flags & MSG_DONTWAIT, &err); if (skb == NULL) goto out_unlock;