From patchwork Thu Apr 16 02:29:32 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 2170 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1776306654; bh=29qExCDdbOB6Eq/Vv/voqWv8m9miop8VnHZK/VoFpJg=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=JNUQkbbvqfTRvORmVC5sdS8VgqbYr5zY0c0huJCLT89cPzuSyHnne9EfT4t1a+WOv 3FJuKg3latkPAaCWK/1uSx7MMjR+SdOq1GmHiYvh52DtMYuHaTdvZoJW3wGJ/NDf10 XAGo8nLBAmmBVMMO4F4vYQiOSK46XDNTtFiCLIds= Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 9053A6A4A9 for ; Wed, 15 Apr 2026 20:30:54 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id knwL6rC4wTCV for ; Wed, 15 Apr 2026 20:30:54 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1776306654; bh=29qExCDdbOB6Eq/Vv/voqWv8m9miop8VnHZK/VoFpJg=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=JNUQkbbvqfTRvORmVC5sdS8VgqbYr5zY0c0huJCLT89cPzuSyHnne9EfT4t1a+WOv 3FJuKg3latkPAaCWK/1uSx7MMjR+SdOq1GmHiYvh52DtMYuHaTdvZoJW3wGJ/NDf10 XAGo8nLBAmmBVMMO4F4vYQiOSK46XDNTtFiCLIds= Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 53F256A4AF for ; Wed, 15 Apr 2026 20:30:54 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1776306652; bh=cx50HyJ1YRGU5oz0xz1/tyUAQ6en7lofBpNwP3nRH4A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b87KVA6rns+XQAOIWtd640RgH98cGVQTXv3fZUU+jdOK2x8tIqjgx2si+6q3A6NCg DZDXbNW/+LgSZIJ4tp18JNyR0u9teoEvI2cyxJMOQg7vRkZwG2c8gr29XNfULVLyVF axiAofeKcNilv5mTu7sU1XNiaG8MOlQmFBWxDmDo= Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id AE3716A4A5; Wed, 15 Apr 2026 20:30:52 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id ikiMIwGp0NqW; Wed, 15 Apr 2026 20:30:52 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1776306650; bh=UzlS+QA8niHJr/9xcsqHENq80i22ThOgZr52lNQLB+w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=swa84sgmF4qJS9GE88Atpn/vFrGE9D4WD6TdOQr/7wJBgfzYpL9QQtxPgTrxGYf1/ +V5QG5eR5UETAs0WJkvXBB9XWmFbJJEO9sP3zgc/QEY18IFblwWOSPtoh8IWCTpauP uVFvrJLY7EpxF+T629pedVtW+bGiNCExY/ArmQdU= Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 01C626A4AF; Wed, 15 Apr 2026 20:30:49 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Wed, 15 Apr 2026 20:29:32 -0600 Message-ID: <20260416023021.626949-8-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260416023021.626949-1-sjg@u-boot.org> References: <20260416023021.626949-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: AFTAZYAA65QYATMV5PVBZUA5W7NZK7ID X-Message-ID-Hash: AFTAZYAA65QYATMV5PVBZUA5W7NZK7ID X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Simon Glass X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 07/33] virtio: Delete vqs when removing a device List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass The rng, net, blk and scsi drivers all use virtio_reset() as their remove() method. virtio_reset() only uses the transport's reset() operation, leaving the virtual queues still allocated (12 KB per virtqueue). Every probe/remove cycle of a virtio device therefore fails to free its queues. Add a remove() method to delete the queues before resetting. Update the four drivers to use it. Signed-off-by: Simon Glass --- drivers/virtio/virtio-uclass.c | 7 +++++++ drivers/virtio/virtio_blk.c | 2 +- drivers/virtio/virtio_net.c | 2 +- drivers/virtio/virtio_rng.c | 2 +- drivers/virtio/virtio_scsi.c | 2 +- include/virtio.h | 8 ++++++++ 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/virtio/virtio-uclass.c b/drivers/virtio/virtio-uclass.c index 86a5d8af66b..207002bd910 100644 --- a/drivers/virtio/virtio-uclass.c +++ b/drivers/virtio/virtio-uclass.c @@ -105,6 +105,13 @@ int virtio_reset(struct udevice *vdev) return ops->reset(vdev->parent); } +int virtio_remove(struct udevice *vdev) +{ + virtio_del_vqs(vdev); + + return virtio_reset(vdev); +} + int virtio_get_features(struct udevice *vdev, u64 *features) { struct dm_virtio_ops *ops; diff --git a/drivers/virtio/virtio_blk.c b/drivers/virtio/virtio_blk.c index 3dd0cf36268..236f807480e 100644 --- a/drivers/virtio/virtio_blk.c +++ b/drivers/virtio/virtio_blk.c @@ -222,7 +222,7 @@ U_BOOT_DRIVER(virtio_blk) = { .ops = &virtio_blk_ops, .bind = virtio_blk_bind, .probe = virtio_blk_probe, - .remove = virtio_reset, + .remove = virtio_remove, .priv_auto = sizeof(struct virtio_blk_priv), .flags = DM_FLAG_ACTIVE_DMA, }; diff --git a/drivers/virtio/virtio_net.c b/drivers/virtio/virtio_net.c index 7a94c8a528f..d49dab3a6ed 100644 --- a/drivers/virtio/virtio_net.c +++ b/drivers/virtio/virtio_net.c @@ -233,7 +233,7 @@ U_BOOT_DRIVER(virtio_net) = { .id = UCLASS_ETH, .bind = virtio_net_bind, .probe = virtio_net_probe, - .remove = virtio_reset, + .remove = virtio_remove, .ops = &virtio_net_ops, .priv_auto = sizeof(struct virtio_net_priv), .plat_auto = sizeof(struct eth_pdata), diff --git a/drivers/virtio/virtio_rng.c b/drivers/virtio/virtio_rng.c index 90a371a59cc..35e88266cb6 100644 --- a/drivers/virtio/virtio_rng.c +++ b/drivers/virtio/virtio_rng.c @@ -89,7 +89,7 @@ U_BOOT_DRIVER(virtio_rng) = { .id = UCLASS_RNG, .bind = virtio_rng_bind, .probe = virtio_rng_probe, - .remove = virtio_reset, + .remove = virtio_remove, .ops = &virtio_rng_ops, .priv_auto = sizeof(struct virtio_rng_priv), .flags = DM_FLAG_ACTIVE_DMA, diff --git a/drivers/virtio/virtio_scsi.c b/drivers/virtio/virtio_scsi.c index ee54f1c7449..185081640a7 100644 --- a/drivers/virtio/virtio_scsi.c +++ b/drivers/virtio/virtio_scsi.c @@ -243,7 +243,7 @@ U_BOOT_DRIVER(virtio_scsi) = { .priv_auto = sizeof(struct virtio_scsi_priv), .ops = &virtio_scsi_ops, .probe = virtio_scsi_probe, - .remove = virtio_reset, + .remove = virtio_remove, .bind = virtio_scsi_bind, .flags = DM_FLAG_ACTIVE_DMA, }; diff --git a/include/virtio.h b/include/virtio.h index ecbd16a98a7..b58ef880b4f 100644 --- a/include/virtio.h +++ b/include/virtio.h @@ -294,6 +294,14 @@ int virtio_set_status(struct udevice *vdev, u8 status); */ int virtio_reset(struct udevice *vdev); +/** + * virtio_remove() - remove a virtio device by deleting its vqs and resetting it + * + * @vdev: the real virtio device + * Return: 0 if OK, -ve on error + */ +int virtio_remove(struct udevice *vdev); + /** * virtio_get_features() - get the array of feature bits for this device *