diff options
| author | Rusty Russell <rusty@rustcorp.com.au> | 2008-05-02 22:50:45 -0400 |
|---|---|---|
| committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-05-02 07:50:45 -0400 |
| commit | 0527168522c25121bdd5d5f1d3c5b484d972ea14 (patch) | |
| tree | ffd2c0db655898e4e0e981af4eb1d71fa6cf1e99 | |
| parent | cb38fa23c17519faf46a76d2f71a8430705fe474 (diff) | |
virtio: fix scatterlist sizing in net driver.
Herbert Xu points out (within another patch) that my scatterlists are
too short: one entry for the gso header, one for the skb->data, and
MAX_SKB_FRAGS for all the fragments.
Fix both xmit and recv sides (recv currently unused, coming in later
patch).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
| -rw-r--r-- | drivers/net/virtio_net.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 1fd43e461ba5..fc7eeaa1f1b6 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -142,10 +142,10 @@ drop: | |||
| 142 | static void try_fill_recv(struct virtnet_info *vi) | 142 | static void try_fill_recv(struct virtnet_info *vi) |
| 143 | { | 143 | { |
| 144 | struct sk_buff *skb; | 144 | struct sk_buff *skb; |
| 145 | struct scatterlist sg[1+MAX_SKB_FRAGS]; | 145 | struct scatterlist sg[2+MAX_SKB_FRAGS]; |
| 146 | int num, err; | 146 | int num, err; |
| 147 | 147 | ||
| 148 | sg_init_table(sg, 1+MAX_SKB_FRAGS); | 148 | sg_init_table(sg, 2+MAX_SKB_FRAGS); |
| 149 | for (;;) { | 149 | for (;;) { |
| 150 | skb = netdev_alloc_skb(vi->dev, MAX_PACKET_LEN); | 150 | skb = netdev_alloc_skb(vi->dev, MAX_PACKET_LEN); |
| 151 | if (unlikely(!skb)) | 151 | if (unlikely(!skb)) |
| @@ -231,11 +231,11 @@ static int start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 231 | { | 231 | { |
| 232 | struct virtnet_info *vi = netdev_priv(dev); | 232 | struct virtnet_info *vi = netdev_priv(dev); |
| 233 | int num, err; | 233 | int num, err; |
| 234 | struct scatterlist sg[1+MAX_SKB_FRAGS]; | 234 | struct scatterlist sg[2+MAX_SKB_FRAGS]; |
| 235 | struct virtio_net_hdr *hdr; | 235 | struct virtio_net_hdr *hdr; |
| 236 | const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; | 236 | const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; |
| 237 | 237 | ||
| 238 | sg_init_table(sg, 1+MAX_SKB_FRAGS); | 238 | sg_init_table(sg, 2+MAX_SKB_FRAGS); |
| 239 | 239 | ||
| 240 | pr_debug("%s: xmit %p " MAC_FMT "\n", dev->name, skb, | 240 | pr_debug("%s: xmit %p " MAC_FMT "\n", dev->name, skb, |
| 241 | dest[0], dest[1], dest[2], | 241 | dest[0], dest[1], dest[2], |
