Ioctl Sniffer
This tool provides a way to profile GPU workloads, sniff out all the Nvidia
ioctl(2)
calls that are involved, and ultimately filter out the calls that are
currently unsupported by nvproxy.
This is accomplished by providing a libioctl_hook.so
shared library, which can
be LD_PRELOAD
ed and intercepts all ioctl(2)
calls made. Any calls made to
known Nvidia device files are then captured and parsed by the sniffer
Go
package. The sniffer compares against nvproxy's list of supported ioctl(2)
numbers for the current driver version, and checks if the given call is
contained in the list. For NV_ESC_RM_CONTROL
and NV_ESC_RM_ALLOC
calls, it
also extracts the control command and allocation class respectively, and checks
if nvproxy supports them.
Usage
To start, we need to build the shared library and Go binary:
make copy TARGETS=//tools/ioctl_sniffer:run_sniffer DESTINATION=bin/
Once we have the binary, we can hook into any GPU workload by passing the
corresponding command to run it to run_sniffer
, like so:
bin/run_sniffer nvidia-smi
This should run the workload as normal and provide an output of all the
unsupported ioctl(2)
calls it detected at the end. For example:
============== Unsupported ioctls ==============
Frontend: None
UVM: None
Control:
Control ioctl: request=0xc020462a [nr=NV_ESC_RM_CONTROL, cmd=0x20810110] => ret=0
Control ioctl: request=0xc020462a [nr=NV_ESC_RM_CONTROL, cmd=0x2080014b] => ret=0
...
Alloc:
Alloc ioctl: request=0xc030462b [nr=NV_ESC_RM_ALLOC, hClass=0xc640] => ret=0
Alloc ioctl: request=0xc030462b [nr=NV_ESC_RM_ALLOC, hClass=0x73] => ret=0
...
Unknown: None