From patchwork Wed Jul 5 21:50:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 9827221 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 374FD60351 for ; Wed, 5 Jul 2017 21:53:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BBE6F25223 for ; Wed, 5 Jul 2017 21:53:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B03902850D; Wed, 5 Jul 2017 21:53:41 +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 28BEF25223 for ; Wed, 5 Jul 2017 21:53:41 +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 1dSsCW-0003JA-DX; Wed, 05 Jul 2017 21:51:12 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dSsCV-0003GF-4K for xen-devel@lists.xen.org; Wed, 05 Jul 2017 21:51:11 +0000 Received: from [85.158.139.211] by server-16.bemta-5.messagelabs.com id 2B/7F-01712-E4F5D595; Wed, 05 Jul 2017 21:51:10 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpgkeJIrShJLcpLzFFi42I5NlE2Wdc3Pjb SYPUKTYslHxezODB6HN39mymAMYo1My8pvyKBNWPp73/sBdskKtZOvMjewHhXpIuRi0NIYB2T RF/LWcYuRk4OFgEHiZfT3zF3MXJwMArESDz4YQ0SZhQIk5h8eQkriM0mYCjx98kmNhBbREBa4 trny4wgc5gFJjNKvH73ixkkISxgJrHt+RRGkDksAqoSH55ZgoR5Bdwl3r6dBNYrISAncfLYZL CZnEDxM60LWSHuaWOU2Pv8B9MERt4FjAyrGDWKU4vKUot0jUz0kooy0zNKchMzc3QNDUz1clO LixPTU3MSk4r1kvNzNzECw6GegYFxB+PNyX6HGCU5mJREef/ox0YK8SXlp1RmJBZnxBeV5qQW H2KU4eBQkuAtiQPKCRalpqdWpGXmAAMTJi3BwaMkwrtaGCjNW1yQmFucmQ6ROsVozLFh9fovT ByvJvz/xiTEkpeflyolzisEMkkApDSjNA9uECxiLjHKSgnzMjIwMAjxFKQW5WaWoMq/YhTnYF QS5v0QCzSFJzOvBG7fK6BTmIBOUWyMATmlJBEhJdXAuOP/MScGp85rkdafZS4ppZhMyJ4s3DR V5mN+xuzbj58tlyt86C3iVx1YESpw683jWVIOHDcv1SvvX7tFzEC4kkPHscbOwutU3wbVWwYi +c6K5x9KBUS28+6wWxxxSzXjT+RS9cuu4id1/v/UPs3+Izd4g6ZPmfulo8bv2hV6xHnSHJxty 9SVWIozEg21mIuKEwF1t2NukwIAAA== X-Env-Sender: sstabellini@kernel.org X-Msg-Ref: server-3.tower-206.messagelabs.com!1499291468!97999916!1 X-Originating-IP: [198.145.29.99] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.4.25; banners=-,-,- X-VirusChecked: Checked Received: (qmail 17879 invoked from network); 5 Jul 2017 21:51:09 -0000 Received: from mail.kernel.org (HELO mail.kernel.org) (198.145.29.99) by server-3.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 5 Jul 2017 21:51:09 -0000 Received: from localhost.localdomain (162-198-228-33.lightspeed.wlfrct.sbcglobal.net [162.198.228.33]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A8C3A22BD4; Wed, 5 Jul 2017 21:51:07 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A8C3A22BD4 From: Stefano Stabellini To: xen-devel@lists.xen.org Date: Wed, 5 Jul 2017 14:50:57 -0700 Message-Id: <1499291458-30231-17-git-send-email-sstabellini@kernel.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1499291458-30231-1-git-send-email-sstabellini@kernel.org> References: <1499291458-30231-1-git-send-email-sstabellini@kernel.org> Cc: jgross@suse.com, Stefano Stabellini , boris.ostrovsky@oracle.com, sstabellini@kernel.org, linux-kernel@vger.kernel.org Subject: [Xen-devel] [PATCH v7 17/18] xen/pvcalls: implement write 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 When the other end notifies us that there is data to be written (pvcalls_back_conn_event), increment the io and write counters, and schedule the ioworker. Implement the write function called by ioworker by reading the data from the data ring, writing it to the socket by calling inet_sendmsg. Set out_error on error. Signed-off-by: Stefano Stabellini Reviewed-by: Juergen Gross CC: boris.ostrovsky@oracle.com CC: jgross@suse.com --- drivers/xen/pvcalls-back.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/drivers/xen/pvcalls-back.c b/drivers/xen/pvcalls-back.c index 970db9d..d6c4c4a 100644 --- a/drivers/xen/pvcalls-back.c +++ b/drivers/xen/pvcalls-back.c @@ -177,6 +177,64 @@ static void pvcalls_conn_back_read(void *opaque) static void pvcalls_conn_back_write(struct sock_mapping *map) { + struct pvcalls_data_intf *intf = map->ring; + struct pvcalls_data *data = &map->data; + struct msghdr msg; + struct kvec vec[2]; + RING_IDX cons, prod, size, array_size; + int ret; + + cons = intf->out_cons; + prod = intf->out_prod; + /* read the indexes before dealing with the data */ + virt_mb(); + + array_size = XEN_FLEX_RING_SIZE(map->ring_order); + size = pvcalls_queued(prod, cons, array_size); + if (size == 0) + return; + + memset(&msg, 0, sizeof(msg)); + msg.msg_flags |= MSG_DONTWAIT; + msg.msg_iter.type = ITER_KVEC|READ; + msg.msg_iter.count = size; + if (pvcalls_mask(prod, array_size) > pvcalls_mask(cons, array_size)) { + vec[0].iov_base = data->out + pvcalls_mask(cons, array_size); + vec[0].iov_len = size; + msg.msg_iter.kvec = vec; + msg.msg_iter.nr_segs = 1; + } else { + vec[0].iov_base = data->out + pvcalls_mask(cons, array_size); + vec[0].iov_len = array_size - pvcalls_mask(cons, array_size); + vec[1].iov_base = data->out; + vec[1].iov_len = size - vec[0].iov_len; + msg.msg_iter.kvec = vec; + msg.msg_iter.nr_segs = 2; + } + + atomic_set(&map->write, 0); + ret = inet_sendmsg(map->sock, &msg, size); + if (ret == -EAGAIN || (ret >= 0 && ret < size)) { + atomic_inc(&map->write); + atomic_inc(&map->io); + } + if (ret == -EAGAIN) + return; + + /* write the data, then update the indexes */ + virt_wmb(); + if (ret < 0) { + intf->out_error = ret; + } else { + intf->out_error = 0; + intf->out_cons = cons + ret; + prod = intf->out_prod; + } + /* update the indexes, then notify the other end */ + virt_wmb(); + if (prod != cons + ret) + atomic_inc(&map->write); + notify_remote_via_irq(map->irq); } static void pvcalls_back_ioworker(struct work_struct *work) @@ -845,6 +903,19 @@ static irqreturn_t pvcalls_back_event(int irq, void *dev_id) static irqreturn_t pvcalls_back_conn_event(int irq, void *sock_map) { + struct sock_mapping *map = sock_map; + struct pvcalls_ioworker *iow; + + if (map == NULL || map->sock == NULL || map->sock->sk == NULL || + map->sock->sk->sk_user_data != map) + return IRQ_HANDLED; + + iow = &map->ioworker; + + atomic_inc(&map->write); + atomic_inc(&map->io); + queue_work(iow->wq, &iow->register_work); + return IRQ_HANDLED; }