Skip to content

xnvme/devbind

Repository files navigation

devbind: inspect and control PCI device-driver binding in Linux

devbind

PyPI Python Test

devbind is a small CLI for binding and unbinding PCI devices to a chosen kernel driver via sysfs. The typical use is moving a device between its native driver (e.g. nvme) and a user space driver framework (vfio-pci, uio_pci_generic) for DPDK/SPDK and xNVMe/uPCIe workloads. devbind --list also reports the process RLIMIT_MEMLOCK and warns when the soft limit is below the 64 MiB threshold those frameworks inherit.

Install

pipx install devbind

Or standalone (single-file, stdlib only, no pip needed):

curl -fsSL https://raw.githubusercontent.com/xnvme/devbind/main/src/devbind/devbind.py \
  -o ~/.local/bin/devbind && chmod +x ~/.local/bin/devbind

Shell completion

devbind --print-completion bash > ~/.local/share/bash-completion/completions/devbind

Open a new shell (or source the file) and tab-completion is live: devbind --bind <TAB> lists nvme vfio-pci vfio-noiommu uio_pci_generic.

Usage

$ devbind --help
usage: devbind [-h] [--version] [--classcode CLASSCODE] [--device DEVICE]
               [--list] [--unbind] [--bind BIND] [--verbose]
               [--print-completion SHELL]

Inspect and control PCI device-driver binding in Linux

options:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  --classcode CLASSCODE
                        The class of PCIe devices to scan for
  --device DEVICE       Instead of all; then only the given PCI address.
  --list                Print PCIe device(s); such as their 'bdf' and driver-
                        association.
  --unbind              Unbind if bound.
  --bind BIND           Unbind if bound; then bind to the given driver-name
                        [nvme, vfio-pci, uio_pci_generic] or to a .ko driver
                        file (path)
  --verbose             Enable verbose logging
  --print-completion SHELL
                        Print shell completion script to stdout and exit

A few common invocations:

devbind --list                                       # list NVMe devices and their drivers
sudo devbind --bind vfio-pci --device 0000:01:00.0   # bind one device to vfio-pci
sudo devbind --bind nvme --device 0000:01:00.0       # rebind to the native driver
sudo devbind --unbind --device 0000:01:00.0          # unbind without rebinding

devbind --list sample output (stock WSL host, no NVMe devices visible):

system:
  drivers:
  - uio_pci_generic: {'available': False}
  - vfio-noiommu: {'available': False}
  - vfio-pci: {'available': False}
  - nvme: {'available': True}
  limits:
    memlock_soft: 64 MB
    memlock_hard: 64 MB

On a host with NVMe devices visible, a props: block is also printed per device with bdf, vendor, device, classcode, driver, iommugroup, handles, and is_used.

Related

  • iommu: inspect and configure the IOMMU in Linux.
  • hugepages: inspect and manage Linux hugepages.

About

Inspect and control PCI device-driver binding in Linux.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors