Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753533AbdCHN7y convert rfc822-to-8bit (ORCPT ); Wed, 8 Mar 2017 08:59:54 -0500 Received: from userp1050.oracle.com ([156.151.31.82]:31153 "EHLO userp1050.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753234AbdCHN7d (ORCPT ); Wed, 8 Mar 2017 08:59:33 -0500 Subject: Re: [PATCH 5/7] xen/9pfs: send requests to the backend To: Stefano Stabellini References: <1488830488-18506-1-git-send-email-sstabellini@kernel.org> <1488830488-18506-5-git-send-email-sstabellini@kernel.org> <5351d729-6b53-aa30-55e8-dd3f55324831@oracle.com> Cc: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, Stefano Stabellini , jgross@suse.com, Eric Van Hensbergen , Ron Minnich , Latchesar Ionkov , v9fs-developer@lists.sourceforge.net From: Boris Ostrovsky Message-ID: Date: Wed, 8 Mar 2017 08:58:12 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8BIT X-Source-IP: userp1040.oracle.com [156.151.31.81] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2024 Lines: 70 >>> +} >>> + >>> +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) { >> >> This looks like p9_xen_write_todo(). > p9_xen_write_todo is just a wrapper around xen_9pfs_queued to provide > a return value that works well with wait_event_interruptible. > > I would prefer not to call p9_xen_write_todo here, because it's simpler > if we don't read prod and cons twice. I was referring to the whole code fragment after spin_lock_irqsave(), not just the last line. Isn't it exactly !p9_xen_write_todo()? > > >> BTW, where is xen_9pfs_queued() >> defined? I couldn't find it. Same for xen_9pfs_mask() and >> xen_9pfs_write_packet(). > They are provided by the new ring macros, see > include/xen/interface/io/ring.h (the first patch). Oh, right. I was searching for the string literally. -boris