| ================================= | |
| Infiniband Userspace Capabilities | |
| ================================= | |
| User CAPabilities (UCAPs) provide fine-grained control over specific | |
| firmware features in Infiniband (IB) devices. This approach offers | |
| more granular capabilities than the existing Linux capabilities, | |
| which may be too generic for certain FW features. | |
| Each user capability is represented as a character device with root | |
| read-write access. Root processes can grant users special privileges | |
| by allowing access to these character devices (e.g., using chown). | |
| Usage | |
| ===== | |
| UCAPs allow control over specific features of an IB device using file | |
| descriptors of UCAP character devices. Here is how a user enables | |
| specific features of an IB device: | |
| * A root process grants the user access to the UCAP files that | |
| represents the capabilities (e.g., using chown). | |
| * The user opens the UCAP files, obtaining file descriptors. | |
| * When opening an IB device, include an array of the UCAP file | |
| descriptors as an attribute. | |
| * The ib_uverbs driver recognizes the UCAP file descriptors and enables | |
| the corresponding capabilities for the IB device. | |
| Creating UCAPs | |
| ============== | |
| To create a new UCAP, drivers must first define a type in the | |
| rdma_user_cap enum in rdma/ib_ucaps.h. The name of the UCAP character | |
| device should be added to the ucap_names array in | |
| drivers/infiniband/core/ucaps.c. Then, the driver can create the UCAP | |
| character device by calling the ib_create_ucap API with the UCAP | |
| type. | |
| A reference count is stored for each UCAP to track creations and | |
| removals of the UCAP device. If multiple creation calls are made with | |
| the same type (e.g., for two IB devices), the UCAP character device | |
| is created during the first call and subsequent calls increment the | |
| reference count. | |
| The UCAP character device is created under /dev/infiniband, and its | |
| permissions are set to allow root read and write access only. | |
| Removing UCAPs | |
| ============== | |
| Each removal decrements the reference count of the UCAP. The UCAP | |
| character device is removed from the filesystem only when the | |
| reference count is decreased to 0. | |
| /dev and /sys/class files | |
| ========================= | |
| The class:: | |
| /sys/class/infiniband_ucaps | |
| is created when the first UCAP character device is created. | |
| The UCAP character device is created under /dev/infiniband. | |
| For example, if mlx5_ib adds the rdma_user_cap | |
| RDMA_UCAP_MLX5_CTRL_LOCAL with name "mlx5_perm_ctrl_local", this will | |
| create the device node:: | |
| /dev/infiniband/mlx5_perm_ctrl_local | |