列出绑定到驱动程序的所有设备

List all devices bound to a driver

假设我在 Linux 内核 space 中有驱动程序 A 和 B,并绑定了设备。我想将驱动程序 A 中的 API 导出到 B 以提供绑定到驱动程序 A 的设备列表。驱动程序 A 是否有可能了解当前检测到并绑定到该驱动程序的所有设备?

是的,只需在 driver B 加载时向 A 注册函数,并在需要设备列表时调用相同的函数。 例如

Driver <<< register_func(func_ptr_list);导出 register_func Driver B <<< 使用函数列表调用 register_func。

多个 driver 使用相似的功能元素相互交谈。例如查看 module_int 的 cxgb4 和 cxgb4i

如果你的驱动是pci驱动,那么:

void get_all_devices_of_driver(const char *driver_name)
{
    bool found = false;

    struct pci_dev *pdev = NULL;
    for_each_pci_dev (pdev) {
        if (!strcmp(dev_driver_string(&pdev->dev),
                driver_name)) {
                // do what you want
        }
    }
}

或者使用内核的通用辅助函数:

/**
 * driver_for_each_device - Iterator for devices bound to a driver.
 * @drv: Driver we're iterating.
 * @start: Device to begin with
 * @data: Data to pass to the callback.
 * @fn: Function to call for each device.
 *
 * Iterate over the @drv's list of devices calling @fn for each one.
 */
int driver_for_each_device(struct device_driver *drv, struct device *start,
               void *data, int (*fn)(struct device *, void *))
{
    struct klist_iter i;
    struct device *dev;
    int error = 0;

    if (!drv)
        return -EINVAL;

    klist_iter_init_node(&drv->p->klist_devices, &i,
                 start ? &start->p->knode_driver : NULL);
    while (!error && (dev = next_device(&i)))
        error = fn(dev, data);
    klist_iter_exit(&i);
    return error;
}