vfio/pci: print vfio-device syspath to fdinfo

Print the PCI device syspath to a vfio device's fdinfo. This enables tools
to query which device is associated with a given vfio device fd.

This results in output like below:

$ cat /proc/"$SOME_PID"/fdinfo/"$VFIO_FD" | grep vfio
vfio-device-syspath: /sys/devices/pci0000:e0/0000:e0:01.1/0000:e1:00.0/0000:e2:05.0/0000:e8:00.0

Signed-off-by: Alex Mastro <amastro@fb.com>
Reviewed-by: Amit Machhiwal <amachhiw@linux.ibm.com>
Tested-by: Amit Machhiwal <amachhiw@linux.ibm.com>
Link: https://lore.kernel.org/r/20250804-show-fdinfo-v4-1-96b14c5691b3@fb.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
Alex Mastro 2025-08-04 12:44:31 -07:00 committed by Alex Williamson
parent 1b237f190e
commit 1e736f1489
2 changed files with 34 additions and 0 deletions

View File

@ -2166,6 +2166,20 @@ DMA Buffer files
where 'size' is the size of the DMA buffer in bytes. 'count' is the file count of where 'size' is the size of the DMA buffer in bytes. 'count' is the file count of
the DMA buffer file. 'exp_name' is the name of the DMA buffer exporter. the DMA buffer file. 'exp_name' is the name of the DMA buffer exporter.
VFIO Device files
~~~~~~~~~~~~~~~~
::
pos: 0
flags: 02000002
mnt_id: 17
ino: 5122
vfio-device-syspath: /sys/devices/pci0000:e0/0000:e0:01.1/0000:e1:00.0/0000:e2:05.0/0000:e8:00.0
where 'vfio-device-syspath' is the sysfs path corresponding to the VFIO device
file.
3.9 /proc/<pid>/map_files - Information about memory mapped files 3.9 /proc/<pid>/map_files - Information about memory mapped files
--------------------------------------------------------------------- ---------------------------------------------------------------------
This directory contains symbolic links which represent memory mapped files This directory contains symbolic links which represent memory mapped files

View File

@ -28,6 +28,7 @@
#include <linux/pseudo_fs.h> #include <linux/pseudo_fs.h>
#include <linux/rwsem.h> #include <linux/rwsem.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/stat.h> #include <linux/stat.h>
#include <linux/string.h> #include <linux/string.h>
@ -1355,6 +1356,22 @@ static int vfio_device_fops_mmap(struct file *filep, struct vm_area_struct *vma)
return device->ops->mmap(device, vma); return device->ops->mmap(device, vma);
} }
#ifdef CONFIG_PROC_FS
static void vfio_device_show_fdinfo(struct seq_file *m, struct file *filep)
{
char *path;
struct vfio_device_file *df = filep->private_data;
struct vfio_device *device = df->device;
path = kobject_get_path(&device->dev->kobj, GFP_KERNEL);
if (!path)
return;
seq_printf(m, "vfio-device-syspath: /sys%s\n", path);
kfree(path);
}
#endif
const struct file_operations vfio_device_fops = { const struct file_operations vfio_device_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = vfio_device_fops_cdev_open, .open = vfio_device_fops_cdev_open,
@ -1364,6 +1381,9 @@ const struct file_operations vfio_device_fops = {
.unlocked_ioctl = vfio_device_fops_unl_ioctl, .unlocked_ioctl = vfio_device_fops_unl_ioctl,
.compat_ioctl = compat_ptr_ioctl, .compat_ioctl = compat_ptr_ioctl,
.mmap = vfio_device_fops_mmap, .mmap = vfio_device_fops_mmap,
#ifdef CONFIG_PROC_FS
.show_fdinfo = vfio_device_show_fdinfo,
#endif
}; };
static struct vfio_device *vfio_device_from_file(struct file *file) static struct vfio_device *vfio_device_from_file(struct file *file)