Linux Documentation
 help / color / mirror / Atom feed
From: "Yanjun.Zhu" <yanjun.zhu@linux.dev>
To: Vipin Sharma <vipinsh@google.com>,
	kexec@lists.infradead.org, linux-kernel@vger.kernel.org,
	linux-doc@vger.kernel.org, kvm@vger.kernel.org,
	linux-mm@kvack.org, linux-kselftest@vger.kernel.org,
	Zhu Yanjun <yanjun.zhu@linux.dev>
Cc: ajayachandra@nvidia.com, alex@shazbot.org, amastro@fb.com,
	ankita@nvidia.com, apopple@nvidia.com, bhelgaas@google.com,
	chrisl@kernel.org, christian.koenig@amd.com, corbet@lwn.net,
	dmatlack@google.com, graf@amazon.com,
	jacob.pan@linux.microsoft.com, jgg@nvidia.com, jgg@ziepe.ca,
	jrhilke@google.com, julianr@linux.ibm.com, kees@kernel.org,
	kevin.tian@intel.com, leon@kernel.org, leonro@nvidia.com,
	lukas@wunner.de, mattev@meta.com, michal.winiarski@intel.com,
	parav@nvidia.com, pasha.tatashin@soleen.com, praan@google.com,
	pratyush@kernel.org, rananta@google.com, rientjes@google.com,
	rodrigo.vivi@intel.com, rppt@kernel.org, saeedm@nvidia.com,
	schnelle@linux.ibm.com, skhan@linuxfoundation.org,
	skhawaja@google.com, vivek.kasireddy@intel.com, witu@nvidia.com,
	yi.l.liu@intel.com
Subject: Re: [PATCH v5 17/20] vfio: selftests: Add vfio_pci_liveupdate_kexec_test
Date: Tue, 4 Aug 2026 15:19:34 -0700	[thread overview]
Message-ID: <0556e2fc-3be5-4023-a9a4-8482fa8c88b2@linux.dev> (raw)
In-Reply-To: <20260714151505.3466855-18-vipinsh@google.com>


On 7/14/26 8:15 AM, Vipin Sharma wrote:
> Add a selftest to exercise preserving a vfio-pci device across a Live
> Update. For now the test is extremely simple and just verifies that the
> device file can be preserved and retrieved. In the future this test will
> be extended to verify more parts about device preservation as they are
> implemented.
>
> This test is added to TEST_GEN_PROGS_EXTENDED since it must be run
> manually along with a kexec.
>
> To run this test manually:
>
>   $ tools/testing/selftests/vfio/scripts/setup.sh 0000:00:04.0
>   $ tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test --stage 1 0000:00:04.0
>
>   $ kexec ...   # NOTE: Exact method will be distro-dependent
>
>   $ tools/testing/selftests/vfio/scripts/setup.sh 0000:00:04.0
>   $ tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test --stage 2 0000:00:04.0
Hi, Vipin

Thanks a lot for your help. I followed your suggestion, vfio-pci setup can
work.

The followings are the test result. In the step 3, after kexec, there are
some fails. I am not sure if these are known problem or not.

1. Before kexec command

+ modprobe -v vfio-pci
+ tools/testing/selftests/vfio/scripts/setup.sh 0000:00:04.0
+ echo "vfio-pci" > /sys/bus/pci/devices/0000:00:04.0/driver_override
+ echo "0000:00:04.0" > /sys/bus/pci/drivers/vfio-pci/bind
+ tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test --stage 1
0000:00:04.0
Preserving device in session
Preserving memfd of size 0x40100000 in session
# [STAGE 1] Forking persistent child to hold sessions...
# [STAGE 1] Child PID: 1236. Resources are pinned.
# [STAGE 1] You may now perform kexec reboot.
+ set +x

2. Run kexec command

3. After kexec command

