From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B135548B41; Tue, 18 Nov 2025 17:29:31 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 458D54028D; Tue, 18 Nov 2025 17:29:31 +0100 (CET) Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) by mails.dpdk.org (Postfix) with ESMTP id 8E2ED4027A for ; Tue, 18 Nov 2025 17:29:28 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1763483369; x=1795019369; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=yEBW9rb7BmmLFg/SrHzpPV03tBzjEGZP0pKEtbT8Kjo=; b=BkKSNzgdX8+ZqMaritS2mKT4FXHfdr053ECPvw2qYZgvSRpZ3QIUXIiH PGPvENnSidD+9393e3S4fynZwvVgMvDJXpGjck3sKZx5OmFeV0nqYSec3 L2izEn4zFAWfRsuBoXzLH5YDBcXXhNd3/BpE2MKk/OyPBFRkl/2tedlaD lcmzd8QSp18Zotwca9aXWNBJ5zPnBmQJ9ZakEP2fXYuVGsQ1+z6AoT67c /ivIcDbuX154jlE9oKe0ZUcp7ksynC9+qpHZdIpxVPzU3/C1IhGP/TES0 2K6CDZ29GDrtSnaanZxh69wAX2EiLzqnuEPNWGfHU+VxRvbkvaTIdrDkB g==; X-CSE-ConnectionGUID: zEmVJ3j3ThecyRIFODjzMw== X-CSE-MsgGUID: SUgQVFiWTzeao0ECYoj8+g== X-IronPort-AV: E=McAfee;i="6800,10657,11617"; a="65550580" X-IronPort-AV: E=Sophos;i="6.19,314,1754982000"; d="scan'208";a="65550580" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Nov 2025 08:29:27 -0800 X-CSE-ConnectionGUID: p1Qk1cSIRCWbQhsfXihHyQ== X-CSE-MsgGUID: lUo4/S1pS52Z7MWqPOSDXw== X-ExtLoop1: 1 Received: from silpixa00401119.ir.intel.com ([10.20.224.206]) by fmviesa003.fm.intel.com with ESMTP; 18 Nov 2025 08:29:26 -0800 From: Anatoly Burakov To: dev@dpdk.org Subject: [PATCH v3 00/20] Support VFIO cdev API in DPDK Date: Tue, 18 Nov 2025 16:29:01 +0000 Message-ID: X-Mailer: git-send-email 2.47.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This patchset introduces a major refactor of the VFIO subsystem in DPDK to support character device (cdev) interface introduced in Linux kernel, as well as make the API more streamlined and useful. The goal is to simplify device management, improve compatibility, and clarify API responsibilities. The following sections outline the key issues addressed by this patchset and the corresponding changes introduced. 1. Only group mode is supported =============================== Since kernel version 4.14.327 (LTS), VFIO supports the new character device (cdev)-based way of working with VFIO devices (otherwise known as IOMMUFD). This is a device-centric mode and does away with all the complexity regarding groups and IOMMU types, delegating it all to the kernel, and exposes a much simpler interface to userspace. The old group interface is still around, and will need to be kept in DPDK both for compatibility reasons, as well as supporting special cases (FSLMC bus, NBL driver, etc.). To enable this, VFIO is heavily refactored, so that the code can support both modes while relying on (mostly) common infrastructure. Note that the existing `rte_vfio_device_setup/release` model is fundamentally incompatible with cdev mode, because for custom container cases, the expected flow is that the user binds the IOMMU group (and thus, implicitly, the device itself) to a specific container using `rte_vfio_container_group_bind`, whereas this step is not needed for cdev as the device fd is assigned to the container straight away. Therefore, what we do instead is introduce a new API for container device assignment which, semantically, will assign a device to specified container, so that when it is mapped using `rte_pci_map_device`, the appropriate container is selected. Under the hood though, we essentially transition to getting device fd straight away at assign stage, so that by the time the PCI bus attempts to map the device, it is already mapped and we just return an fd. Additionally, a new `rte_vfio_get_mode` API is added for those cases that need some introspection into VFIO's internals, with three new modes: group (old-style), no-iommu (old-style but without IOMMU), and cdev (the new mode). Although no-IOMMU is technically a variant of group mode, the distinction is largely irrelevant to the user, as all usages of noiommu checks in our codebase are for deciding whether to use IOVA or PA, not anything to do with managing groups. The current plan for kernel community is to *not* introduce no-IOMMU cdev implementation, which is why this will be kept for compatibility for these use cases. There were other users of VFIO which relied on group API but only for convenience purposes; no actual VFIO functionality depended on those API's. Therefore, group API's are removed and, where appropriate, replaced with the new API's. List of removed API's: * `rte_vfio_get_group_fd` * `rte_vfio_clear_group` * `rte_vfio_container_group_bind` * `rte_vfio_container_group_unbind` * `rte_vfio_noiommu_is_enabled` (replaced by new mode API) 2. The API responsibilities aren't clear and bleed into each other ================================================================== Some API's do multiple things at once. In particular: * `rte_vfio_get_device_info` will setup the device * `rte_vfio_setup_device` will get device info These API's have been adjusted to do one thing only. v3: - Make API removal cleaner - Fix `get_group_num` usages to align with new API - Fix issues with function exports - Fix issues with `setup_device` returning old-style values in some cases v2: - Make the entire API internal - More aggressive API pruning, complete removal of group API - Fixed a bug in group mode where device could not be used - Better documentation and deprecation notice patches - Moved doc patches to beginning of patchset Anatoly Burakov (20): doc: add deprecation notice for VFIO API doc: add deprecation notice for vDPA driver API uapi: update to v6.17 and add iommufd.h vfio: make all functions internal vfio: split get device info from setup vfio: add container device assignment API net/nbl: do not use VFIO group bind API net/ntnic: use container device assignment API vdpa/ifc: use container device assignment API vdpa/nfp: use container device assignment API vdpa/sfc: use container device assignment API vhost: remove group-related API from drivers vfio: remove group-based API vfio: cleanup and refactor bus/pci: use the new VFIO mode API bus/fslmc: use the new VFIO mode API net/hinic3: use the new VFIO mode API net/ntnic: use the new VFIO mode API vfio: remove no-IOMMU check API vfio: introduce cdev mode config/arm/meson.build | 1 + config/meson.build | 1 + doc/guides/prog_guide/vhost_lib.rst | 4 - doc/guides/rel_notes/deprecation.rst | 7 + drivers/bus/cdx/cdx_vfio.c | 25 +- drivers/bus/fslmc/fslmc_bus.c | 10 +- drivers/bus/fslmc/fslmc_vfio.c | 6 +- drivers/bus/pci/linux/pci.c | 2 +- drivers/bus/pci/linux/pci_vfio.c | 33 +- drivers/bus/platform/platform.c | 9 +- drivers/crypto/bcmfs/bcmfs_vfio.c | 14 +- drivers/net/hinic3/base/hinic3_hwdev.c | 2 +- drivers/net/nbl/nbl_common/nbl_userdev.c | 20 +- drivers/net/nbl/nbl_include/nbl_include.h | 1 + drivers/net/ntnic/ntnic_ethdev.c | 2 +- drivers/net/ntnic/ntnic_vfio.c | 30 +- drivers/vdpa/ifc/ifcvf_vdpa.c | 34 +- drivers/vdpa/mlx5/mlx5_vdpa.c | 1 - drivers/vdpa/nfp/nfp_vdpa.c | 37 +- drivers/vdpa/sfc/sfc_vdpa.c | 39 +- drivers/vdpa/sfc/sfc_vdpa.h | 2 - kernel/linux/uapi/linux/iommufd.h | 1292 +++++++++++ kernel/linux/uapi/linux/vduse.h | 2 +- kernel/linux/uapi/linux/vfio.h | 12 +- kernel/linux/uapi/version | 2 +- lib/eal/freebsd/eal.c | 98 +- lib/eal/include/rte_vfio.h | 387 ++-- lib/eal/linux/eal_vfio.c | 2433 ++++++++------------- lib/eal/linux/eal_vfio.h | 167 +- lib/eal/linux/eal_vfio_cdev.c | 389 ++++ lib/eal/linux/eal_vfio_group.c | 983 +++++++++ lib/eal/linux/eal_vfio_mp_sync.c | 80 +- lib/eal/linux/meson.build | 2 + lib/eal/windows/eal.c | 4 +- lib/vhost/vdpa_driver.h | 3 - 35 files changed, 4266 insertions(+), 1868 deletions(-) create mode 100644 kernel/linux/uapi/linux/iommufd.h create mode 100644 lib/eal/linux/eal_vfio_cdev.c create mode 100644 lib/eal/linux/eal_vfio_group.c -- 2.47.3