From patchwork Fri Jun 27 19:08:45 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 365129 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id B5BDA14008B for ; Sat, 28 Jun 2014 05:17:37 +1000 (EST) Received: from localhost ([::1]:52064 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X0beR-0001Xa-OW for incoming@patchwork.ozlabs.org; Fri, 27 Jun 2014 15:17:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34509) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X0bX0-0005V9-Cb for qemu-devel@nongnu.org; Fri, 27 Jun 2014 15:09:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X0bWt-0006z4-QX for qemu-devel@nongnu.org; Fri, 27 Jun 2014 15:09:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:12084) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X0bWt-0006yH-Hp for qemu-devel@nongnu.org; Fri, 27 Jun 2014 15:09:47 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s5RJ9ksD032725 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 27 Jun 2014 15:09:46 -0400 Received: from noname.redhat.com (ovpn-116-40.ams2.redhat.com [10.36.116.40]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s5RJ97bi027690; Fri, 27 Jun 2014 15:09:45 -0400 From: Kevin Wolf To: qemu-devel@nongnu.org Date: Fri, 27 Jun 2014 21:08:45 +0200 Message-Id: <1403896146-3063-27-git-send-email-kwolf@redhat.com> In-Reply-To: <1403896146-3063-1-git-send-email-kwolf@redhat.com> References: <1403896146-3063-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: kwolf@redhat.com Subject: [Qemu-devel] [PULL 26/47] virtio-blk: Use VirtIOBlockReq.in to drop VirtIOBlockReq.inhdr X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Fam Zheng In current virtio spec, inhdr is a single byte, and is unlikely to change for both functionality and compatibility considerations. Non-dataplane uses .in, and we are on the way to converge them. So let's unify it to get cleaner code. Remove .inhdr and use .in. Signed-off-by: Fam Zheng Reviewed-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf --- hw/block/dataplane/virtio-blk.c | 54 +++++++++++++++++------------------------ include/hw/virtio/virtio-blk.h | 4 --- 2 files changed, 22 insertions(+), 36 deletions(-) diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c index 70e8c14..cef707f 100644 --- a/hw/block/dataplane/virtio-blk.c +++ b/hw/block/dataplane/virtio-blk.c @@ -76,9 +76,7 @@ static void complete_rdwr(void *opaque, int ret) trace_virtio_blk_data_plane_complete_request(req->dev->dataplane, req->elem->index, ret); - qemu_iovec_from_buf(req->inhdr, 0, &hdr, sizeof(hdr)); - qemu_iovec_destroy(req->inhdr); - g_slice_free(QEMUIOVector, req->inhdr); + stb_p(&req->in->status, hdr.status); /* According to the virtio specification len should be the number of bytes * written to, but for virtio-blk it seems to be the number of bytes @@ -90,24 +88,20 @@ static void complete_rdwr(void *opaque, int ret) } static void complete_request_early(VirtIOBlockDataPlane *s, VirtQueueElement *elem, - QEMUIOVector *inhdr, unsigned char status) + struct virtio_blk_inhdr *inhdr, + unsigned char status) { - struct virtio_blk_inhdr hdr = { - .status = status, - }; + stb_p(&inhdr->status, status); - qemu_iovec_from_buf(inhdr, 0, &hdr, sizeof(hdr)); - qemu_iovec_destroy(inhdr); - g_slice_free(QEMUIOVector, inhdr); - - vring_push(&s->vring, elem, sizeof(hdr)); + vring_push(&s->vring, elem, sizeof(*inhdr)); notify_guest(s); } /* Get disk serial number */ static void do_get_id_cmd(VirtIOBlockDataPlane *s, struct iovec *iov, unsigned int iov_cnt, - VirtQueueElement *elem, QEMUIOVector *inhdr) + VirtQueueElement *elem, + struct virtio_blk_inhdr *inhdr) { char id[VIRTIO_BLK_ID_BYTES]; @@ -120,7 +114,7 @@ static void do_get_id_cmd(VirtIOBlockDataPlane *s, static void do_rdwr_cmd(VirtIOBlockDataPlane *s, bool read, struct iovec *iov, unsigned iov_cnt, int64_t sector_num, VirtQueueElement *elem, - QEMUIOVector *inhdr) + struct virtio_blk_inhdr *inhdr) { VirtIOBlock *dev = VIRTIO_BLK(s->vdev); VirtIOBlockReq *req = g_slice_new0(VirtIOBlockReq); @@ -129,8 +123,8 @@ static void do_rdwr_cmd(VirtIOBlockDataPlane *s, bool read, /* Fill in virtio block metadata needed for completion */ req->elem = elem; - req->inhdr = inhdr; req->dev = dev; + req->in = inhdr; qemu_iovec_init_external(&req->qiov, iov, iov_cnt); qiov = &req->qiov; @@ -157,24 +151,24 @@ static void complete_flush(void *opaque, int ret) status = VIRTIO_BLK_S_IOERR; } - complete_request_early(req->dev->dataplane, req->elem, req->inhdr, status); + complete_request_early(req->dev->dataplane, req->elem, req->in, status); g_slice_free(VirtIOBlockReq, req); } static void do_flush_cmd(VirtIOBlockDataPlane *s, VirtQueueElement *elem, - QEMUIOVector *inhdr) + struct virtio_blk_inhdr *inhdr) { VirtIOBlock *dev = VIRTIO_BLK(s->vdev); VirtIOBlockReq *req = g_slice_new0(VirtIOBlockReq); req->dev = dev; req->elem = elem; - req->inhdr = inhdr; + req->in = inhdr; bdrv_aio_flush(s->blk->conf.bs, complete_flush, req); } static void do_scsi_cmd(VirtIOBlockDataPlane *s, VirtQueueElement *elem, - QEMUIOVector *inhdr) + struct virtio_blk_inhdr *inhdr) { int status; @@ -189,8 +183,7 @@ static int process_request(VirtIOBlockDataPlane *s, VirtQueueElement *elem) unsigned out_num = elem->out_num; unsigned in_num = elem->in_num; struct virtio_blk_outhdr outhdr; - QEMUIOVector *inhdr; - size_t in_size; + struct virtio_blk_inhdr *inhdr; /* Copy in outhdr */ if (unlikely(iov_to_buf(iov, out_num, 0, &outhdr, @@ -200,17 +193,16 @@ static int process_request(VirtIOBlockDataPlane *s, VirtQueueElement *elem) } iov_discard_front(&iov, &out_num, sizeof(outhdr)); - /* Grab inhdr for later */ - in_size = iov_size(in_iov, in_num); - if (in_size < sizeof(struct virtio_blk_inhdr)) { - error_report("virtio_blk request inhdr too short"); + /* We are likely safe with the iov_len check, because inhdr is only 1 byte, + * but checking here in case the header gets bigger in the future. */ + if (in_num < 1 || in_iov[in_num - 1].iov_len < sizeof(*inhdr)) { + error_report("virtio-blk request inhdr too short"); return -EFAULT; } - inhdr = g_slice_new(QEMUIOVector); - qemu_iovec_init(inhdr, 1); - qemu_iovec_concat_iov(inhdr, in_iov, in_num, - in_size - sizeof(struct virtio_blk_inhdr), - sizeof(struct virtio_blk_inhdr)); + + /* Grab inhdr for later */ + inhdr = (void *)in_iov[in_num - 1].iov_base + + in_iov[in_num - 1].iov_len - sizeof(*inhdr); iov_discard_back(in_iov, &in_num, sizeof(struct virtio_blk_inhdr)); /* TODO Linux sets the barrier bit even when not advertised! */ @@ -243,8 +235,6 @@ static int process_request(VirtIOBlockDataPlane *s, VirtQueueElement *elem) default: error_report("virtio-blk unsupported request type %#x", outhdr.type); - qemu_iovec_destroy(inhdr); - g_slice_free(QEMUIOVector, inhdr); return -EFAULT; } } diff --git a/include/hw/virtio/virtio-blk.h b/include/hw/virtio/virtio-blk.h index 4211cd6..b495e42 100644 --- a/include/hw/virtio/virtio-blk.h +++ b/include/hw/virtio/virtio-blk.h @@ -142,10 +142,6 @@ typedef struct VirtIOBlockReq { QEMUIOVector qiov; struct VirtIOBlockReq *next; BlockAcctCookie acct; - -#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE - QEMUIOVector *inhdr; /* iovecs for virtio_blk_inhdr */ -#endif } VirtIOBlockReq; #define DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \