From: Anthony Liguori <anthony@codemonkey.ws>
To: "Michael S. Tsirkin" <mst@redhat.com>,
qemu-devel@nongnu.org, Jason Wang <jasowang@redhat.com>,
stefanha@linux.vnet.ibm.com, aurelien@aurel32.net
Subject: Re: [Qemu-devel] [PATCH 05/14] virtio-net: use safe iov operations for rx
Date: Mon, 24 Sep 2012 19:38:24 -0500 [thread overview]
Message-ID: <877grj0we7.fsf@codemonkey.ws> (raw)
In-Reply-To: <e1b22795c3abfc5b802ef591abc4db1dda298448.1348527749.git.mst@redhat.com>
"Michael S. Tsirkin" <mst@redhat.com> writes:
> Avoid magling iov manually: use safe iov operations
> for processing packets incoming to guest.
> This also removes the requirement for virtio header to
> fit the first s/g entry exactly.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
Regards,
Anthony Liguori
> ---
> hw/virtio-net.c | 25 ++++++++++++++-----------
> 1 file changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/hw/virtio-net.c b/hw/virtio-net.c
> index 6e53858..9611d95 100644
> --- a/hw/virtio-net.c
> +++ b/hw/virtio-net.c
> @@ -593,8 +593,9 @@ static int receive_filter(VirtIONet *n, const uint8_t *buf, int size)
> static ssize_t virtio_net_receive(NetClientState *nc, const uint8_t *buf, size_t size)
> {
> VirtIONet *n = DO_UPCAST(NICState, nc, nc)->opaque;
> - struct virtio_net_hdr_mrg_rxbuf *mhdr = NULL;
> - const struct iovec *sg = elem.in_sg;
> + struct iovec mhdr_sg[VIRTQUEUE_MAX_SIZE];
> + struct virtio_net_hdr_mrg_rxbuf mhdr;
> + unsigned mhdr_cnt = 0;
> size_t offset, i, guest_offset;
>
> if (!virtio_net_can_receive(&n->nic->nc))
> @@ -632,14 +633,13 @@ static ssize_t virtio_net_receive(NetClientState *nc, const uint8_t *buf, size_t
> exit(1);
> }
>
> - if (!n->mergeable_rx_bufs && elem.in_sg[0].iov_len != n->guest_hdr_len) {
> - error_report("virtio-net header not in first element");
> - exit(1);
> - }
> -
> if (i == 0) {
> - if (n->mergeable_rx_bufs)
> - mhdr = (struct virtio_net_hdr_mrg_rxbuf *)sg[0].iov_base;
> + if (n->mergeable_rx_bufs) {
> + mhdr_cnt = iov_cpy(mhdr_sg, ARRAY_SIZE(mhdr_sg),
> + sg, elem.in_num,
> + offsetof(typeof(mhdr), num_buffers),
> + sizeof(mhdr.num_buffers));
> + }
>
> offset += receive_header(n, sg, elem.in_num,
> buf + offset, size - offset);
> @@ -672,8 +672,11 @@ static ssize_t virtio_net_receive(NetClientState *nc, const uint8_t *buf, size_t
> virtqueue_fill(n->rx_vq, &elem, total, i++);
> }
>
> - if (mhdr) {
> - stw_p(&mhdr->num_buffers, i);
> + if (mhdr_cnt) {
> + stw_p(&mhdr.num_buffers, i);
> + iov_from_buf(mhdr_sg, mhdr_cnt,
> + 0,
> + &mhdr.num_buffers, sizeof mhdr.num_buffers);
> }
>
> virtqueue_flush(n->rx_vq, i);
> --
> MST
next prev parent reply other threads:[~2012-09-25 0:38 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-24 23:04 [Qemu-devel] [PATCH 00/14] virtio-net: iovec handling cleanup Michael S. Tsirkin
2012-09-24 23:04 ` [Qemu-devel] [PATCH 01/14] virtio-net: track host/guest header length Michael S. Tsirkin
2012-09-24 23:04 ` [Qemu-devel] [PATCH 02/14] iov: add const annotation Michael S. Tsirkin
2012-09-24 23:04 ` [Qemu-devel] [PATCH 03/14] iov: add iov_cpy Michael S. Tsirkin
2012-09-25 0:34 ` Anthony Liguori
2012-09-25 0:45 ` Michael S. Tsirkin
2012-09-24 23:04 ` [Qemu-devel] [PATCH 04/14] virtio-net: avoid sg copy Michael S. Tsirkin
2012-09-25 0:37 ` Anthony Liguori
2012-09-25 0:44 ` Michael S. Tsirkin
2012-09-24 23:04 ` [Qemu-devel] [PATCH 05/14] virtio-net: use safe iov operations for rx Michael S. Tsirkin
2012-09-25 0:38 ` Anthony Liguori [this message]
2012-09-24 23:04 ` [Qemu-devel] [PATCH 06/14] virtio-net: refactor receive_hdr Michael S. Tsirkin
2012-09-25 0:39 ` Anthony Liguori
2012-09-24 23:04 ` [Qemu-devel] [PATCH 07/14] virtio-net: first s/g is always at start of buf Michael S. Tsirkin
2012-09-25 0:39 ` Anthony Liguori
2012-09-24 23:04 ` [Qemu-devel] [PATCH 08/14] virtio-net: switch tx to safe iov functions Michael S. Tsirkin
2012-09-24 23:04 ` [Qemu-devel] [PATCH 09/14] virtio-net: simplify rx code Michael S. Tsirkin
2012-09-24 23:04 ` [Qemu-devel] [PATCH 10/14] virtio: don't mark unaccessed memory as dirty Michael S. Tsirkin
2012-09-24 23:05 ` [Qemu-devel] [PATCH 11/14] virtio-net: fix used len for tx Michael S. Tsirkin
2012-09-25 6:15 ` Jason Wang
2012-09-25 7:20 ` Michael S. Tsirkin
2012-09-24 23:05 ` [Qemu-devel] [PATCH 12/14] virtio-net: minor code simplification Michael S. Tsirkin
2012-09-24 23:05 ` [Qemu-devel] [PATCH 13/14] virtio-net: test peer header support at init time Michael S. Tsirkin
2012-09-24 23:05 ` [Qemu-devel] [PATCH 14/14] virtio-net: enable mrg buf header in tap on linux 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=877grj0we7.fsf@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=aurelien@aurel32.net \
--cc=jasowang@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@linux.vnet.ibm.com \
/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.