From: Jason Wang <jasowang@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: thuth@linux.vnet.ibm.com, rusty@au1.ibm.com,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org,
dahi@linux.vnet.ibm.com, pbonzini@redhat.com,
David Miller <davem@davemloft.net>
Subject: Re: [PATCH v6 24/46] virtio_net: get rid of virtio_net_hdr/skb_vnet_hdr
Date: Fri, 28 Nov 2014 08:38:25 +0008 [thread overview]
Message-ID: <1417163425.5822.4@smtp.corp.redhat.com> (raw)
In-Reply-To: <1417118789-18231-25-git-send-email-mst@redhat.com>
On Fri, Nov 28, 2014 at 4:09 AM, Michael S. Tsirkin <mst@redhat.com>
wrote:
> virtio 1.0 doesn't use virtio_net_hdr anymore, and in fact, it's not
> really useful since virtio_net_hdr_mrg_rxbuf includes that as the
> first
> field anyway.
>
> Let's drop it, precalculate header len and store within vi instead.
>
> This way we can also remove struct skb_vnet_hdr.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> ---
> drivers/net/virtio_net.c | 90
> ++++++++++++++++++++++--------------------------
> 1 file changed, 41 insertions(+), 49 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 1630c21..516f2cb 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -123,6 +123,9 @@ struct virtnet_info {
> /* Host can handle any s/g split between our header and packet data
> */
> bool any_header_sg;
>
> + /* Packet virtio header size */
> + u8 hdr_len;
> +
> /* Active statistics */
> struct virtnet_stats __percpu *stats;
>
> @@ -139,21 +142,14 @@ struct virtnet_info {
> struct notifier_block nb;
> };
>
> -struct skb_vnet_hdr {
> - union {
> - struct virtio_net_hdr hdr;
> - struct virtio_net_hdr_mrg_rxbuf mhdr;
> - };
> -};
> -
> struct padded_vnet_hdr {
> - struct virtio_net_hdr hdr;
> + struct virtio_net_hdr_mrg_rxbuf hdr;
> /*
> - * virtio_net_hdr should be in a separated sg buffer because of a
> - * QEMU bug, and data sg buffer shares same page with this header
> sg.
> - * This padding makes next sg 16 byte aligned after virtio_net_hdr.
> + * hdr is in a separate sg buffer, and data sg buffer shares same
> page
> + * with this header sg. This padding makes next sg 16 byte aligned
> + * after the header.
> */
> - char padding[6];
> + char padding[4];
> };
>
> /* Converting between virtqueue no. and kernel tx/rx queue no.
> @@ -179,9 +175,9 @@ static int rxq2vq(int rxq)
> return rxq * 2;
> }
>
> -static inline struct skb_vnet_hdr *skb_vnet_hdr(struct sk_buff *skb)
> +static inline struct virtio_net_hdr_mrg_rxbuf *skb_vnet_hdr(struct
> sk_buff *skb)
> {
> - return (struct skb_vnet_hdr *)skb->cb;
> + return (struct virtio_net_hdr_mrg_rxbuf *)skb->cb;
> }
>
> /*
> @@ -247,7 +243,7 @@ static struct sk_buff *page_to_skb(struct
> virtnet_info *vi,
> unsigned int len, unsigned int truesize)
> {
> struct sk_buff *skb;
> - struct skb_vnet_hdr *hdr;
> + struct virtio_net_hdr_mrg_rxbuf *hdr;
> unsigned int copy, hdr_len, hdr_padded_len;
> char *p;
>
> @@ -260,13 +256,11 @@ static struct sk_buff *page_to_skb(struct
> virtnet_info *vi,
>
> hdr = skb_vnet_hdr(skb);
>
> - if (vi->mergeable_rx_bufs) {
> - hdr_len = sizeof hdr->mhdr;
> - hdr_padded_len = sizeof hdr->mhdr;
> - } else {
> - hdr_len = sizeof hdr->hdr;
> + hdr_len = vi->hdr_len;
> + if (vi->mergeable_rx_bufs)
> + hdr_padded_len = sizeof *hdr;
> + else
> hdr_padded_len = sizeof(struct padded_vnet_hdr);
> - }
>
> memcpy(hdr, p, hdr_len);
>
> @@ -317,11 +311,11 @@ static struct sk_buff *page_to_skb(struct
> virtnet_info *vi,
> return skb;
> }
>
> -static struct sk_buff *receive_small(void *buf, unsigned int len)
> +static struct sk_buff *receive_small(struct virtnet_info *vi, void
> *buf, unsigned int len)
> {
> struct sk_buff * skb = buf;
>
> - len -= sizeof(struct virtio_net_hdr);
> + len -= vi->hdr_len;
> skb_trim(skb, len);
>
> return skb;
> @@ -354,8 +348,8 @@ static struct sk_buff *receive_mergeable(struct
> net_device *dev,
> unsigned int len)
> {
> void *buf = mergeable_ctx_to_buf_address(ctx);
> - struct skb_vnet_hdr *hdr = buf;
> - u16 num_buf = virtio16_to_cpu(rq->vq->vdev, hdr->mhdr.num_buffers);
> + struct virtio_net_hdr_mrg_rxbuf *hdr = buf;
> + u16 num_buf = virtio16_to_cpu(vi->vdev, hdr->num_buffers);
> struct page *page = virt_to_head_page(buf);
> int offset = buf - page_address(page);
> unsigned int truesize = max(len,
> mergeable_ctx_to_buf_truesize(ctx));
> @@ -373,8 +367,8 @@ static struct sk_buff *receive_mergeable(struct
> net_device *dev,
> if (unlikely(!ctx)) {
> pr_debug("%s: rx error: %d buffers out of %d missing\n",
> dev->name, num_buf,
> - virtio16_to_cpu(rq->vq->vdev,
> - hdr->mhdr.num_buffers));
> + virtio16_to_cpu(vi->vdev,
> + hdr->num_buffers));
> dev->stats.rx_length_errors++;
> goto err_buf;
> }
> @@ -441,7 +435,7 @@ static void receive_buf(struct virtnet_info *vi,
> struct receive_queue *rq,
> struct net_device *dev = vi->dev;
> struct virtnet_stats *stats = this_cpu_ptr(vi->stats);
> struct sk_buff *skb;
> - struct skb_vnet_hdr *hdr;
> + struct virtio_net_hdr_mrg_rxbuf *hdr;
>
> if (unlikely(len < sizeof(struct virtio_net_hdr) + ETH_HLEN)) {
> pr_debug("%s: short packet %i\n", dev->name, len);
> @@ -463,7 +457,7 @@ static void receive_buf(struct virtnet_info *vi,
> struct receive_queue *rq,
> else if (vi->big_packets)
> skb = receive_big(dev, vi, rq, buf, len);
> else
> - skb = receive_small(buf, len);
> + skb = receive_small(vi, buf, len);
>
> if (unlikely(!skb))
> return;
> @@ -545,7 +539,7 @@ static int add_recvbuf_small(struct virtnet_info
> *vi, struct receive_queue *rq,
> gfp_t gfp)
> {
> struct sk_buff *skb;
> - struct skb_vnet_hdr *hdr;
> + struct virtio_net_hdr_mrg_rxbuf *hdr;
> int err;
>
> skb = __netdev_alloc_skb_ip_align(vi->dev, GOOD_PACKET_LEN, gfp);
> @@ -556,7 +550,7 @@ static int add_recvbuf_small(struct virtnet_info
> *vi, struct receive_queue *rq,
>
> hdr = skb_vnet_hdr(skb);
> sg_init_table(rq->sg, MAX_SKB_FRAGS + 2);
> - sg_set_buf(rq->sg, &hdr->hdr, sizeof hdr->hdr);
> + sg_set_buf(rq->sg, hdr, vi->hdr_len);
> skb_to_sgvec(skb, rq->sg + 1, 0, skb->len);
>
> err = virtqueue_add_inbuf(rq->vq, rq->sg, 2, skb, gfp);
> @@ -566,7 +560,8 @@ static int add_recvbuf_small(struct virtnet_info
> *vi, struct receive_queue *rq,
> return err;
> }
>
> -static int add_recvbuf_big(struct receive_queue *rq, gfp_t gfp)
> +static int add_recvbuf_big(struct virtnet_info *vi, struct
> receive_queue *rq,
> + gfp_t gfp)
> {
> struct page *first, *list = NULL;
> char *p;
> @@ -597,8 +592,8 @@ static int add_recvbuf_big(struct receive_queue
> *rq, gfp_t gfp)
> p = page_address(first);
>
> /* rq->sg[0], rq->sg[1] share the same page */
> - /* a separated rq->sg[0] for virtio_net_hdr only due to QEMU bug */
> - sg_set_buf(&rq->sg[0], p, sizeof(struct virtio_net_hdr));
> + /* a separated rq->sg[0] for header - required in case
> !any_header_sg */
> + sg_set_buf(&rq->sg[0], p, vi->hdr_len);
>
> /* rq->sg[1] for data packet, from offset */
> offset = sizeof(struct padded_vnet_hdr);
> @@ -677,7 +672,7 @@ static bool try_fill_recv(struct virtnet_info
> *vi, struct receive_queue *rq,
> if (vi->mergeable_rx_bufs)
> err = add_recvbuf_mergeable(rq, gfp);
> else if (vi->big_packets)
> - err = add_recvbuf_big(rq, gfp);
> + err = add_recvbuf_big(vi, rq, gfp);
> else
> err = add_recvbuf_small(vi, rq, gfp);
>
> @@ -857,18 +852,14 @@ static void free_old_xmit_skbs(struct
> send_queue *sq)
>
> static int xmit_skb(struct send_queue *sq, struct sk_buff *skb)
> {
> - struct skb_vnet_hdr *hdr;
> + struct virtio_net_hdr_mrg_rxbuf *hdr;
> const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest;
> struct virtnet_info *vi = sq->vq->vdev->priv;
> unsigned num_sg;
> - unsigned hdr_len;
> + unsigned hdr_len = vi->hdr_len;
> bool can_push;
>
> pr_debug("%s: xmit %p %pM\n", vi->dev->name, skb, dest);
> - if (vi->mergeable_rx_bufs)
> - hdr_len = sizeof hdr->mhdr;
> - else
> - hdr_len = sizeof hdr->hdr;
>
> can_push = vi->any_header_sg &&
> !((unsigned long)skb->data & (__alignof__(*hdr) - 1)) &&
> @@ -876,7 +867,7 @@ static int xmit_skb(struct send_queue *sq, struct
> sk_buff *skb)
> /* Even if we can, don't push here yet as this would skew
> * csum_start offset below. */
> if (can_push)
> - hdr = (struct skb_vnet_hdr *)(skb->data - hdr_len);
> + hdr = (struct virtio_net_hdr_mrg_rxbuf *)(skb->data - hdr_len);
> else
> hdr = skb_vnet_hdr(skb);
>
> @@ -909,7 +900,7 @@ static int xmit_skb(struct send_queue *sq, struct
> sk_buff *skb)
> }
>
> if (vi->mergeable_rx_bufs)
> - hdr->mhdr.num_buffers = 0;
> + hdr->num_buffers = 0;
>
> sg_init_table(sq->sg, MAX_SKB_FRAGS + 2);
> if (can_push) {
> @@ -1814,18 +1805,19 @@ static int virtnet_probe(struct virtio_device
> *vdev)
> if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF))
> vi->mergeable_rx_bufs = true;
>
> + if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF))
> + vi->hdr_len = sizeof(struct virtio_net_hdr_mrg_rxbuf);
> + else
> + vi->hdr_len = sizeof(struct virtio_net_hdr);
> +
> if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT))
> vi->any_header_sg = true;
>
> if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ))
> vi->has_cvq = true;
>
> - if (vi->any_header_sg) {
> - if (vi->mergeable_rx_bufs)
> - dev->needed_headroom = sizeof(struct virtio_net_hdr_mrg_rxbuf);
> - else
> - dev->needed_headroom = sizeof(struct virtio_net_hdr);
> - }
> + if (vi->any_header_sg)
> + dev->needed_headroom = vi->hdr_len;
>
> /* Use single tx/rx queue pair as default */
> vi->curr_queue_pairs = 1;
> --
> MST
Reviewed-by: Jason Wang <jasowang@redhat.com>
WARNING: multiple messages have this Message-ID (diff)
From: Jason Wang <jasowang@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: linux-kernel@vger.kernel.org, David Miller <davem@davemloft.net>,
cornelia.huck@de.ibm.com, rusty@au1.ibm.com, nab@linux-iscsi.org,
pbonzini@redhat.com, thuth@linux.vnet.ibm.com,
dahi@linux.vnet.ibm.com, Rusty Russell <rusty@rustcorp.com.au>,
virtualization@lists.linux-foundation.org,
netdev@vger.kernel.org
Subject: Re: [PATCH v6 24/46] virtio_net: get rid of virtio_net_hdr/skb_vnet_hdr
Date: Fri, 28 Nov 2014 08:38:25 +0008 [thread overview]
Message-ID: <1417163425.5822.4@smtp.corp.redhat.com> (raw)
In-Reply-To: <1417118789-18231-25-git-send-email-mst@redhat.com>
On Fri, Nov 28, 2014 at 4:09 AM, Michael S. Tsirkin <mst@redhat.com>
wrote:
> virtio 1.0 doesn't use virtio_net_hdr anymore, and in fact, it's not
> really useful since virtio_net_hdr_mrg_rxbuf includes that as the
> first
> field anyway.
>
> Let's drop it, precalculate header len and store within vi instead.
>
> This way we can also remove struct skb_vnet_hdr.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> ---
> drivers/net/virtio_net.c | 90
> ++++++++++++++++++++++--------------------------
> 1 file changed, 41 insertions(+), 49 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 1630c21..516f2cb 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -123,6 +123,9 @@ struct virtnet_info {
> /* Host can handle any s/g split between our header and packet data
> */
> bool any_header_sg;
>
> + /* Packet virtio header size */
> + u8 hdr_len;
> +
> /* Active statistics */
> struct virtnet_stats __percpu *stats;
>
> @@ -139,21 +142,14 @@ struct virtnet_info {
> struct notifier_block nb;
> };
>
> -struct skb_vnet_hdr {
> - union {
> - struct virtio_net_hdr hdr;
> - struct virtio_net_hdr_mrg_rxbuf mhdr;
> - };
> -};
> -
> struct padded_vnet_hdr {
> - struct virtio_net_hdr hdr;
> + struct virtio_net_hdr_mrg_rxbuf hdr;
> /*
> - * virtio_net_hdr should be in a separated sg buffer because of a
> - * QEMU bug, and data sg buffer shares same page with this header
> sg.
> - * This padding makes next sg 16 byte aligned after virtio_net_hdr.
> + * hdr is in a separate sg buffer, and data sg buffer shares same
> page
> + * with this header sg. This padding makes next sg 16 byte aligned
> + * after the header.
> */
> - char padding[6];
> + char padding[4];
> };
>
> /* Converting between virtqueue no. and kernel tx/rx queue no.
> @@ -179,9 +175,9 @@ static int rxq2vq(int rxq)
> return rxq * 2;
> }
>
> -static inline struct skb_vnet_hdr *skb_vnet_hdr(struct sk_buff *skb)
> +static inline struct virtio_net_hdr_mrg_rxbuf *skb_vnet_hdr(struct
> sk_buff *skb)
> {
> - return (struct skb_vnet_hdr *)skb->cb;
> + return (struct virtio_net_hdr_mrg_rxbuf *)skb->cb;
> }
>
> /*
> @@ -247,7 +243,7 @@ static struct sk_buff *page_to_skb(struct
> virtnet_info *vi,
> unsigned int len, unsigned int truesize)
> {
> struct sk_buff *skb;
> - struct skb_vnet_hdr *hdr;
> + struct virtio_net_hdr_mrg_rxbuf *hdr;
> unsigned int copy, hdr_len, hdr_padded_len;
> char *p;
>
> @@ -260,13 +256,11 @@ static struct sk_buff *page_to_skb(struct
> virtnet_info *vi,
>
> hdr = skb_vnet_hdr(skb);
>
> - if (vi->mergeable_rx_bufs) {
> - hdr_len = sizeof hdr->mhdr;
> - hdr_padded_len = sizeof hdr->mhdr;
> - } else {
> - hdr_len = sizeof hdr->hdr;
> + hdr_len = vi->hdr_len;
> + if (vi->mergeable_rx_bufs)
> + hdr_padded_len = sizeof *hdr;
> + else
> hdr_padded_len = sizeof(struct padded_vnet_hdr);
> - }
>
> memcpy(hdr, p, hdr_len);
>
> @@ -317,11 +311,11 @@ static struct sk_buff *page_to_skb(struct
> virtnet_info *vi,
> return skb;
> }
>
> -static struct sk_buff *receive_small(void *buf, unsigned int len)
> +static struct sk_buff *receive_small(struct virtnet_info *vi, void
> *buf, unsigned int len)
> {
> struct sk_buff * skb = buf;
>
> - len -= sizeof(struct virtio_net_hdr);
> + len -= vi->hdr_len;
> skb_trim(skb, len);
>
> return skb;
> @@ -354,8 +348,8 @@ static struct sk_buff *receive_mergeable(struct
> net_device *dev,
> unsigned int len)
> {
> void *buf = mergeable_ctx_to_buf_address(ctx);
> - struct skb_vnet_hdr *hdr = buf;
> - u16 num_buf = virtio16_to_cpu(rq->vq->vdev, hdr->mhdr.num_buffers);
> + struct virtio_net_hdr_mrg_rxbuf *hdr = buf;
> + u16 num_buf = virtio16_to_cpu(vi->vdev, hdr->num_buffers);
> struct page *page = virt_to_head_page(buf);
> int offset = buf - page_address(page);
> unsigned int truesize = max(len,
> mergeable_ctx_to_buf_truesize(ctx));
> @@ -373,8 +367,8 @@ static struct sk_buff *receive_mergeable(struct
> net_device *dev,
> if (unlikely(!ctx)) {
> pr_debug("%s: rx error: %d buffers out of %d missing\n",
> dev->name, num_buf,
> - virtio16_to_cpu(rq->vq->vdev,
> - hdr->mhdr.num_buffers));
> + virtio16_to_cpu(vi->vdev,
> + hdr->num_buffers));
> dev->stats.rx_length_errors++;
> goto err_buf;
> }
> @@ -441,7 +435,7 @@ static void receive_buf(struct virtnet_info *vi,
> struct receive_queue *rq,
> struct net_device *dev = vi->dev;
> struct virtnet_stats *stats = this_cpu_ptr(vi->stats);
> struct sk_buff *skb;
> - struct skb_vnet_hdr *hdr;
> + struct virtio_net_hdr_mrg_rxbuf *hdr;
>
> if (unlikely(len < sizeof(struct virtio_net_hdr) + ETH_HLEN)) {
> pr_debug("%s: short packet %i\n", dev->name, len);
> @@ -463,7 +457,7 @@ static void receive_buf(struct virtnet_info *vi,
> struct receive_queue *rq,
> else if (vi->big_packets)
> skb = receive_big(dev, vi, rq, buf, len);
> else
> - skb = receive_small(buf, len);
> + skb = receive_small(vi, buf, len);
>
> if (unlikely(!skb))
> return;
> @@ -545,7 +539,7 @@ static int add_recvbuf_small(struct virtnet_info
> *vi, struct receive_queue *rq,
> gfp_t gfp)
> {
> struct sk_buff *skb;
> - struct skb_vnet_hdr *hdr;
> + struct virtio_net_hdr_mrg_rxbuf *hdr;
> int err;
>
> skb = __netdev_alloc_skb_ip_align(vi->dev, GOOD_PACKET_LEN, gfp);
> @@ -556,7 +550,7 @@ static int add_recvbuf_small(struct virtnet_info
> *vi, struct receive_queue *rq,
>
> hdr = skb_vnet_hdr(skb);
> sg_init_table(rq->sg, MAX_SKB_FRAGS + 2);
> - sg_set_buf(rq->sg, &hdr->hdr, sizeof hdr->hdr);
> + sg_set_buf(rq->sg, hdr, vi->hdr_len);
> skb_to_sgvec(skb, rq->sg + 1, 0, skb->len);
>
> err = virtqueue_add_inbuf(rq->vq, rq->sg, 2, skb, gfp);
> @@ -566,7 +560,8 @@ static int add_recvbuf_small(struct virtnet_info
> *vi, struct receive_queue *rq,
> return err;
> }
>
> -static int add_recvbuf_big(struct receive_queue *rq, gfp_t gfp)
> +static int add_recvbuf_big(struct virtnet_info *vi, struct
> receive_queue *rq,
> + gfp_t gfp)
> {
> struct page *first, *list = NULL;
> char *p;
> @@ -597,8 +592,8 @@ static int add_recvbuf_big(struct receive_queue
> *rq, gfp_t gfp)
> p = page_address(first);
>
> /* rq->sg[0], rq->sg[1] share the same page */
> - /* a separated rq->sg[0] for virtio_net_hdr only due to QEMU bug */
> - sg_set_buf(&rq->sg[0], p, sizeof(struct virtio_net_hdr));
> + /* a separated rq->sg[0] for header - required in case
> !any_header_sg */
> + sg_set_buf(&rq->sg[0], p, vi->hdr_len);
>
> /* rq->sg[1] for data packet, from offset */
> offset = sizeof(struct padded_vnet_hdr);
> @@ -677,7 +672,7 @@ static bool try_fill_recv(struct virtnet_info
> *vi, struct receive_queue *rq,
> if (vi->mergeable_rx_bufs)
> err = add_recvbuf_mergeable(rq, gfp);
> else if (vi->big_packets)
> - err = add_recvbuf_big(rq, gfp);
> + err = add_recvbuf_big(vi, rq, gfp);
> else
> err = add_recvbuf_small(vi, rq, gfp);
>
> @@ -857,18 +852,14 @@ static void free_old_xmit_skbs(struct
> send_queue *sq)
>
> static int xmit_skb(struct send_queue *sq, struct sk_buff *skb)
> {
> - struct skb_vnet_hdr *hdr;
> + struct virtio_net_hdr_mrg_rxbuf *hdr;
> const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest;
> struct virtnet_info *vi = sq->vq->vdev->priv;
> unsigned num_sg;
> - unsigned hdr_len;
> + unsigned hdr_len = vi->hdr_len;
> bool can_push;
>
> pr_debug("%s: xmit %p %pM\n", vi->dev->name, skb, dest);
> - if (vi->mergeable_rx_bufs)
> - hdr_len = sizeof hdr->mhdr;
> - else
> - hdr_len = sizeof hdr->hdr;
>
> can_push = vi->any_header_sg &&
> !((unsigned long)skb->data & (__alignof__(*hdr) - 1)) &&
> @@ -876,7 +867,7 @@ static int xmit_skb(struct send_queue *sq, struct
> sk_buff *skb)
> /* Even if we can, don't push here yet as this would skew
> * csum_start offset below. */
> if (can_push)
> - hdr = (struct skb_vnet_hdr *)(skb->data - hdr_len);
> + hdr = (struct virtio_net_hdr_mrg_rxbuf *)(skb->data - hdr_len);
> else
> hdr = skb_vnet_hdr(skb);
>
> @@ -909,7 +900,7 @@ static int xmit_skb(struct send_queue *sq, struct
> sk_buff *skb)
> }
>
> if (vi->mergeable_rx_bufs)
> - hdr->mhdr.num_buffers = 0;
> + hdr->num_buffers = 0;
>
> sg_init_table(sq->sg, MAX_SKB_FRAGS + 2);
> if (can_push) {
> @@ -1814,18 +1805,19 @@ static int virtnet_probe(struct virtio_device
> *vdev)
> if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF))
> vi->mergeable_rx_bufs = true;
>
> + if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF))
> + vi->hdr_len = sizeof(struct virtio_net_hdr_mrg_rxbuf);
> + else
> + vi->hdr_len = sizeof(struct virtio_net_hdr);
> +
> if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT))
> vi->any_header_sg = true;
>
> if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ))
> vi->has_cvq = true;
>
> - if (vi->any_header_sg) {
> - if (vi->mergeable_rx_bufs)
> - dev->needed_headroom = sizeof(struct virtio_net_hdr_mrg_rxbuf);
> - else
> - dev->needed_headroom = sizeof(struct virtio_net_hdr);
> - }
> + if (vi->any_header_sg)
> + dev->needed_headroom = vi->hdr_len;
>
> /* Use single tx/rx queue pair as default */
> vi->curr_queue_pairs = 1;
> --
> MST
Reviewed-by: Jason Wang <jasowang@redhat.com>
next prev parent reply other threads:[~2014-11-28 8:30 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-27 20:07 [PATCH v6 00/45] linux: towards virtio-1 guest support Michael S. Tsirkin
2014-11-27 20:07 ` [PATCH v6 01/46] virtio: add low-level APIs for feature bits Michael S. Tsirkin
2014-11-27 20:07 ` Michael S. Tsirkin
2014-11-28 10:02 ` Cornelia Huck
2014-11-28 10:02 ` Cornelia Huck
2014-11-29 17:30 ` Michael S. Tsirkin
2014-11-29 17:30 ` Michael S. Tsirkin
2014-11-28 12:10 ` David Hildenbrand
2014-11-28 12:10 ` David Hildenbrand
2014-11-29 17:32 ` Michael S. Tsirkin
2014-11-29 17:32 ` Michael S. Tsirkin
2014-11-27 20:07 ` [PATCH v6 02/46] virtio: use u32, not bitmap for features Michael S. Tsirkin
2014-11-27 20:07 ` Michael S. Tsirkin
2014-11-28 12:44 ` Cornelia Huck
2014-11-28 12:44 ` Cornelia Huck
2014-11-29 17:34 ` Michael S. Tsirkin
2014-11-29 17:34 ` Michael S. Tsirkin
2014-11-27 20:07 ` [PATCH v6 03/46] mic_virtio: robust feature array size calculation Michael S. Tsirkin
2014-11-27 20:07 ` [PATCH v6 04/46] virtio: add support for 64 bit features Michael S. Tsirkin
2014-11-27 20:07 ` Michael S. Tsirkin
2014-11-28 8:52 ` David Hildenbrand
2014-11-28 8:52 ` David Hildenbrand
2014-11-28 12:47 ` Cornelia Huck
2014-11-28 12:47 ` Cornelia Huck
2014-11-27 20:08 ` [PATCH v6 05/46] virtio: assert 32 bit features in transports Michael S. Tsirkin
2014-11-27 20:08 ` Michael S. Tsirkin
2014-11-28 8:54 ` David Hildenbrand
2014-11-28 8:54 ` David Hildenbrand
2014-11-28 12:50 ` Cornelia Huck
2014-11-28 12:50 ` Cornelia Huck
2014-11-27 20:08 ` [PATCH v6 06/46] virtio_ccw: add support for 64 bit features Michael S. Tsirkin
2014-11-28 12:56 ` Cornelia Huck
2014-11-27 20:08 ` [PATCH v6 07/46] virtio: add virtio 1.0 feature bit Michael S. Tsirkin
2014-11-27 20:08 ` Michael S. Tsirkin
2014-11-27 20:08 ` [PATCH v6 08/46] virtio: memory access APIs Michael S. Tsirkin
2014-11-27 20:08 ` Michael S. Tsirkin
2014-11-27 20:08 ` [PATCH v6 09/46] virtio_ring: switch to new " Michael S. Tsirkin
2014-11-27 20:08 ` Michael S. Tsirkin
2014-11-27 20:08 ` [PATCH v6 10/46] virtio_config: endian conversion for v1.0 Michael S. Tsirkin
2014-11-27 20:08 ` Michael S. Tsirkin
2014-11-27 20:08 ` [PATCH v6 11/46] virtio: allow transports to get avail/used addresses Michael S. Tsirkin
2014-11-27 20:08 ` Michael S. Tsirkin
2014-11-27 20:08 ` [PATCH v6 12/46] virtio: set FEATURES_OK Michael S. Tsirkin
2014-11-27 20:08 ` Michael S. Tsirkin
2014-11-27 20:08 ` [PATCH v6 13/46] virtio: simplify feature bit handling Michael S. Tsirkin
2014-11-27 20:08 ` Michael S. Tsirkin
2014-11-27 20:08 ` [PATCH v6 14/46] virtio: add legacy feature table support Michael S. Tsirkin
2014-11-27 20:08 ` Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 15/46] virtio_net: v1.0 endianness Michael S. Tsirkin
2014-11-27 20:09 ` Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 16/46] virtio_blk: v1.0 support Michael S. Tsirkin
2014-11-27 20:09 ` Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 17/46] KVM: s390: Set virtio-ccw transport revision Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 18/46] KVM: s390: virtio-ccw revision 1 SET_VQ Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 19/46] KVM: s390 allow virtio_ccw status writes to fail Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 20/46] KVM: s390: enable virtio-ccw revision 1 Michael S. Tsirkin
2014-11-28 10:09 ` Cornelia Huck
2014-11-29 17:31 ` Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 21/46] virtio_blk: make serial attribute static Michael S. Tsirkin
2014-11-27 20:09 ` Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 22/46] virtio_blk: fix race at module removal Michael S. Tsirkin
2014-11-27 20:09 ` Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 23/46] virtio_net: pass vi around Michael S. Tsirkin
2014-11-27 20:09 ` Michael S. Tsirkin
2014-11-27 20:09 ` [PATCH v6 24/46] virtio_net: get rid of virtio_net_hdr/skb_vnet_hdr Michael S. Tsirkin
2014-11-27 20:09 ` Michael S. Tsirkin
2014-11-28 8:30 ` Jason Wang [this message]
2014-11-28 8:30 ` Jason Wang
2014-11-27 20:09 ` [PATCH v6 25/46] virtio_net: stricter short buffer length checks Michael S. Tsirkin
2014-11-27 20:09 ` Michael S. Tsirkin
2014-11-28 8:31 ` Jason Wang
2014-11-28 8:31 ` Jason Wang
2014-11-27 20:10 ` [PATCH v6 26/46] virtio_net: bigger header when VERSION_1 is set Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-28 8:31 ` Jason Wang
2014-11-28 8:31 ` Jason Wang
2014-11-27 20:10 ` [PATCH v6 27/46] virtio_net: enable v1.0 support Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-27 20:10 ` [PATCH v6 28/46] vhost: make features 64 bit Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-28 8:32 ` Jason Wang
2014-11-28 8:32 ` Jason Wang
2014-11-27 20:10 ` [PATCH v6 29/46] vhost: add memory access wrappers Michael S. Tsirkin
2014-11-28 8:35 ` Jason Wang
2014-11-28 8:35 ` Jason Wang
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-27 20:10 ` [PATCH v6 30/46] vhost/net: force len for TX to host endian Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-28 8:36 ` Jason Wang
2014-11-28 8:36 ` Jason Wang
2014-11-27 20:10 ` [PATCH v6 31/46] vhost: virtio 1.0 endian-ness support Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-27 20:10 ` [PATCH v6 32/46] vhost/net: virtio 1.0 byte swap Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-27 20:10 ` [PATCH v6 33/46] vhost/net: larger header for virtio 1.0 Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-28 8:38 ` Jason Wang
2014-11-28 8:38 ` Jason Wang
2014-11-27 20:10 ` [PATCH v6 34/46] virtio_net: disable mac write " Michael S. Tsirkin
2014-11-28 8:40 ` Jason Wang
2014-11-28 8:40 ` Jason Wang
2014-11-29 17:28 ` Michael S. Tsirkin
2014-11-29 17:28 ` Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-27 20:10 ` [PATCH v6 35/46] vhost/net: enable " Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-27 20:10 ` [PATCH v6 36/46] vhost/net: suppress compiler warning Michael S. Tsirkin
2014-11-27 20:10 ` Michael S. Tsirkin
2014-11-27 20:10 ` [PATCH v6 37/46] tun: move internal flag defines out of uapi Michael S. Tsirkin
[not found] ` <1417118789-18231-38-git-send-email-mst-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2014-11-28 8:07 ` Jason Wang
2014-11-28 8:07 ` Jason Wang
[not found] ` <1417162052.5822.0-LLcwxoN42L4NLKR9yMNcA1aTQe2KTcn/@public.gmane.org>
2014-11-29 17:17 ` Michael S. Tsirkin
2014-11-29 17:17 ` Michael S. Tsirkin
2014-11-27 20:11 ` [PATCH v6 38/46] tun: drop most type defines Michael S. Tsirkin
2014-11-28 8:09 ` Jason Wang
2014-11-29 17:23 ` Michael S. Tsirkin
2014-11-27 20:11 ` [PATCH v6 39/46] tun: add VNET_LE flag Michael S. Tsirkin
2014-11-27 20:11 ` [PATCH v6 40/46] tun: TUN_VNET_LE support, fix sparse warnings for virtio headers Michael S. Tsirkin
2014-11-28 8:19 ` Jason Wang
2014-11-27 20:11 ` [PATCH v6 41/46] macvtap: TUN_VNET_HDR support Michael S. Tsirkin
2014-11-28 8:24 ` Jason Wang
2014-11-27 20:11 ` [PATCH v6 42/46] virtio_scsi: v1.0 support Michael S. Tsirkin
2014-11-27 20:11 ` Michael S. Tsirkin
2014-11-27 20:11 ` [PATCH v6 43/46] virtio_scsi: move to uapi Michael S. Tsirkin
2014-11-27 20:11 ` [PATCH v6 44/46] virtio_scsi: export to userspace Michael S. Tsirkin
2014-11-27 20:11 ` Michael S. Tsirkin
2014-11-27 20:11 ` [PATCH v6 45/46] vhost/scsi: partial virtio 1.0 support Michael S. Tsirkin
2014-11-27 20:11 ` Michael S. Tsirkin
2014-11-27 20:11 ` [PATCH v6 46/46] af_packet: virtio 1.0 stubs Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1417163425.5822.4@smtp.corp.redhat.com \
--to=jasowang@redhat.com \
--cc=dahi@linux.vnet.ibm.com \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=rusty@au1.ibm.com \
--cc=thuth@linux.vnet.ibm.com \
--cc=virtualization@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.