tools/testing/selftests/vfio/lib/vfio_pci_device.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/vfio/lib/vfio_pci_device.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/vfio/lib/vfio_pci_device.c- Extension
.c- Size
- 12802 bytes
- Lines
- 483
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
dirent.hfcntl.hlibgen.hstdint.hstdlib.hstring.hunistd.hsys/eventfd.hsys/ioctl.hsys/mman.hlinux/align.hlinux/iommufd.hlinux/kernel.hlinux/limits.hlinux/log2.hlinux/mman.hlinux/overflow.hlinux/sizes.hlinux/types.hlinux/vfio.huuid/uuid.hkselftest.hlibvfio.h
Detected Declarations
function vfio_pci_irq_setfunction vfio_pci_irq_triggerfunction check_supported_irq_indexfunction vfio_pci_irq_enablefunction vfio_pci_irq_disablefunction vfio_pci_irq_getfunction vfio_device_feature_ioctlfunction vfio_device_feature_setfunction vfio_device_set_vf_tokenfunction vfio_pci_region_getfunction vfio_pci_bar_mapfunction vfio_pci_bar_unmapfunction vfio_pci_bar_unmap_allfunction vfio_pci_config_accessfunction vfio_pci_device_resetfunction vfio_pci_group_setupfunction __vfio_pci_group_get_device_fdfunction vfio_pci_group_get_device_fdfunction vfio_container_set_iommufunction vfio_pci_container_setupfunction vfio_pci_device_setupfunction __vfio_device_bind_iommufdfunction vfio_device_bind_iommufdfunction vfio_device_attach_iommufd_ptfunction vfio_pci_cdev_openfunction vfio_pci_iommufd_setupfunction vfio_pci_device_freefunction vfio_pci_device_cleanup
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0-only
#include <dirent.h>
#include <fcntl.h>
#include <libgen.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/eventfd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/align.h>
#include <linux/iommufd.h>
#include <linux/kernel.h>
#include <linux/limits.h>
#include <linux/log2.h>
#include <linux/mman.h>
#include <linux/overflow.h>
#include <linux/sizes.h>
#include <linux/types.h>
#include <linux/vfio.h>
#include <uuid/uuid.h>
#include "kselftest.h"
#include <libvfio.h>
static void vfio_pci_irq_set(struct vfio_pci_device *device,
u32 index, u32 vector, u32 count, int *fds)
{
u8 buf[sizeof(struct vfio_irq_set) + sizeof(int) * count];
struct vfio_irq_set *irq = (void *)&buf;
int *irq_fds = (void *)&irq->data;
memset(buf, 0, sizeof(buf));
irq->argsz = sizeof(buf);
irq->flags = VFIO_IRQ_SET_ACTION_TRIGGER;
irq->index = index;
irq->start = vector;
irq->count = count;
if (count) {
irq->flags |= VFIO_IRQ_SET_DATA_EVENTFD;
memcpy(irq_fds, fds, sizeof(int) * count);
} else {
irq->flags |= VFIO_IRQ_SET_DATA_NONE;
}
ioctl_assert(device->fd, VFIO_DEVICE_SET_IRQS, irq);
}
void vfio_pci_irq_trigger(struct vfio_pci_device *device, u32 index, u32 vector)
{
struct vfio_irq_set irq = {
.argsz = sizeof(irq),
.flags = VFIO_IRQ_SET_ACTION_TRIGGER | VFIO_IRQ_SET_DATA_NONE,
.index = index,
.start = vector,
.count = 1,
};
ioctl_assert(device->fd, VFIO_DEVICE_SET_IRQS, &irq);
}
static void check_supported_irq_index(u32 index)
{
/* VFIO selftests only supports MSI and MSI-x for now. */
VFIO_ASSERT_TRUE(index == VFIO_PCI_MSI_IRQ_INDEX ||
index == VFIO_PCI_MSIX_IRQ_INDEX,
"Unsupported IRQ index: %u\n", index);
}
void vfio_pci_irq_enable(struct vfio_pci_device *device, u32 index, u32 vector,
int count)
{
int i;
check_supported_irq_index(index);
for (i = vector; i < vector + count; i++) {
VFIO_ASSERT_LT(device->msi_eventfds[i], 0);
device->msi_eventfds[i] = eventfd(0, 0);
VFIO_ASSERT_GE(device->msi_eventfds[i], 0);
}
vfio_pci_irq_set(device, index, vector, count, device->msi_eventfds + vector);
}
Annotation
- Immediate include surface: `dirent.h`, `fcntl.h`, `libgen.h`, `stdint.h`, `stdlib.h`, `string.h`, `unistd.h`, `sys/eventfd.h`.
- Detected declarations: `function vfio_pci_irq_set`, `function vfio_pci_irq_trigger`, `function check_supported_irq_index`, `function vfio_pci_irq_enable`, `function vfio_pci_irq_disable`, `function vfio_pci_irq_get`, `function vfio_device_feature_ioctl`, `function vfio_device_feature_set`, `function vfio_device_set_vf_token`, `function vfio_pci_region_get`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.