From patchwork Thu Dec 22 06:04:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Wang X-Patchwork-Id: 35621 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp158796wrn; Wed, 21 Dec 2022 22:09:21 -0800 (PST) X-Google-Smtp-Source: AMrXdXvp6X0mzrM4R5iZmYbWFLHCKR++2SsrhiEvIDmfeOEZlaZB6aJ729vGYMB6Ai343R/9ow50 X-Received: by 2002:a17:907:8dcb:b0:840:c37d:b5e4 with SMTP id tg11-20020a1709078dcb00b00840c37db5e4mr3532250ejc.16.1671689361448; Wed, 21 Dec 2022 22:09:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671689361; cv=none; d=google.com; s=arc-20160816; b=g/vbC7SaPLwq8R95ZrREAbdYjkQANzziYKLu+tD1VCAhqRcQfaIdHdJ1yw6JEMIyJ0 R0WIHRHur9gzczwbjRvkzhwvgEeWn+DNNap3W8ONQQ8t/YBDK5QjvA51t1Mz6wtiBzdv Kx9oz4fLI1PX1K1NzoDhq5KcfzXZ7kEkd4kiBbx69+b9OzmyAawf/UqJB3MXPZ8K+Y1g 8b1ljUewZyzD/FyDVt8jlEQQLrRC3mxQImNSe053lzGXkWGqSe9OmSt0nSLdq4axMBuJ i0J5gKAAaktsXJOA5hdorfYYl+dzYza59g4GxSFBxVizCaeJfl7LQlfJ80Jo/hT3YmKe XgVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=2GAjzue+lH37a/kIqerHns/kcNXWyklxnd9w2RHR+MA=; b=R8lBFKhf7PGEzpvxB14fP3tFve61uDyokNot5PxYF45atvCUSB7DyO1Aop17TIJk/u VaWSiXYBGc5Jw5Ww7T3hP9I+80RKDwvk92i8GK/vI5Us0lAlhZZj7tQUVYTKvTy/2HaT lLgBDZR0Uzt2uzfC+y9SzHOcYfim5GA1xEIa+lzUgPcDVzByRHBHwAjY64JlH2+onRSK F0sftjY6JjDNqi0y6KEbWDhbSsYWAqSxCjNQZz3so7Gjvl3s9rw1LBJqRb5xcNN/CKBJ NxpbfqkYzP1XQdeN3K0V7ELjbKsdKuRTNRmrTtYlHpTS7PnVaCnF3VOhw+vysn+jTLk9 /5Ug== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=HBDvxq8N; 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: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id q17-20020a170906145100b00770872942d8si4112342ejc.958.2022.12.21.22.08.57; Wed, 21 Dec 2022 22:09:21 -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=HBDvxq8N; 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 S231892AbiLVGFo (ORCPT + 99 others); Thu, 22 Dec 2022 01:05:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47790 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235029AbiLVGFe (ORCPT ); Thu, 22 Dec 2022 01:05:34 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 828881AF3B for ; Wed, 21 Dec 2022 22:04:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1671689087; 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: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2GAjzue+lH37a/kIqerHns/kcNXWyklxnd9w2RHR+MA=; b=HBDvxq8NwmtzMx2Huu9JAOx9t09+ETQ8FM3BSW2x9yzQ//veWvZDRyAEqyyMfHFc2U9WeW yIv81hPaF3BYLvKTp9OVhxYAVPGifTBir2AQlVT9wvYYVv7sCqdj727vXkc2x1RzPkyrlE WKSXR8x1AULHxRWd/JTeUZwaaFu6bbM= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-244-0k2Bq0LPNM6I-TjiEhT1eQ-1; Thu, 22 Dec 2022 01:04:44 -0500 X-MC-Unique: 0k2Bq0LPNM6I-TjiEhT1eQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 9CD581C04B7A; Thu, 22 Dec 2022 06:04:43 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-179.pek2.redhat.com [10.72.13.179]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0DC3A112132C; Thu, 22 Dec 2022 06:04:36 +0000 (UTC) From: Jason Wang To: mst@redhat.com, jasowang@redhat.com 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 Subject: [RFC PATCH 1/4] virtio-net: convert rx mode setting to use workqueue Date: Thu, 22 Dec 2022 14:04:24 +0800 Message-Id: <20221222060427.21626-2-jasowang@redhat.com> In-Reply-To: <20221222060427.21626-1-jasowang@redhat.com> References: <20221222060427.21626-1-jasowang@redhat.com> MIME-Version: 1.0 Content-type: text/plain X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1752893343879386869?= X-GMAIL-MSGID: =?utf-8?q?1752893343879386869?= This patch convert rx mode setting to be done in a workqueue, this is a must for allow to sleep when waiting for the cvq command to response since current code is executed under addr spin lock. Signed-off-by: Jason Wang --- drivers/net/virtio_net.c | 64 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 86e52454b5b5..8225496ccb1e 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -260,6 +260,15 @@ struct virtnet_info { /* Work struct for config space updates */ struct work_struct config_work; + /* Work struct for config rx mode */ + struct work_struct rx_mode_work; + + /* Is rx_mode_work enabled? */ + bool rx_mode_work_enabled; + + /* The lock to synchronize the access to refill_enabled */ + spinlock_t rx_mode_lock; + /* Does the affinity hint is set for virtqueues? */ bool affinity_hint_set; @@ -383,6 +392,22 @@ static void disable_delayed_refill(struct virtnet_info *vi) spin_unlock_bh(&vi->refill_lock); } +static void enable_rx_mode_work(struct virtnet_info *vi) +{ + spin_lock_bh(&vi->rx_mode_lock); + vi->rx_mode_work_enabled = true; + spin_unlock_bh(&vi->rx_mode_lock); +} + +static void disable_rx_mode_work(struct virtnet_info *vi) +{ + spin_lock_bh(&vi->rx_mode_lock); + vi->rx_mode_work_enabled = false; + spin_unlock_bh(&vi->rx_mode_lock); + + flush_work(&vi->rx_mode_work); +} + static void virtqueue_napi_schedule(struct napi_struct *napi, struct virtqueue *vq) { @@ -2160,9 +2185,11 @@ static int virtnet_close(struct net_device *dev) return 0; } -static void virtnet_set_rx_mode(struct net_device *dev) +static void virtnet_rx_mode_work(struct work_struct *work) { - struct virtnet_info *vi = netdev_priv(dev); + struct virtnet_info *vi = + container_of(work, struct virtnet_info, rx_mode_work); + struct net_device *dev = vi->dev; struct scatterlist sg[2]; struct virtio_net_ctrl_mac *mac_data; struct netdev_hw_addr *ha; @@ -2175,8 +2202,12 @@ static void virtnet_set_rx_mode(struct net_device *dev) if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_RX)) return; + rtnl_lock(); + + netif_addr_lock_bh(dev); vi->ctrl->promisc = ((dev->flags & IFF_PROMISC) != 0); vi->ctrl->allmulti = ((dev->flags & IFF_ALLMULTI) != 0); + netif_addr_unlock_bh(dev); sg_init_one(sg, &vi->ctrl->promisc, sizeof(vi->ctrl->promisc)); @@ -2192,14 +2223,19 @@ static void virtnet_set_rx_mode(struct net_device *dev) dev_warn(&dev->dev, "Failed to %sable allmulti mode.\n", vi->ctrl->allmulti ? "en" : "dis"); + netif_addr_lock_bh(dev); + uc_count = netdev_uc_count(dev); mc_count = netdev_mc_count(dev); /* MAC filter - use one buffer for both lists */ buf = kzalloc(((uc_count + mc_count) * ETH_ALEN) + (2 * sizeof(mac_data->entries)), GFP_ATOMIC); mac_data = buf; - if (!buf) + if (!buf) { + netif_addr_unlock_bh(dev); + rtnl_unlock(); return; + } sg_init_table(sg, 2); @@ -2220,6 +2256,8 @@ static void virtnet_set_rx_mode(struct net_device *dev) netdev_for_each_mc_addr(ha, dev) memcpy(&mac_data->macs[i++][0], ha->addr, ETH_ALEN); + netif_addr_unlock_bh(dev); + sg_set_buf(&sg[1], mac_data, sizeof(mac_data->entries) + (mc_count * ETH_ALEN)); @@ -2227,9 +2265,21 @@ static void virtnet_set_rx_mode(struct net_device *dev) VIRTIO_NET_CTRL_MAC_TABLE_SET, sg)) dev_warn(&dev->dev, "Failed to set MAC filter table.\n"); + rtnl_unlock(); + kfree(buf); } +static void virtnet_set_rx_mode(struct net_device *dev) +{ + struct virtnet_info *vi = netdev_priv(dev); + + spin_lock(&vi->rx_mode_lock); + if (vi->rx_mode_work_enabled) + schedule_work(&vi->rx_mode_work); + spin_unlock(&vi->rx_mode_lock); +} + static int virtnet_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid) { @@ -3000,6 +3050,7 @@ static void virtnet_freeze_down(struct virtio_device *vdev) /* Make sure no work handler is accessing the device */ flush_work(&vi->config_work); + disable_rx_mode_work(vi); netif_tx_lock_bh(vi->dev); netif_device_detach(vi->dev); @@ -3022,6 +3073,8 @@ static int virtnet_restore_up(struct virtio_device *vdev) virtio_device_ready(vdev); enable_delayed_refill(vi); + enable_rx_mode_work(vi); + virtnet_set_rx_mode(vi->dev); if (netif_running(vi->dev)) { err = virtnet_open(vi->dev); @@ -3799,7 +3852,9 @@ static int virtnet_probe(struct virtio_device *vdev) vdev->priv = vi; INIT_WORK(&vi->config_work, virtnet_config_changed_work); + INIT_WORK(&vi->rx_mode_work, virtnet_rx_mode_work); spin_lock_init(&vi->refill_lock); + spin_lock_init(&vi->rx_mode_lock); if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) vi->mergeable_rx_bufs = true; @@ -3905,6 +3960,8 @@ static int virtnet_probe(struct virtio_device *vdev) if (vi->has_rss || vi->has_rss_hash_report) virtnet_init_default_rss(vi); + enable_rx_mode_work(vi); + /* serialize netdev register + virtio_device_ready() with ndo_open() */ rtnl_lock(); @@ -3984,6 +4041,7 @@ static void virtnet_remove(struct virtio_device *vdev) /* Make sure no work handler is accessing the device. */ flush_work(&vi->config_work); + disable_rx_mode_work(vi); unregister_netdev(vi->dev); From patchwork Thu Dec 22 06:04:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Wang X-Patchwork-Id: 35622 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp160402wrn; Wed, 21 Dec 2022 22:13:23 -0800 (PST) X-Google-Smtp-Source: AMrXdXsf/DdiGrDDbLVIxdrK50WbFNGDu1e4z9/7dWIAWh3DsQEpGpZHVOX7+IKfcb6zKokBvNSE X-Received: by 2002:a17:907:c296:b0:820:4046:1586 with SMTP id tk22-20020a170907c29600b0082040461586mr3382214ejc.12.1671689603444; Wed, 21 Dec 2022 22:13:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671689603; cv=none; d=google.com; s=arc-20160816; b=ups3zFY3df/eEJPhl8ZDfKNLuL7QmwbSFbQUc+PRi2mFyHh0cNHv1dcdGkz9U5O12h lo1a1x7XfznYuRSpI8m42OQ9nWRRc+U9cP0z36ctxKoqWNZ/nI2K+qz2ZvZizovP2mWq PzUflAc4o7qqca/YwNVMilbpy7s8jLIIQFEOGfCaApTImaYv4/EQ2lW+z+P73QKjm6le ovB1L+Tfu25dni76l4JSydQbYIN1c5wOu3cmQ0TeXNoHF5IXiJQCnoFzXrChRMJ44vFn SdxR753KCXxc7h8on0ns1dYRgEmzhbjYCuh61rRrVpKROhUdx7lzQIGCBKedI67ScQQr No+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=1rTeZDLahEEUIQy4wMRthdfJbzV+lOwcoNI4SggfJI8=; b=QBuefuJfYZrMGol1eOhsMjq/0P5Xz4boIjASpQwRyDgRhiV0VhwWrurEFz9TaCP2Tt XcLEM2RpKCrYefYev6//h7NvHoHyZRCImwrQfCTkueg1+G3Y60ByMxf0alxPf6VaHprK /Ez2DgT8dtT42m9WykkB/DufW97mTpogxF5tXN5gVANi2OrF7pnJFd8BumBYMskELPnC itFtdrXCp9G31S+Y+HCp5slAtBD5ZpiqKCpwqLjeUy79eJwYe6r0oKhl4E3o1OjwfDaE ec+nlM81ONHiXAIowjNO57gOmtLMb5SZoVV4iEvck96kMA4s/vwnIAL8V7g5Xz5owTI3 HFNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=R62w4Img; 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: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ho34-20020a1709070ea200b007ae2368c8b7si3378328ejc.138.2022.12.21.22.12.52; Wed, 21 Dec 2022 22:13:23 -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=R62w4Img; 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 S235055AbiLVGFs (ORCPT + 99 others); Thu, 22 Dec 2022 01:05:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47804 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235060AbiLVGFn (ORCPT ); Thu, 22 Dec 2022 01:05:43 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 71A391B1C0 for ; Wed, 21 Dec 2022 22:04:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1671689092; 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: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1rTeZDLahEEUIQy4wMRthdfJbzV+lOwcoNI4SggfJI8=; b=R62w4ImgynvjYrO7IgrIDcR2VDtZpEl+S4+8iqDsFZkGlcVbBS7eMDSJGc6NS3QAVxjW6+ DPXzl5TiHAd6nmPvsm0E29IkXV1mRJkfx8jqT2nSB1lfW3vcSz042Kes0u94WxrmrO/Y2M vZsaudRsAAVF4kofjO1/fGuFdUFJ+UI= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-152-V2twCnI5NIurCMkSOvZAzQ-1; Thu, 22 Dec 2022 01:04:49 -0500 X-MC-Unique: V2twCnI5NIurCMkSOvZAzQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DB30A29ABA2B; Thu, 22 Dec 2022 06:04:48 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-179.pek2.redhat.com [10.72.13.179]) by smtp.corp.redhat.com (Postfix) with ESMTP id 48B21112132C; Thu, 22 Dec 2022 06:04:43 +0000 (UTC) From: Jason Wang To: mst@redhat.com, jasowang@redhat.com 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 Subject: [RFC PATCH 2/4] virtio_ring: switch to use BAD_RING() Date: Thu, 22 Dec 2022 14:04:25 +0800 Message-Id: <20221222060427.21626-3-jasowang@redhat.com> In-Reply-To: <20221222060427.21626-1-jasowang@redhat.com> References: <20221222060427.21626-1-jasowang@redhat.com> MIME-Version: 1.0 Content-type: text/plain X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 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=unavailable 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1752893597605119480?= X-GMAIL-MSGID: =?utf-8?q?1752893597605119480?= Switch to reuse BAD_RING() to allow common logic to be implemented in BAD_RING(). Signed-off-by: Jason Wang --- drivers/virtio/virtio_ring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 2e7689bb933b..90c2034a77f3 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -2237,7 +2237,7 @@ bool virtqueue_notify(struct virtqueue *_vq) /* Prod other side to tell it about changes. */ if (!vq->notify(_vq)) { - vq->broken = true; + BAD_RING(vq, "vq %d is broken\n", vq->vq.index); return false; } return true; From patchwork Thu Dec 22 06:04:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Wang X-Patchwork-Id: 35623 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp160657wrn; Wed, 21 Dec 2022 22:14:20 -0800 (PST) X-Google-Smtp-Source: AMrXdXuT6FVB139CglkY2p29agWeF2I1SB8Hs4oXk0dnswQkbxr7oO5NGSCr5WtLj6uG1ZuDpJP8 X-Received: by 2002:a17:907:c306:b0:7fc:3fe0:6053 with SMTP id tl6-20020a170907c30600b007fc3fe06053mr4008827ejc.6.1671689660277; Wed, 21 Dec 2022 22:14:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671689660; cv=none; d=google.com; s=arc-20160816; b=QlcNPejLHK5GWKFNW/wn9KVMjwHQtci9dqu3LGrSrcg6f8Ea+iWeuDVP4fk1p18sZc IIsO4f3XThFl2dcx2zWL/sxSiLvB1p4OevZ7r7TVdJLk2Aqh5xSpg7gV3ra4JCEWTHW8 +LEa6AhbB2wTZMbnb72sApWcUedtEFFZBdOdVZMVGUC/WqoSI1IgnXuYJKEDBfEGmccH OBqAzd5/DmmN5p+2oWZGQ/zq4vK1Cc5acuu0S8m4DeKZCPPqMlDAX/5YvMW11SKUUh/w rF/l9pBTi3VwUNsywnUnObMAhxfNpnxT/eUstdSbd7+I67+m5fYbo0wYZrgzk416e8VD FisA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=3AagJqkYYDM80wKW6v4HoTlfL3zWbTRSgD3VOT9tZZo=; b=qq+u8gpIwkBKkPOm8+0j2Uwel7Uurk0xBjtwKbc8TBGAQOEsu7/Y5v+wDy6eCXVhHi T31tnv81h7CYoLPXGRP/vGSAraGKDygbS7YeRTgKmiwerz/jNhYOTRKFPwcxyk2mycPR +bUPoSva8kK67aR6kXNv/1PF2TaEk5BXgR6+PxOvTrs1T1Dy4HY1p94HrOtGX4+23jCy e+bH1Xt3zZoV+rlf5obj0thrhOGwl5eVPbc8ZyD3y5q9mum11UmC+88EyOSofhnoWe+a CMTaIpFZjs3UavLQNnmzP2Is1wN3q1ScmVe7o4XJILncWKIu7P+qFiv5mzYjcOyonCiN AyGA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=HCxcG1xf; 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: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id gs18-20020a170906f19200b007c14affc530si3811489ejb.315.2022.12.21.22.13.56; Wed, 21 Dec 2022 22:14:20 -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=HCxcG1xf; 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 S235096AbiLVGGU (ORCPT + 99 others); Thu, 22 Dec 2022 01:06:20 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47910 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235095AbiLVGGI (ORCPT ); Thu, 22 Dec 2022 01:06:08 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 50D2C1B7A9 for ; Wed, 21 Dec 2022 22:05:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1671689101; 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: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3AagJqkYYDM80wKW6v4HoTlfL3zWbTRSgD3VOT9tZZo=; b=HCxcG1xfGuIu2LKzja90HmGxsro640WzChF+SY3kSsgESNb0683x9Ce7wwQmRSFbzrf2NJ z3g2pnbtwRDRSe/4drPzChrRxXHsEXm411yD3yq/IWk2k5tSQrpMhTV6euqPz/FHxH1GJO Rqpvkjpdf/pTAcLYqivwvy9coiMjhlU= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-638-LoPDdRuFMEmvKTedKAP_YA-1; Thu, 22 Dec 2022 01:04:55 -0500 X-MC-Unique: LoPDdRuFMEmvKTedKAP_YA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2D0341C04B79; Thu, 22 Dec 2022 06:04:55 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-179.pek2.redhat.com [10.72.13.179]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8B80E112132C; Thu, 22 Dec 2022 06:04:49 +0000 (UTC) From: Jason Wang To: mst@redhat.com, jasowang@redhat.com 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 Subject: [RFC PATCH 3/4] virtio_ring: introduce a per virtqueue waitqueue Date: Thu, 22 Dec 2022 14:04:26 +0800 Message-Id: <20221222060427.21626-4-jasowang@redhat.com> In-Reply-To: <20221222060427.21626-1-jasowang@redhat.com> References: <20221222060427.21626-1-jasowang@redhat.com> MIME-Version: 1.0 Content-type: text/plain X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 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=unavailable 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1752893656823613244?= X-GMAIL-MSGID: =?utf-8?q?1752893656823613244?= 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 --- drivers/virtio/virtio_ring.c | 31 +++++++++++++++++++++++++++++++ include/linux/virtio.h | 4 ++++ 2 files changed, 35 insertions(+) diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 90c2034a77f3..4a2d5ac30b0f 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #ifdef DEBUG @@ -59,6 +60,7 @@ dev_err(&_vq->vq.vdev->dev, \ "%s:"fmt, (_vq)->vq.name, ##args); \ (_vq)->broken = true; \ + wake_up_interruptible(&(_vq)->wq); \ } while (0) #define START_USE(vq) #define END_USE(vq) @@ -202,6 +204,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; @@ -2023,6 +2028,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; @@ -2516,6 +2523,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); @@ -2653,6 +2662,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,24 @@ const struct vring *virtqueue_get_vring(struct virtqueue *vq) } EXPORT_SYMBOL_GPL(virtqueue_get_vring); +int virtqueue_wait_for_used(struct virtqueue *_vq, + unsigned int *len) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + /* Use a better timeout or simply start from no timeout */ + return wait_event_interruptible_timeout(vq->wq, + virtqueue_get_buf(_vq, len), + HZ); +} +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..4df098b8f1ca 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h @@ -72,6 +72,10 @@ 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, + unsigned int *len); +void virtqueue_wake_up(struct virtqueue *vq); + void virtqueue_disable_cb(struct virtqueue *vq); bool virtqueue_enable_cb(struct virtqueue *vq); From patchwork Thu Dec 22 06:04:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Wang X-Patchwork-Id: 35624 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp160893wrn; Wed, 21 Dec 2022 22:15:07 -0800 (PST) X-Google-Smtp-Source: AMrXdXuG30lxzEKDMFufMaqdKr+ohMApKzlbJE/9/ZVIKUMtDqnbWiDhQzsp+rCpjDLGlDzSc8Y3 X-Received: by 2002:a17:907:a508:b0:7c1:539b:d028 with SMTP id vr8-20020a170907a50800b007c1539bd028mr3552020ejc.48.1671689707479; Wed, 21 Dec 2022 22:15:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671689707; cv=none; d=google.com; s=arc-20160816; b=WY+rvCtR+e4h2mXp51x/8b2yiWyAnHl2+ZPMdsU33+D7xNdoo5SUWMO5bmTy+33V5N 6FTSkF8ytN0AkeXqYMCAbFiqSQyWuNba9y7FseMypUc2/HRI+ZsbFKcdEBDSrIKgOpJ4 Wnte6OI5ANmyA8+jLfN9e5N+5SpoMMq1t/8vPpK5K9Uov1IJg0tlCsBcaM2X1mC3XbCA p6cdqArkPuFfsBwQhvWXLwRKbSvKvuU1OwjRmxOrnvfPGDU5Lmj9ASpiZmCRxxs0HGlS XIc/NDfnWkq8VBJriz9zDzKUI3rTcKLcXnEA11AG3NfgvoQ9Tc2XgLgwC42iVfIUKxQT Gdlw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=iq4cHvbMQpVcmBqe5fyUmrngiKVykMmjcTZb1s9VM+M=; b=VY+CEoqGALLyOlLWVQnHV/uXialUwMPesY2Kvl81HoWWNXeX3YBjvaINcwPghDvTTQ fyyYImfI9qYb7elJByWELSGoOM1tlWzdLP8wUc0mLiFJbVgiQLCva6CHOGCRa0LIYC9m pIHl4QrTmK0xfaqQMlYy91yDNNrony60R+kFz/MXDrWnJZMeHczqZ9a1wsXDgaKmHYU7 pzeUiiN3Gym9woghR5i9t92O4w1wo5XFc2A3ZTzuFKlEhVrErZKBzQrS98TKT2zfDJkl Ocg0YmQ6Xsk5vVlRWVUAFdGeCsxJ0HVMpkAgmatETeYbwAjHViQhv1oFSFfCWPSggeZ7 j6GA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=XisQSdIj; 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: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id u13-20020a170906408d00b007c17d93ca62si4795937ejj.971.2022.12.21.22.14.44; Wed, 21 Dec 2022 22:15:07 -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=XisQSdIj; 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 S235174AbiLVGGe (ORCPT + 99 others); Thu, 22 Dec 2022 01:06:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47914 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235043AbiLVGGM (ORCPT ); Thu, 22 Dec 2022 01:06:12 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE38B1C93F for ; Wed, 21 Dec 2022 22:05:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1671689106; 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: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=iq4cHvbMQpVcmBqe5fyUmrngiKVykMmjcTZb1s9VM+M=; b=XisQSdIjVpfRAH0vj57/2guOh0iUndxVGfbCROpTSCm3ZGmGCql2UWF6NUsnEuPBFkb31f 1ktkaJgZRwEUyguCfmB4Y4zYFAiwz0dHK5+h/tklkkfOfZpaQUs1vG9veV7kY7LQa0ICdm WWWKt+B3uIszyhtd99gT5NH+nwbHVlI= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-456-A0Z1sWhoPamSGCtY6shq7w-1; Thu, 22 Dec 2022 01:05:02 -0500 X-MC-Unique: A0Z1sWhoPamSGCtY6shq7w-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 7C82F38149BC; Thu, 22 Dec 2022 06:05:02 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-179.pek2.redhat.com [10.72.13.179]) by smtp.corp.redhat.com (Postfix) with ESMTP id CC707112132C; Thu, 22 Dec 2022 06:04:55 +0000 (UTC) From: Jason Wang To: mst@redhat.com, jasowang@redhat.com 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 Subject: [RFC PATCH 4/4] virtio-net: sleep instead of busy waiting for cvq command Date: Thu, 22 Dec 2022 14:04:27 +0800 Message-Id: <20221222060427.21626-5-jasowang@redhat.com> In-Reply-To: <20221222060427.21626-1-jasowang@redhat.com> References: <20221222060427.21626-1-jasowang@redhat.com> MIME-Version: 1.0 Content-type: text/plain X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1752893706697797202?= X-GMAIL-MSGID: =?utf-8?q?1752893706697797202?= We used to busy waiting on the cvq command this tends to be problematic since: 1) CPU could wait for ever on a buggy/malicous device 2) There's no wait to terminate the process that triggers the cvq command So this patch switch to use sleep with a timeout (1s) instead of busy polling for the cvq command forever. This gives the scheduler a breath and can let the process can respond to a signal. Signed-off-by: Jason Wang --- drivers/net/virtio_net.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 8225496ccb1e..69173049371f 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -405,6 +405,7 @@ static void disable_rx_mode_work(struct virtnet_info *vi) vi->rx_mode_work_enabled = false; spin_unlock_bh(&vi->rx_mode_lock); + virtqueue_wake_up(vi->cvq); flush_work(&vi->rx_mode_work); } @@ -1497,6 +1498,11 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq, return !oom; } +static void virtnet_cvq_done(struct virtqueue *cvq) +{ + virtqueue_wake_up(cvq); +} + static void skb_recv_done(struct virtqueue *rvq) { struct virtnet_info *vi = rvq->vdev->priv; @@ -2024,12 +2030,7 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, if (unlikely(!virtqueue_kick(vi->cvq))) return vi->ctrl->status == VIRTIO_NET_OK; - /* Spin for a response, the kick causes an ioport write, trapping - * into the hypervisor, so the request should be handled immediately. - */ - while (!virtqueue_get_buf(vi->cvq, &tmp) && - !virtqueue_is_broken(vi->cvq)) - cpu_relax(); + virtqueue_wait_for_used(vi->cvq, &tmp); return vi->ctrl->status == VIRTIO_NET_OK; } @@ -3524,7 +3525,7 @@ static int virtnet_find_vqs(struct virtnet_info *vi) /* Parameters for control virtqueue, if any */ if (vi->has_cvq) { - callbacks[total_vqs - 1] = NULL; + callbacks[total_vqs - 1] = virtnet_cvq_done; names[total_vqs - 1] = "control"; }