From patchwork Mon Mar 6 20:01:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 9607489 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 8F9416046A for ; Mon, 6 Mar 2017 20:04:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 722F7267EC for ; Mon, 6 Mar 2017 20:04:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 66D8228210; Mon, 6 Mar 2017 20:04:02 +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 D763D267EC for ; Mon, 6 Mar 2017 20:04:01 +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 1ckypM-0004Na-VG; Mon, 06 Mar 2017 20:01:52 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ckypL-0004Mg-K9 for xen-devel@lists.xenproject.org; Mon, 06 Mar 2017 20:01:51 +0000 Received: from [85.158.143.35] by server-9.bemta-6.messagelabs.com id 76/87-13095-E20CDB85; Mon, 06 Mar 2017 20:01:50 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpjkeJIrShJLcpLzFFi42I5NlG2Q1fnwN4 Ig0eXhSy+b5nM5MDocfjDFZYAxijWzLyk/IoE1ozzy3rYCk7IVFxdoNrAuEaii5GLQ0hgKqPE gq2PmCGcg0wSC46+Yu1i5ORgEzCU+PtkExuILSKgJHFv1WQmkCJmgbVMEru+7wErEhawljhx+ B9YEYuAqsS0F9+B4hwcvAJuEvtOuIKEJQTkJE4emwxWzingLtH/ZRorxLJ2RomuTd3sEEUZEv N65rBC2F4Si25cgrLVJK6e28Q8gZFvASPDKkb14tSistQiXSO9pKLM9IyS3MTMHF1DAzO93NT i4sT01JzEpGK95PzcTYzAMGEAgh2My/46HWKU5GBSEuV1W7Y3QogvKT+lMiOxOCO+qDQntfgQ owwHh5IEr9d+oJxgUWp6akVaZg4wYGHSEhw8SiK8wiBp3uKCxNzizHSI1ClGXY45s3e/YRJiy cvPS5US57UBKRIAKcoozYMbAYueS4yyUsK8jEBHCfEUpBblZpagyr9iFOdgVBLmFQeZwpOZVw K36RXQEUxAR2i7gh1RkoiQkmpgVLshlnLRzbpm4kUfpi9Lv7Pd2VnrYJj8aoosM7OPrrplbvO k6wZLZ9gtEz3xuGihkaVOx86lTekJy47uL9Ju0Qz7v17IZ0Nu7rnn9guF8wX3SNZ9nMx1vG1m yyntFy8viu1gX/TKeaJhJPP0M1997h3z2yvKXNk3/fKFd6UmylLLKvOKjed9VWIpzkg01GIuK k4EAPLEH06ZAgAA X-Env-Sender: sstabellini@kernel.org X-Msg-Ref: server-6.tower-21.messagelabs.com!1488830506!37890847!1 X-Originating-IP: [198.145.29.136] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 31078 invoked from network); 6 Mar 2017 20:01:48 -0000 Received: from mail.kernel.org (HELO mail.kernel.org) (198.145.29.136) by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 6 Mar 2017 20:01:48 -0000 Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 855C72012D; Mon, 6 Mar 2017 20:01:38 +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 ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E7A812015A; Mon, 6 Mar 2017 20:01:36 +0000 (UTC) From: Stefano Stabellini To: xen-devel@lists.xenproject.org Date: Mon, 6 Mar 2017 12:01:26 -0800 Message-Id: <1488830488-18506-5-git-send-email-sstabellini@kernel.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1488830488-18506-1-git-send-email-sstabellini@kernel.org> References: <1488830488-18506-1-git-send-email-sstabellini@kernel.org> X-Virus-Scanned: ClamAV using ClamSMTP Cc: jgross@suse.com, Latchesar Ionkov , sstabellini@kernel.org, Eric Van Hensbergen , linux-kernel@vger.kernel.org, Stefano Stabellini , v9fs-developer@lists.sourceforge.net, Ron Minnich , boris.ostrovsky@oracle.com Subject: [Xen-devel] [PATCH 5/7] xen/9pfs: send requests to the backend 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 Implement struct p9_trans_module create and close functions by looking at the available Xen 9pfs frontend-backend connections. We don't expect many frontend-backend connections, thus walking a list is OK. Send requests to the backend by copying each request to one of the available rings (each frontend-backend connection comes with multiple rings). Handle the ring and notifications following the 9pfs specification. If there are not enough free bytes on the ring for the request, wait on the wait_queue: the backend will send a notification after consuming more requests. Signed-off-by: Stefano Stabellini CC: boris.ostrovsky@oracle.com CC: jgross@suse.com CC: Eric Van Hensbergen CC: Ron Minnich CC: Latchesar Ionkov CC: v9fs-developer@lists.sourceforge.net --- net/9p/trans_xen.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/net/9p/trans_xen.c b/net/9p/trans_xen.c index 9f6cf8d..4e26556 100644 --- a/net/9p/trans_xen.c +++ b/net/9p/trans_xen.c @@ -47,22 +47,103 @@ struct xen_9pfs_front_priv { }; static LIST_HEAD(xen_9pfs_devs); +/* We don't currently allow canceling of requests */ static int p9_xen_cancel(struct p9_client *client, struct p9_req_t *req) { - return 0; + return 1; } static int p9_xen_create(struct p9_client *client, const char *addr, char *args) { + struct xen_9pfs_front_priv *priv = NULL; + + list_for_each_entry(priv, &xen_9pfs_devs, list) { + if (!strcmp(priv->tag, addr)) + break; + } + if (!priv || strcmp(priv->tag, addr)) + return -EINVAL; + + priv->client = client; return 0; } static void p9_xen_close(struct p9_client *client) { + struct xen_9pfs_front_priv *priv = NULL; + + list_for_each_entry(priv, &xen_9pfs_devs, list) { + if (priv->client == client) + break; + } + if (!priv || priv->client != client) + return; + + priv->client = NULL; + return; +} + +static int p9_xen_write_todo(struct xen_9pfs_dataring *ring, RING_IDX size) +{ + RING_IDX cons, prod; + + cons = ring->intf->out_cons; + prod = ring->intf->out_prod; + mb(); + + if (XEN_9PFS_RING_SIZE - xen_9pfs_queued(prod, cons, XEN_9PFS_RING_SIZE) >= size) + return 1; + else + return 0; } static int p9_xen_request(struct p9_client *client, struct p9_req_t *p9_req) { + struct xen_9pfs_front_priv *priv = NULL; + RING_IDX cons, prod, masked_cons, masked_prod; + unsigned long flags; + uint32_t size = p9_req->tc->size; + struct xen_9pfs_dataring *ring; + int num; + + list_for_each_entry(priv, &xen_9pfs_devs, list) { + if (priv->client == client) + break; + } + if (priv == NULL || priv->client != client) + return -EINVAL; + + num = p9_req->tc->tag % priv->num_rings; + ring = &priv->rings[num]; + +again: + while (wait_event_interruptible(ring->wq, + p9_xen_write_todo(ring, size) > 0) != 0); + + spin_lock_irqsave(&ring->lock, flags); + cons = ring->intf->out_cons; + prod = ring->intf->out_prod; + mb(); + + if (XEN_9PFS_RING_SIZE - xen_9pfs_queued(prod, cons, XEN_9PFS_RING_SIZE) < size) { + spin_unlock_irqrestore(&ring->lock, flags); + goto again; + } + + masked_prod = xen_9pfs_mask(prod, XEN_9PFS_RING_SIZE); + masked_cons = xen_9pfs_mask(cons, XEN_9PFS_RING_SIZE); + + xen_9pfs_write_packet(ring->ring.out, + &masked_prod, masked_cons, + XEN_9PFS_RING_SIZE, p9_req->tc->sdata, size); + + p9_req->status = REQ_STATUS_SENT; + wmb(); /* write ring before updating pointer */ + prod += size; + ring->intf->out_prod = prod; + spin_unlock_irqrestore(&ring->lock, flags); + notify_remote_via_irq(ring->irq); + return 0; }