+ echo "vfio-pci" > /sys/bus/pci/devices/0000:00:04.0/driver_override
+ echo "0000:00:04.0" > /sys/bus/pci/drivers/vfio-pci/bind
Checking open(/dev/vfio/devices/vfio0) fails  <--- I can confirm that the
/dev/vfio/devices/vfio0 exists. But open this failed.
Checking ioctl(group_fd, VFIO_GROUP_GET_DEVICE_FD, "0000:00:04.0") fails
(vfio_type1_iommu)      <--- fails
Checking ioctl(group_fd, VFIO_GROUP_GET_DEVICE_FD, "0000:00:04.0") fails
(vfio_type1v2_iommu).  <--- fails
Checking ioctl(group_fd, VFIO_GROUP_GET_DEVICE_FD, "0000:00:04.0") fails
(iommufd_compat_type1)  <--- fails
Checking ioctl(group_fd, VFIO_GROUP_GET_DEVICE_FD, "0000:00:04.0") fails
(iommufd_compat_type1v2). <--- fails
Retrieving memfd from LUO
Finishing the session before retrieving the device (should fail)
Retrieving the device FD from LUO
Finishing the session before binding to iommufd (should fail)
Binding the device to an iommufd and setting it up
Finishing the session

# lspci -vvv -s 0000:00:04.0
00:04.0 Unclassified device [00ff]: Red Hat, Inc. QEMU PCI Test Device
     Subsystem: Red Hat, Inc. QEMU Virtual Machine
     Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx+
     Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort-
<MAbort- >SERR- <PERR- INTx-
     IOMMU group: 16
     Region 0: Memory at fea23000 (32-bit, non-prefetchable) [size=4K]
     Region 1: I/O ports at c000 [size=256]
     Kernel driver in use: vfio-pci

Zhu Yanjun

