linux 在哪里实现了configuration_user_write_config_word?

jogvjijk  于 2023-10-16  发布在  Linux
关注(0)|答案(1)|浏览(154)

正如perf报告分析所指出的那样,当从PCI设备阅读数据时,我的用户应用程序与内核进行交互,特别是通过一个名为configuration_user_write_config_dword的函数。
我对探索这个函数很感兴趣,以理解它为什么调用_raw_spin_lock_irq。
我无法找到此函数的实际实现。我只在以下位置的内核源代码中找到了它的定义:https://elixir.bootlin.com/linux/v5.18.19/source/include/linux/pci.h#L1235
在Linux内核源代码中,在哪里可以找到SQL_user_write_config_dword的实现?

user_ application         [kernel.kallsyms]                        [k] do_syscall_64
            |          
            |--90.82%--do_syscall_64
            |          |          
            |          |--61.22%--__x64_sys_pwrite64
            |          |          |          
            |          |           --61.21%--ksys_pwrite64
            |          |                     |          
            |          |                      --61.05%--vfs_write
            |          |                                |          
            |          |                                 --60.87%--__vfs_write
            |          |                                           |          
            |          |                                            --60.79%--kernfs_fop_write
            |          |                                                      |          
            |          |                                                       --60.19%--sysfs_kf_bin_write
            |          |                                                                 |          
            |          |                                                                  --60.18%--pci_write_config
            |          |                                                                            |          
            |          |                                                                            |--57.62%--pci_user_write_config_dword
            |          |                                                                            |          |          
            |          |                                                                            |          |--35.92%--_raw_spin_lock_irq
            |          |                                                                            |          |          |          
            |          |                                                                            |          |           --35.88%--native_queued_spin_lock_slowpath
yquaqz18

yquaqz181#

您可以在drivers/access.c中找到它:

/* Returns 0 on success, negative values indicate error. */
#define PCI_USER_WRITE_CONFIG(size, type)                               \
int pci_user_write_config_##size                                        \
        (struct pci_dev *dev, int pos, type val)                        \
{                                                                       \
        int ret = PCIBIOS_SUCCESSFUL;                                   \
        if (PCI_##size##_BAD)                                           \
                return -EINVAL;                                         \
        raw_spin_lock_irq(&pci_lock);                           \
        if (unlikely(dev->block_cfg_access))                            \
                pci_wait_cfg(dev);                                      \
        ret = dev->bus->ops->write(dev->bus, dev->devfn,                \
                                        pos, sizeof(type), val);        \
        raw_spin_unlock_irq(&pci_lock);                         \
        return pcibios_err_to_errno(ret);                               \
}                                                                       \
EXPORT_SYMBOL_GPL(pci_user_write_config_##size);

你可能会发现它比平常更难搜索,因为整个类的函数(操作字节,字,双字)是通过使用C预处理器的令牌连接功能加上一个方便的帮助宏一次性定义的。这在代码方面是经济的,但可以击败代码浏览器,如cscope。如果你不熟悉,你可以阅读C token concatenation here,并开始使用它来使你自己的内核代码更紧凑。

相关问题