From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57489) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WvQmL-00037I-5z for qemu-devel@nongnu.org; Fri, 13 Jun 2014 08:40:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WvQmC-00030x-0s for qemu-devel@nongnu.org; Fri, 13 Jun 2014 08:40:21 -0400 Received: from e06smtp10.uk.ibm.com ([195.75.94.106]:40333) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WvQmB-00030l-Kw for qemu-devel@nongnu.org; Fri, 13 Jun 2014 08:40:11 -0400 Received: from /spool/local by e06smtp10.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 13 Jun 2014 13:40:10 +0100 Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by d06dlp01.portsmouth.uk.ibm.com (Postfix) with ESMTP id 4BD9B17D8047 for ; Fri, 13 Jun 2014 13:41:30 +0100 (BST) Received: from d06av08.portsmouth.uk.ibm.com (d06av08.portsmouth.uk.ibm.com [9.149.37.249]) by b06cxnps4076.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s5DCe8LM32440332 for ; Fri, 13 Jun 2014 12:40:08 GMT Received: from d06av08.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av08.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s5DCe7eU001905 for ; Fri, 13 Jun 2014 06:40:07 -0600 Date: Fri, 13 Jun 2014 14:40:02 +0200 From: Greg Kurz Message-ID: <20140613144002.71ae0ef3@bahia.local> In-Reply-To: <539AED8F.5070401@fr.ibm.com> References: <20140613111703.22108.14322.stgit@bahia.local> <20140613112420.22108.4861.stgit@bahia.local> <539AE5E4.3060708@suse.de> <539AED8F.5070401@fr.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v8 14/20] virtio-net: use virtio wrappers to access headers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Cedric Le Goater Cc: Kevin Wolf , Peter Maydell , Stefan Hajnoczi , "Michael S. Tsirkin" , Rusty Russell , Alexander Graf , qemu-devel@nongnu.org, Juan Quintela , aneesh.kumar@linux.vnet.ibm.com, Anthony Liguori , Amit Shah , Paolo Bonzini , Andreas =?UTF-8?B?RsOkcmJlcg==?= On Fri, 13 Jun 2014 14:24:47 +0200 Cedric Le Goater wrote: > On 06/13/2014 01:52 PM, Alexander Graf wrote: > >=20 > > On 13.06.14 13:24, Greg Kurz wrote: > >> From: Rusty Russell > >> > >> Signed-off-by: Rusty Russell > >> Reviewed-by: Anthony Liguori > >> [ pass VirtIODevice * to memory accessors, > >> TCP checksums fix by C=C3=A9dric Le Goater, > >> Greg Kurz ] > >> Cc: C=C3=A9dric Le Goater > >> Signed-off-by: Greg Kurz > >> --- > >> hw/net/virtio-net.c | 34 +++++++++++++++++++++++++++------- > >> 1 file changed, 27 insertions(+), 7 deletions(-) > >> > >> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c > >> index 58e7b73..fb17919 100644 > >> --- a/hw/net/virtio-net.c > >> +++ b/hw/net/virtio-net.c > >> @@ -23,6 +23,7 @@ > >> #include "hw/virtio/virtio-bus.h" > >> #include "qapi/qmp/qjson.h" > >> #include "monitor/monitor.h" > >> +#include "hw/virtio/virtio-access.h" > >> #define VIRTIO_NET_VM_VERSION 11 > >> @@ -72,8 +73,8 @@ static void virtio_net_get_config(VirtIODevice *vd= ev, uint8_t *config) > >> VirtIONet *n =3D VIRTIO_NET(vdev); > >> struct virtio_net_config netcfg; > >> - stw_p(&netcfg.status, n->status); > >> - stw_p(&netcfg.max_virtqueue_pairs, n->max_queues); > >> + virtio_stw_p(vdev, &netcfg.status, n->status); > >> + virtio_stw_p(vdev, &netcfg.max_virtqueue_pairs, n->max_queues); > >> memcpy(netcfg.mac, n->mac, ETH_ALEN); > >> memcpy(config, &netcfg, n->config_size); > >> } > >> @@ -611,6 +612,7 @@ static int virtio_net_handle_offloads(VirtIONet *n= , uint8_t cmd, > >> static int virtio_net_handle_mac(VirtIONet *n, uint8_t cmd, > >> struct iovec *iov, unsigned int iov= _cnt) > >> { > >> + VirtIODevice *vdev =3D VIRTIO_DEVICE(n); > >> struct virtio_net_ctrl_mac mac_data; > >> size_t s; > >> NetClientState *nc =3D qemu_get_queue(n->nic); > >> @@ -639,7 +641,7 @@ static int virtio_net_handle_mac(VirtIONet *n, uin= t8_t cmd, > >> s =3D iov_to_buf(iov, iov_cnt, 0, &mac_data.entries, > >> sizeof(mac_data.entries)); > >> - mac_data.entries =3D ldl_p(&mac_data.entries); > >> + mac_data.entries =3D virtio_ldl_p(vdev, &mac_data.entries); > >> if (s !=3D sizeof(mac_data.entries)) { > >> goto error; > >> } > >> @@ -666,7 +668,7 @@ static int virtio_net_handle_mac(VirtIONet *n, uin= t8_t cmd, > >> s =3D iov_to_buf(iov, iov_cnt, 0, &mac_data.entries, > >> sizeof(mac_data.entries)); > >> - mac_data.entries =3D ldl_p(&mac_data.entries); > >> + mac_data.entries =3D virtio_ldl_p(vdev, &mac_data.entries); > >> if (s !=3D sizeof(mac_data.entries)) { > >> goto error; > >> } > >> @@ -706,12 +708,13 @@ error: > >> static int virtio_net_handle_vlan_table(VirtIONet *n, uint8_t cmd, > >> struct iovec *iov, unsigned = int iov_cnt) > >> { > >> + VirtIODevice *vdev =3D VIRTIO_DEVICE(n); > >> uint16_t vid; > >> size_t s; > >> NetClientState *nc =3D qemu_get_queue(n->nic); > >> s =3D iov_to_buf(iov, iov_cnt, 0, &vid, sizeof(vid)); > >> - vid =3D lduw_p(&vid); > >> + vid =3D virtio_lduw_p(vdev, &vid); > >> if (s !=3D sizeof(vid)) { > >> return VIRTIO_NET_ERR; > >> } > >> @@ -748,7 +751,7 @@ static int virtio_net_handle_mq(VirtIONet *n, uint= 8_t cmd, > >> return VIRTIO_NET_ERR; > >> } > >> - queues =3D lduw_p(&mq.virtqueue_pairs); > >> + queues =3D virtio_lduw_p(vdev, &mq.virtqueue_pairs); > >> if (queues < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN || > >> queues > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX || > >> @@ -863,6 +866,14 @@ static int virtio_net_has_buffers(VirtIONetQueue = *q, int bufsize) > >> return 1; > >> } > >> +static void virtio_net_hdr_swap(VirtIODevice *vdev, struct virtio_n= et_hdr *hdr) > >> +{ > >> + virtio_tswap16s(vdev, &hdr->hdr_len); > >> + virtio_tswap16s(vdev, &hdr->gso_size); > >> + virtio_tswap16s(vdev, &hdr->csum_start); > >> + virtio_tswap16s(vdev, &hdr->csum_offset); > >> +} > >> + > >> /* dhclient uses AF_PACKET but doesn't pass auxdata to the kernel so > >> * it never finds out that the packets don't have valid checksums. = This > >> * causes dhclient to get upset. Fedora's carried a patch for ages = to > >> @@ -898,6 +909,7 @@ static void receive_header(VirtIONet *n, const str= uct iovec *iov, int iov_cnt, > >> void *wbuf =3D (void *)buf; > >> work_around_broken_dhclient(wbuf, wbuf + n->host_hdr_len, > >> size - n->host_hdr_len); > >> + virtio_net_hdr_swap(VIRTIO_DEVICE(n), wbuf); > >> iov_from_buf(iov, iov_cnt, 0, buf, sizeof(struct virtio_net_= hdr)); > >> } else { > >> struct virtio_net_hdr hdr =3D { > >> @@ -1047,7 +1059,7 @@ static ssize_t virtio_net_receive(NetClientState= *nc, const uint8_t *buf, size_t > >> } > >> if (mhdr_cnt) { > >> - stw_p(&mhdr.num_buffers, i); > >> + virtio_stw_p(vdev, &mhdr.num_buffers, i); > >> iov_from_buf(mhdr_sg, mhdr_cnt, > >> 0, > >> &mhdr.num_buffers, sizeof mhdr.num_buffers); > >> @@ -1106,6 +1118,14 @@ static int32_t virtio_net_flush_tx(VirtIONetQue= ue *q) > >> exit(1); > >> } > >> + if (n->has_vnet_hdr) { > >> + if (out_sg[0].iov_len < n->guest_hdr_len) { > >> + error_report("virtio-net header incorrect"); > >> + exit(1); > >> + } > >> + virtio_net_hdr_swap(vdev, (void *) out_sg[0].iov_base); > >=20 > > Where does this come from? If you're doing twap() wouldn't that have be= en broken before too? >=20 > That's a (possible) fix for virtio-net when vhost=3Doff. It should probab= ly=20 > be in another patch. >=20 > C. >=20 Yeah you are right, this is a fix for a different issue. I'll simply drop t= hese bits for now, and send a standalone patch later. --=20 Gregory Kurz kurzgreg@fr.ibm.com gkurz@linux.vnet.ibm.com Software Engineer @ IBM/Meiosys http://www.ibm.com Tel +33 (0)562 165 496 "Anarchy is about taking complete responsibility for yourself." Alan Moore.