>
> The second call to setup.sh is necessary because preserved devices are
> not bound to a driver after Live Update. Such devices must be manually
> bound by userspace after Live Update via driver_override.
>
> This test is considered passing if all commands exit with 0.
>
> Co-developed-by: David Matlack <dmatlack@google.com>
> Signed-off-by: David Matlack <dmatlack@google.com>
> Signed-off-by: Vipin Sharma <vipinsh@google.com>
> ---
>   tools/testing/selftests/vfio/Makefile         |  4 +
>   .../vfio/vfio_pci_liveupdate_kexec_test.c     | 89 +++++++++++++++++++
>   2 files changed, 93 insertions(+)
>   create mode 100644 tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test.c
>
> diff --git a/tools/testing/selftests/vfio/Makefile b/tools/testing/selftests/vfio/Makefile
> index 591f1a52c310..a2f0a459e1f4 100644
> --- a/tools/testing/selftests/vfio/Makefile
> +++ b/tools/testing/selftests/vfio/Makefile
> @@ -15,6 +15,10 @@ TEST_GEN_PROGS += vfio_pci_driver_test
>   TEST_GEN_PROGS += vfio_pci_sriov_uapi_test
>   TEST_GEN_PROGS += vfio_pci_liveupdate_uapi_test
>   
> +# This test must be run manually since it requires the user/automation to
> +# perform a kexec during the test.
> +TEST_GEN_PROGS_EXTENDED += vfio_pci_liveupdate_kexec_test
> +
>   TEST_FILES += scripts/cleanup.sh
>   TEST_FILES += scripts/lib.sh
>   TEST_FILES += scripts/run.sh
> diff --git a/tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test.c b/tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test.c
> new file mode 100644
> index 000000000000..15b3e3af91d1
> --- /dev/null
> +++ b/tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test.c
> @@ -0,0 +1,89 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +
> +#include <libliveupdate.h>
> +#include <libvfio.h>
> +
> +static const char *device_bdf;
> +
> +static char state_session[LIVEUPDATE_SESSION_NAME_LENGTH];
> +static char device_session[LIVEUPDATE_SESSION_NAME_LENGTH];
> +
> +enum {
> +	STATE_TOKEN,
> +	DEVICE_TOKEN,
> +};
> +
> +static void before_kexec(int luo_fd)
> +{
> +	struct vfio_pci_device *device;
> +	struct iommu *iommu;
> +	int session_fd;
> +	int ret;
> +
> +	iommu = iommu_init("iommufd");
> +	device = vfio_pci_device_init(device_bdf, iommu);
> +
> +	create_state_file(luo_fd, state_session, STATE_TOKEN, /*next_stage=*/2);
> +
> +	session_fd = luo_create_session(luo_fd, device_session);
> +	VFIO_ASSERT_GE(session_fd, 0);
> +
> +	printf("Preserving device in session\n");
> +	ret = luo_session_preserve_fd(session_fd, device->fd, DEVICE_TOKEN);
> +	VFIO_ASSERT_EQ(ret, 0);
> +
> +	close(luo_fd);
> +	daemonize_and_wait();
> +}
> +
> +static void after_kexec(int luo_fd, int state_session_fd)
> +{
> +	struct vfio_pci_device *device;
> +	struct iommu *iommu;
> +	int session_fd;
> +	int device_fd;
> +	int stage;
> +
> +	restore_and_read_stage(state_session_fd, STATE_TOKEN, &stage);
> +	VFIO_ASSERT_EQ(stage, 2);
> +
> +	session_fd = luo_retrieve_session(luo_fd, device_session);
> +	VFIO_ASSERT_GE(session_fd, 0);
> +
> +	printf("Finishing the session before retrieving the device (should fail)\n");
> +	VFIO_ASSERT_NE(luo_session_finish(session_fd), 0);
> +
> +	printf("Retrieving the device FD from LUO\n");
> +	device_fd = luo_session_retrieve_fd(session_fd, DEVICE_TOKEN);
> +	VFIO_ASSERT_GE(device_fd, 0);
> +
> +	printf("Finishing the session before binding to iommufd (should fail)\n");
> +	VFIO_ASSERT_NE(luo_session_finish(session_fd), 0);
> +
> +	printf("Binding the device to an iommufd and setting it up\n");
> +	iommu = iommu_init("iommufd");
> +
> +	/*
> +	 * This will invoke various ioctls on device_fd such as
> +	 * VFIO_DEVICE_GET_INFO. So this is a decent sanity test
> +	 * that LUO actually handed us back a valid VFIO device
> +	 * file and not something else.
> +	 */
> +	device = __vfio_pci_device_init(device_bdf, iommu, device_fd);
> +
> +	printf("Finishing the session\n");
> +	VFIO_ASSERT_EQ(luo_session_finish(session_fd), 0);
> +
> +	vfio_pci_device_cleanup(device);
> +	iommu_cleanup(iommu);
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	device_bdf = vfio_selftests_get_bdf(&argc, argv);
> +
> +	sprintf(device_session, "device-%s", device_bdf);
> +	sprintf(state_session, "state-%s", device_bdf);
> +
> +	return luo_test(argc, argv, state_session, before_kexec, after_kexec);
> +}

  parent reply	other threads:[~2026-08-04 22:20 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-14 15:14 [PATCH v5 00/20] vfio/pci: Base Live Update support for VFIO Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 01/20] vfio/pci: Factor out the reset logic in VFIO PCI device close path Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 02/20] vfio: Export various helpers from VFIO Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 03/20] vfio/pci: Export vfio_pci_dma_buf_move for vfio-pci module Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 04/20] liveupdate: Export symbols needed by modules Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 05/20] vfio/pci: Register a file handler with Live Update Orchestrator Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 06/20] vfio/pci: Preserve vfio-pci device files across Live Update Vipin Sharma
