[PATCH v19 21/26] vfio: add some check on input parameters
David Marchand
david.marchand at redhat.com
Wed Oct 7 09:31:59 CEST 2026
From: Anatoly Burakov <anatoly.burakov at intel.com>
Make error handling more consistent, and provide/document rte_errno values
returned from API's to indicate various conditions.
Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
Signed-off-by: David Marchand <david.marchand at redhat.com>
---
lib/eal/linux/eal_vfio.c | 33 ++++++++++++-
lib/eal/linux/include/dev_vfio.h | 84 +++++++++++++++++---------------
2 files changed, 78 insertions(+), 39 deletions(-)
diff --git a/lib/eal/linux/eal_vfio.c b/lib/eal/linux/eal_vfio.c
index bd267d1796..d4a165464f 100644
--- a/lib/eal/linux/eal_vfio.c
+++ b/lib/eal/linux/eal_vfio.c
@@ -29,6 +29,12 @@
#define VFIO_MEM_EVENT_CLB_NAME "vfio_mem_event_clb"
+/*
+ * rte_errno convention:
+ *
+ * - EINVAL: invalid parameters
+ */
+
/* per-process VFIO config */
static struct vfio_container vfio_containers[RTE_MAX_VFIO_CONTAINERS];
@@ -755,6 +761,11 @@ dev_vfio_setup_device(const char *sysfs_base, const char *dev_addr, int *vfio_de
const struct internal_config *internal_conf =
eal_get_internal_configuration();
+ if (sysfs_base == NULL || dev_addr == NULL || vfio_dev_fd == NULL) {
+ rte_errno = EINVAL;
+ return -1;
+ }
+
if (!vfio_enabled)
return -1;
@@ -986,6 +997,11 @@ dev_vfio_release_device(const char *sysfs_base, const char *dev_addr,
int iommu_group_num;
int ret;
+ if (sysfs_base == NULL || dev_addr == NULL) {
+ rte_errno = EINVAL;
+ return -1;
+ }
+
if (!vfio_enabled)
return -1;
@@ -1177,10 +1193,15 @@ dev_vfio_get_device_info(int vfio_dev_fd, struct vfio_device_info *device_info)
{
int ret;
+ if (device_info == NULL) {
+ rte_errno = EINVAL;
+ return -1;
+ }
+
if (!vfio_enabled)
return -1;
- if (device_info == NULL || vfio_dev_fd < 0)
+ if (vfio_dev_fd < 0)
return -1;
ret = ioctl(vfio_dev_fd, VFIO_DEVICE_GET_INFO, device_info);
@@ -1291,6 +1312,11 @@ dev_vfio_get_group_num(const char *sysfs_base,
char *tok[16], *group_tok, *end;
int ret;
+ if (sysfs_base == NULL || dev_addr == NULL || iommu_group_num == NULL) {
+ rte_errno = EINVAL;
+ return -1;
+ }
+
if (!vfio_enabled)
return -1;
@@ -1610,6 +1636,11 @@ dev_vfio_container_assign_device(int vfio_container_fd, const char *sysfs_base,
int iommu_group_num;
int ret;
+ if (sysfs_base == NULL || dev_addr == NULL) {
+ rte_errno = EINVAL;
+ return -1;
+ }
+
ret = dev_vfio_get_group_num(sysfs_base, dev_addr, &iommu_group_num);
if (ret < 0) {
EAL_LOG(ERR, "Cannot get IOMMU group number for device %s", dev_addr);
diff --git a/lib/eal/linux/include/dev_vfio.h b/lib/eal/linux/include/dev_vfio.h
index 08f4c902e7..b3bf1ed7eb 100644
--- a/lib/eal/linux/include/dev_vfio.h
+++ b/lib/eal/linux/include/dev_vfio.h
@@ -48,43 +48,46 @@ enum dev_vfio_module {
/**
* @internal
- * Setup vfio_cfg for the device identified by its address.
- * It discovers the configured I/O MMU groups or sets a new one for the device.
- * If a new groups is assigned, the DMA mapping is performed.
+ * Set up a device managed by VFIO driver.
*
- * @param sysfs_base
- * sysfs path prefix.
+ * If the device was not previously assigned to a container using
+ * `dev_vfio_container_assign_device()`, default container will be used.
*
+ * @param sysfs_base
+ * Sysfs path prefix.
* @param dev_addr
- * device location.
- *
+ * Device identifier.
* @param vfio_dev_fd
- * Pointer to VFIO fd, will be set to the opened device fd on success.
+ * Pointer to where VFIO device file descriptor will be stored.
*
* @return
* 0 on success.
- * <0 on failure.
* >1 if the device cannot be managed this way.
+ * <0 on failure, rte_errno is set.
+ *
+ * Possible rte_errno values include:
+ * - EINVAL - Invalid parameters.
*/
__rte_internal
int dev_vfio_setup_device(const char *sysfs_base, const char *dev_addr, int *vfio_dev_fd);
/**
* @internal
- * Release a device mapped to a VFIO-managed I/O MMU group.
+ * Release a device managed by VFIO driver.
*
* @param sysfs_base
- * sysfs path prefix.
- *
+ * Sysfs path prefix.
* @param dev_addr
- * device location.
- *
+ * Device identifier.
* @param fd
- * VFIO fd.
+ * A previously set up VFIO file descriptor.
*
* @return
* 0 on success.
- * <0 on failure.
+ * <0 on failure, rte_errno is set.
+ *
+ * Possible rte_errno values include:
+ * - EINVAL - Invalid parameters.
*/
__rte_internal
int dev_vfio_release_device(const char *sysfs_base, const char *dev_addr, int fd);
@@ -149,18 +152,19 @@ int dev_vfio_noiommu_is_enabled(void);
* Parse IOMMU group number for a device.
*
* @param sysfs_base
- * sysfs path prefix.
- *
+ * Sysfs path prefix.
* @param dev_addr
- * device location.
- *
+ * Device identifier.
* @param iommu_group_num
- * iommu group number
+ * Pointer to where IOMMU group number will be stored.
*
* @return
* >0 on success
* 0 for non-existent group or VFIO
- * <0 for errors
+ * <0 on failure, rte_errno is set.
+ *
+ * Possible rte_errno values include:
+ * - EINVAL - Invalid parameters.
*/
__rte_internal
int
@@ -181,7 +185,10 @@ dev_vfio_get_group_num(const char *sysfs_base, const char *dev_addr, int *iommu_
*
* @return
* 0 on success.
- * <0 on failure.
+ * <0 on failure, rte_errno is set.
+ *
+ * Possible rte_errno values include:
+ * - EINVAL - Invalid parameters.
*/
__rte_internal
int
@@ -251,7 +258,10 @@ dev_vfio_container_destroy(int container_fd);
*
* @return
* 0 on success.
- * <0 on failure.
+ * <0 on failure, rte_errno is set.
+ *
+ * Possible rte_errno values include:
+ * - EINVAL - Invalid container file descriptor.
*/
__rte_internal
int
@@ -263,21 +273,20 @@ dev_vfio_container_assign_device(int vfio_container_fd, const char *sysfs_base,
* Perform DMA mapping for devices in a container.
*
* @param container_fd
- * the specified container fd. Use DEV_VFIO_DEFAULT_CONTAINER_FD to
- * use the default container.
- *
+ * Container file descriptor. Use DEV_VFIO_DEFAULT_CONTAINER_FD to use the default container.
* @param vaddr
* Starting virtual address of memory to be mapped.
- *
* @param iova
* Starting IOVA address of memory to be mapped.
- *
* @param len
* Length of memory segment being mapped.
*
* @return
- * 0 if successful
- * <0 if failed
+ * 0 on success.
+ * <0 on failure, rte_errno is set.
+ *
+ * Possible rte_errno values include:
+ * - EINVAL - Invalid parameters.
*/
__rte_internal
int
@@ -288,21 +297,20 @@ dev_vfio_container_dma_map(int container_fd, uint64_t vaddr, uint64_t iova, uint
* Perform DMA unmapping for devices in a container.
*
* @param container_fd
- * the specified container fd. Use DEV_VFIO_DEFAULT_CONTAINER_FD to
- * use the default container.
- *
+ * Container file descriptor. Use DEV_VFIO_DEFAULT_CONTAINER_FD to use the default container.
* @param vaddr
* Starting virtual address of memory to be unmapped.
- *
* @param iova
* Starting IOVA address of memory to be unmapped.
- *
* @param len
* Length of memory segment being unmapped.
*
* @return
- * 0 if successful
- * <0 if failed
+ * 0 on success.
+ * <0 on failure, rte_errno is set.
+ *
+ * Possible rte_errno values include:
+ * - EINVAL - Invalid parameters.
*/
__rte_internal
int
--
2.54.0
More information about the dev
mailing list