From patchwork Mon Nov 28 21:27:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 9450471 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 24074600CB for ; Mon, 28 Nov 2016 21:29:50 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1603D27FA9 for ; Mon, 28 Nov 2016 21:29:50 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0856028068; Mon, 28 Nov 2016 21:29:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 744FD27FA9 for ; Mon, 28 Nov 2016 21:29:49 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cBTSa-0007lv-Td; Mon, 28 Nov 2016 21:27:36 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cBTSZ-0007lD-U6 for xen-devel@lists.xensource.com; Mon, 28 Nov 2016 21:27:36 +0000 Received: from [193.109.254.147] by server-9.bemta-6.messagelabs.com id EB/36-28694-741AC385; Mon, 28 Nov 2016 21:27:35 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrFLMWRWlGSWpSXmKPExsVybKJsh67bQps Ig53dahb3prxnd2D02N63iz2AMYo1My8pvyKBNePz516Wgl1yFXNvb2FsYGwU72Lk5BASmMoo sfFbZRcjF5C9nUnifMt2RpAEm4ChxN8nm9hAbBEBZYmmyT1gNrNAvUTDqmNgtrCAg8Tx++1AN gcHi4CqxMIDwiBhXgFXiS9rW8BKJATkJE4em8wKYnMKuEn8Wz2ZDWJXG6PE/ht/GCGKMiTm9c xhhbC9JBbduARlq0lcPbeJeQIj3wJGhlWMGsWpRWWpRbqG5npJRZnpGSW5iZk5uoYGZnq5qcX FiempOYlJxXrJ+bmbGIFhwgAEOxhvbww4xCjJwaQkyjvdzSZCiC8pP6UyI7E4I76oNCe1+BCj DAeHkgRv2wKgnGBRanpqRVpmDjBgYdISHDxKIrxdIGne4oLE3OLMdIjUKUZFKXFeF5CEAEgio zQPrg0WJZcYZaWEeRmBDhHiKUgtys0sQZV/xSjOwagkzNsLMoUnM68EbvoroMVMQIvfvrYGWV ySiJCSamBUe5N98Pm9T51LtlTXWRoz9LbqLM4yEbgV+FdEa1rlmpdRZ/7svswasFI+a108q61 U+MWrx48+XT+7+KWF4YoCoYtPj6u3OPEyZr720lmzbKFzVvymDmfniw987hxYaaKj6Wr808Hq 1qKaAsXLh649lmjiSfZdmP3gWoSnPVcvS3p7UKboVV4lluKMREMt5qLiRAD2O8ktjQIAAA== X-Env-Sender: sstabellini@kernel.org X-Msg-Ref: server-3.tower-27.messagelabs.com!1480368453!74222216!1 X-Originating-IP: [198.145.29.136] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 9.0.16; banners=-,-,- X-VirusChecked: Checked Received: (qmail 58440 invoked from network); 28 Nov 2016 21:27:34 -0000 Received: from mail.kernel.org (HELO mail.kernel.org) (198.145.29.136) by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 28 Nov 2016 21:27:34 -0000 Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EF1CC201EF; Mon, 28 Nov 2016 21:27:31 +0000 (UTC) Received: from sstabellini-ThinkPad-X260.hsd1.ca.comcast.net (96-82-76-110-static.hfc.comcastbusiness.net [96.82.76.110]) (using TLSv1.2 with cipher AES128-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 94A5A201CE; Mon, 28 Nov 2016 21:27:30 +0000 (UTC) From: Stefano Stabellini To: aneesh.kumar@linux.vnet.ibm.com Date: Mon, 28 Nov 2016 13:27:24 -0800 Message-Id: <1480368444-4310-4-git-send-email-sstabellini@kernel.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1480368444-4310-1-git-send-email-sstabellini@kernel.org> References: <1480368444-4310-1-git-send-email-sstabellini@kernel.org> X-Virus-Scanned: ClamAV using ClamSMTP Cc: xen-devel@lists.xensource.com, anthony.perard@citrix.com, sstabellini@kernel.org, groug@kaod.org, qemu-devel@nongnu.org Subject: [Xen-devel] [PATCH v2 4/4] 9pfs: introduce init_out/in_iov_from_pdu X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Not all 9pfs transports share memory between request and response. For those who don't, it is necessary to know how much memory is required in the response. Split the existing init_iov_from_pdu function in two: init_out_iov_from_pdu (for writes) and init_in_iov_from_pdu (for reads). init_in_iov_from_pdu takes an additional size parameter to specify the memory required for the response message. Signed-off-by: Stefano Stabellini Reviewed-by: Greg Kurz --- hw/9pfs/9p.c | 6 +++++- hw/9pfs/9p.h | 6 ++++-- hw/9pfs/virtio-9p-device.c | 28 ++++++++++++++++++---------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index 79d7201..ce1f9d9 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -1652,7 +1652,11 @@ static void v9fs_init_qiov_from_pdu(QEMUIOVector *qiov, V9fsPDU *pdu, struct iovec *iov; unsigned int niov; - pdu->s->transport->init_iov_from_pdu(pdu, &iov, &niov, is_write); + if (is_write) { + pdu->s->transport->init_out_iov_from_pdu(pdu, &iov, &niov); + } else { + pdu->s->transport->init_in_iov_from_pdu(pdu, &iov, &niov, size); + } qemu_iovec_init_external(&elem, iov, niov); qemu_iovec_init(qiov, niov); diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h index c8c9aa8..4c4feaf 100644 --- a/hw/9pfs/9p.h +++ b/hw/9pfs/9p.h @@ -349,8 +349,10 @@ struct V9fsTransport { va_list ap); ssize_t (*pdu_vunmarshal)(V9fsPDU *pdu, size_t offset, const char *fmt, va_list ap); - void (*init_iov_from_pdu)(V9fsPDU *pdu, struct iovec **piov, - unsigned int *pniov, bool is_write); + void (*init_in_iov_from_pdu)(V9fsPDU *pdu, struct iovec **piov, + unsigned int *pniov, size_t size); + void (*init_out_iov_from_pdu)(V9fsPDU *pdu, struct iovec **piov, + unsigned int *pniov); void (*push_and_notify)(V9fsPDU *pdu); }; diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index 273425b..27a4a32 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -171,26 +171,34 @@ static ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, return v9fs_iov_vunmarshal(elem->out_sg, elem->out_num, offset, 1, fmt, ap); } -static void virtio_init_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, - unsigned int *pniov, bool is_write) +/* The size parameter is used by other transports. Do not drop it. */ +static void virtio_init_in_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, + unsigned int *pniov, size_t size) { V9fsState *s = pdu->s; V9fsVirtioState *v = container_of(s, V9fsVirtioState, state); VirtQueueElement *elem = v->elems[pdu->idx]; - if (is_write) { - *piov = elem->out_sg; - *pniov = elem->out_num; - } else { - *piov = elem->in_sg; - *pniov = elem->in_num; - } + *piov = elem->in_sg; + *pniov = elem->in_num; +} + +static void virtio_init_out_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, + unsigned int *pniov) +{ + V9fsState *s = pdu->s; + V9fsVirtioState *v = container_of(s, V9fsVirtioState, state); + VirtQueueElement *elem = v->elems[pdu->idx]; + + *piov = elem->out_sg; + *pniov = elem->out_num; } static const struct V9fsTransport virtio_9p_transport = { .pdu_vmarshal = virtio_pdu_vmarshal, .pdu_vunmarshal = virtio_pdu_vunmarshal, - .init_iov_from_pdu = virtio_init_iov_from_pdu, + .init_in_iov_from_pdu = virtio_init_in_iov_from_pdu, + .init_out_iov_from_pdu = virtio_init_out_iov_from_pdu, .push_and_notify = virtio_9p_push_and_notify, };