2026-07-21 23:16   ` Josh Hilke
2026-07-23 21:55     ` Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 07/20] vfio: Introduce vfio_find_device() helper Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 08/20] vfio: Refactor vfio_device_fops_cdev_open() Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 09/20] vfio: Add API to open cdev device for Live Update restore Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 10/20] vfio/pci: Retrieve preserved device files after Live Update Vipin Sharma
2026-07-21 16:23   ` Josh Hilke
2026-07-14 15:14 ` [PATCH v5 11/20] vfio: Enforce preserved devices are retrieved via LIVEUPDATE_SESSION_RETRIEVE_FD Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 12/20] docs: liveupdate: Add documentation for VFIO PCI Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 13/20] vfio: selftests: Build liveupdate library in VFIO selftests Vipin Sharma
2026-07-14 15:14 ` [PATCH v5 14/20] vfio: selftests: Add vfio_pci_liveupdate_uapi_test Vipin Sharma
2026-07-14 15:15 ` [PATCH v5 15/20] vfio: selftests: Initialize vfio_pci_device using a VFIO cdev FD Vipin Sharma
2026-07-14 15:15 ` [PATCH v5 16/20] vfio: selftests: Add Makefile support for TEST_GEN_PROGS_EXTENDED Vipin Sharma
2026-07-14 15:15 ` [PATCH v5 17/20] vfio: selftests: Add vfio_pci_liveupdate_kexec_test Vipin Sharma
2026-07-27  0:40   ` Zhu Yanjun
2026-07-28  5:34     ` Vipin Sharma
2026-08-04 22:19   ` Yanjun.Zhu [this message]
2026-08-05  6:02     ` Vipin Sharma
2026-07-14 15:15 ` [PATCH v5 18/20] vfio: selftests: Expose iommu_modes to tests Vipin Sharma
2026-07-14 15:15 ` [PATCH v5 19/20] vfio: selftests: Verify that opening VFIO device fails during Live Update Vipin Sharma
2026-07-14 15:15 ` [PATCH v5 20/20] vfio: selftests: Add continuous DMA to vfio_pci_liveupdate_kexec_test Vipin Sharma
     [not found] ` <2c03ac97-60a6-4352-a942-27dcebae8d22@linux.dev>
     [not found]   ` <8fd94fad-e457-4839-9e41-ae257a138bee@linux.dev>
2026-07-20 17:08     ` [PATCH v5 00/20] vfio/pci: Base Live Update support for VFIO Vipin Sharma
2026-07-23 22:18       ` Yanjun.Zhu
2026-07-23 23:01         ` Vipin Sharma
2026-07-23 22:58 ` Vipin Sharma
2026-08-05  6:04   ` Vipin Sharma

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0556e2fc-3be5-4023-a9a4-8482fa8c88b2@linux.dev \
    --to=yanjun.zhu@linux.dev \
    --cc=ajayachandra@nvidia.com \
    --cc=alex@shazbot.org \
    --cc=amastro@fb.com \
    --cc=ankita@nvidia.com \
    --cc=apopple@nvidia.com \
    --cc=bhelgaas@google.com \
    --cc=chrisl@kernel.org \
    --cc=christian.koenig@amd.com \
    --cc=corbet@lwn.net \
    --cc=dmatlack@google.com \
    --cc=graf@amazon.com \
    --cc=jacob.pan@linux.microsoft.com \
    --cc=jgg@nvidia.com \
    --cc=jgg@ziepe.ca \
    --cc=jrhilke@google.com \
    --cc=julianr@linux.ibm.com \
    --cc=kees@kernel.org \
    --cc=kevin.tian@intel.com \
    --cc=kexec@lists.infradead.org \
    --cc=kvm@vger.kernel.org \
    --cc=leon@kernel.org \
    --cc=leonro@nvidia.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=lukas@wunner.de \
    --cc=mattev@meta.com \
    --cc=michal.winiarski@intel.com \
    --cc=parav@nvidia.com \
    --cc=pasha.tatashin@soleen.com \
    --cc=praan@google.com \
    --cc=pratyush@kernel.org \
    --cc=rananta@google.com \
    --cc=rientjes@google.com \
    --cc=rodrigo.vivi@intel.com \
    --cc=rppt@kernel.org \
    --cc=saeedm@nvidia.com \
    --cc=schnelle@linux.ibm.com \
    --cc=skhan@linuxfoundation.org \
    --cc=skhawaja@google.com \
    --cc=vipinsh@google.com \
    --cc=vivek.kasireddy@intel.com \
    --cc=witu@nvidia.com \
    --cc=yi.l.liu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox