Received: by 2002:a05:6358:16cc:b0:ea:6187:17c9 with SMTP id r12csp2703267rwl; Mon, 26 Dec 2022 20:55:58 -0800 (PST) X-Google-Smtp-Source: AMrXdXuNkjQXZA0mXsqy84GAkmW9zVdJziXavj7sWlckrre1Hi7kGlRJbJsNHp+Sh9qak4TTSP1C X-Received: by 2002:a17:902:bd87:b0:189:9a71:10a5 with SMTP id q7-20020a170902bd8700b001899a7110a5mr34290756pls.5.1672116958385; Mon, 26 Dec 2022 20:55:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672116958; cv=none; d=google.com; s=arc-20160816; b=HmR8V4nNsq2ZT6nXevVaxWEW+p4U9hdyUG/nadXj738wEcJ3jV+bGnEeae/hlNEEm7 mhoTYOWuKzcuQsNFbgiWPUzZ7PO9RScxGsGxeMcbsGkxxQxiHUtK23Ykw5A0dgcDJm/E T5CGbtIQxj3qYNPKPJr4Bf/TIhut/QXMhL5Mumw4/ttf3pyvOBqQrede+0ev5W0cbhMQ AklApyp6IH4SCVAWHZJhIx21RhLDhYKhgUiJvFaZNvHBU+zTwArDhMvG/m+Fu0NWrKvG a7d/tKqq5e7APSlGCS9P5NxRYMaD5FyMCQ/HAT0RzUNCRxP9rZC+4DyjZK1TT4bSHqjy q9nw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=+2iCB9qMVFrW7e1o/kg4F9WbtMs++mnsoQg+1UfY0k4=; b=iEqoPRJL6P7VWrLW25/KzomP+0l+S6zjRZ8ivutnfGbuXK4PNW7RVc+ccL1aWLBda0 P8n7BwSdj+IbPpVosdEWA2bbTJBKcCU5w30Yf7m0OXqzv6hAlyzI9gDSkNdHlKY9AgFW uMzxwlfRMUnRrv6Yv9ah1r8QIZrJhdYaIHBp1YL4HzoQeT8ozRtwrdyyMKth6Mi9F9hw IJU9Irr7Scs/27XFtaYoy3PkmprOEzPopvLSi53K/3sULUpb1Am4INDejn2DLxiuwObm D7WZS1EDVtSXfDSkfcteCxdDNkDLg+SjzSdVISjnwjJG5XMER59P2mtlzMmwspZqRLGc zpJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=iKd31PGg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 20-20020a631354000000b0049800401654si5430980pgt.348.2022.12.26.20.55.50; Mon, 26 Dec 2022 20:55:58 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=iKd31PGg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229969AbiL0Ebj (ORCPT + 66 others); Mon, 26 Dec 2022 23:31:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51808 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229824AbiL0Ebh (ORCPT ); Mon, 26 Dec 2022 23:31:37 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8D9E6D74 for ; Mon, 26 Dec 2022 20:30:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1672115449; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=+2iCB9qMVFrW7e1o/kg4F9WbtMs++mnsoQg+1UfY0k4=; b=iKd31PGgzPjlaUHAUaBGDr603kesGBjDzv08eQ1CQr54pjWT8ahhJtFCiX53V1MrBvddtv BvBzWZjxoU32t5Uo5dGD6hfRSCB78nan99XYvobxbwIUWx47hDFPUKCtIKTB6FMsOG2Gna dO/oUcCyfsaVQI8MY+9dQYS6FJQu/gI= Received: from mail-oa1-f69.google.com (mail-oa1-f69.google.com [209.85.160.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-21-452C1g6-OpK9Sm4Vxx6g4A-1; Mon, 26 Dec 2022 23:30:47 -0500 X-MC-Unique: 452C1g6-OpK9Sm4Vxx6g4A-1 Received: by mail-oa1-f69.google.com with SMTP id 586e51a60fabf-14fc276964bso2871584fac.11 for ; Mon, 26 Dec 2022 20:30:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+2iCB9qMVFrW7e1o/kg4F9WbtMs++mnsoQg+1UfY0k4=; b=IE8EmKoF/U9CCq+sKEOTBTx9RKOc66uPfcB8se67dfg8IqKHoW3E+u3RpqMqnEebhx HHBKjQb/1mmBDWTx5tTp2AhYcJMxVG/5dbIH6KmQ84PF3RF7DYRbLbnzONY7gSuxE4GD Wmv7AyYhYyaniKqL3viS1+/P91kZK3mM3Cg7hHwu8RpqUnGtHLpnBittxHNoRvBICFbO lg5qoLBykBnog7RVDuR+Y9lhy+6V43o/xT3jnsq8a9g5AXgeQBd7JLKXlJHkPhsnIOjF 9S/caHT9CWEnhEzmNsJcQMML2ZdF/FfFHuW2rLXU5JCh6/mJa20braqksMXtOvl4qde1 Ambg== X-Gm-Message-State: AFqh2kru5r6bxujQF/ZUwV6Gpg+aMI+EPGsdbIzHZV0lTx9BhYIUt/hf qtEYYc4ilQYJEgXB1HnGxpG31nJtzXAmFKngZYIS5vIjYp2gNWslKHgKP1KQEArbsUxtKASuZhw RwdiY6G6Pp6VM0YsnAflT2gYrbJnf6nHXDsaHoR/t X-Received: by 2002:a05:6870:4413:b0:144:a97b:1ae2 with SMTP id u19-20020a056870441300b00144a97b1ae2mr999609oah.35.1672115447092; Mon, 26 Dec 2022 20:30:47 -0800 (PST) X-Received: by 2002:a05:6870:4413:b0:144:a97b:1ae2 with SMTP id u19-20020a056870441300b00144a97b1ae2mr999605oah.35.1672115446770; Mon, 26 Dec 2022 20:30:46 -0800 (PST) MIME-Version: 1.0 References: <20221226074908.8154-1-jasowang@redhat.com> <20221226074908.8154-4-jasowang@redhat.com> <20221226183705-mutt-send-email-mst@kernel.org> In-Reply-To: <20221226183705-mutt-send-email-mst@kernel.org> From: Jason Wang Date: Tue, 27 Dec 2022 12:30:35 +0800 Message-ID: Subject: Re: [PATCH 3/4] virtio_ring: introduce a per virtqueue waitqueue To: "Michael S. Tsirkin" Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, maxime.coquelin@redhat.com, alvaro.karsz@solid-run.com, eperezma@redhat.com Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Dec 27, 2022 at 7:38 AM Michael S. Tsirkin wrote: > > On Mon, Dec 26, 2022 at 03:49:07PM +0800, Jason Wang wrote: > > This patch introduces a per virtqueue waitqueue to allow driver to > > sleep and wait for more used. Two new helpers are introduced to allow > > driver to sleep and wake up. > > > > Signed-off-by: Jason Wang > > --- > > Changes since V1: > > - check virtqueue_is_broken() as well > > - use more_used() instead of virtqueue_get_buf() to allow caller to > > get buffers afterwards > > --- > > drivers/virtio/virtio_ring.c | 29 +++++++++++++++++++++++++++++ > > include/linux/virtio.h | 3 +++ > > 2 files changed, 32 insertions(+) > > > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > > index 5cfb2fa8abee..9c83eb945493 100644 > > --- a/drivers/virtio/virtio_ring.c > > +++ b/drivers/virtio/virtio_ring.c > > @@ -13,6 +13,7 @@ > > #include > > #include > > #include > > +#include > > #include > > > > #ifdef DEBUG > > @@ -60,6 +61,7 @@ > > "%s:"fmt, (_vq)->vq.name, ##args); \ > > /* Pairs with READ_ONCE() in virtqueue_is_broken(). */ \ > > WRITE_ONCE((_vq)->broken, true); \ > > + wake_up_interruptible(&(_vq)->wq); \ > > } while (0) > > #define START_USE(vq) > > #define END_USE(vq) > > @@ -203,6 +205,9 @@ struct vring_virtqueue { > > /* DMA, allocation, and size information */ > > bool we_own_ring; > > > > + /* Wait for buffer to be used */ > > + wait_queue_head_t wq; > > + > > #ifdef DEBUG > > /* They're supposed to lock for us. */ > > unsigned int in_use; > > @@ -2024,6 +2029,8 @@ static struct virtqueue *vring_create_virtqueue_packed( > > if (virtio_has_feature(vdev, VIRTIO_F_ORDER_PLATFORM)) > > vq->weak_barriers = false; > > > > + init_waitqueue_head(&vq->wq); > > + > > err = vring_alloc_state_extra_packed(&vring_packed); > > if (err) > > goto err_state_extra; > > @@ -2517,6 +2524,8 @@ static struct virtqueue *__vring_new_virtqueue(unsigned int index, > > if (virtio_has_feature(vdev, VIRTIO_F_ORDER_PLATFORM)) > > vq->weak_barriers = false; > > > > + init_waitqueue_head(&vq->wq); > > + > > err = vring_alloc_state_extra_split(vring_split); > > if (err) { > > kfree(vq); > > @@ -2654,6 +2663,8 @@ static void vring_free(struct virtqueue *_vq) > > { > > struct vring_virtqueue *vq = to_vvq(_vq); > > > > + wake_up_interruptible(&vq->wq); > > + > > if (vq->we_own_ring) { > > if (vq->packed_ring) { > > vring_free_queue(vq->vq.vdev, > > @@ -2863,4 +2874,22 @@ const struct vring *virtqueue_get_vring(struct virtqueue *vq) > > } > > EXPORT_SYMBOL_GPL(virtqueue_get_vring); > > > > +int virtqueue_wait_for_used(struct virtqueue *_vq) > > +{ > > + struct vring_virtqueue *vq = to_vvq(_vq); > > + > > + /* TODO: Tweak the timeout. */ > > + return wait_event_interruptible_timeout(vq->wq, > > + virtqueue_is_broken(_vq) || more_used(vq), HZ); > > BTW undocumented that you also make it interruptible. > So if we get an interrupt then this will fail. Yes, this is sub-optimal. > But device is still going and will later use the buffers. > > Same for timeout really. Avoiding infinite wait/poll is one of the goals, another is to sleep. If we think the timeout is hard, we can start from the wait. Thanks > > > > > +} > > +EXPORT_SYMBOL_GPL(virtqueue_wait_for_used); > > + > > +void virtqueue_wake_up(struct virtqueue *_vq) > > +{ > > + struct vring_virtqueue *vq = to_vvq(_vq); > > + > > + wake_up_interruptible(&vq->wq); > > +} > > +EXPORT_SYMBOL_GPL(virtqueue_wake_up); > > + > > MODULE_LICENSE("GPL"); > > diff --git a/include/linux/virtio.h b/include/linux/virtio.h > > index dcab9c7e8784..2eb62c774895 100644 > > --- a/include/linux/virtio.h > > +++ b/include/linux/virtio.h > > @@ -72,6 +72,9 @@ void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len); > > void *virtqueue_get_buf_ctx(struct virtqueue *vq, unsigned int *len, > > void **ctx); > > > > +int virtqueue_wait_for_used(struct virtqueue *vq); > > +void virtqueue_wake_up(struct virtqueue *vq); > > + > > void virtqueue_disable_cb(struct virtqueue *vq); > > > > bool virtqueue_enable_cb(struct virtqueue *vq); > > -- > > 2.25.1 >