gpt4 book ai didi

linux - pci_user_write_config_word在哪里实现的?

转载 作者:行者123 更新时间:2023-12-03 07:50:36 29 4
gpt4 key购买 nike

如性能报告分析所示,我的用户应用程序在从 PCI 设备读取数据时与内核进行交互,特别是通过名为 pci_user_write_config_dword 的函数。

我有兴趣探索这个函数以理解它调用 _raw_spin_lock_irq 的原因。

我一直无法找到这个函数的实际实现。我只在内核源代码中的以下位置找到了它的定义:https://elixir.bootlin.com/linux/v5.18.19/source/include/linux/pci.h#L1235

在Linux内核源代码中哪里可以找到pci_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

最佳答案

您可以在 drivers/pci/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 串联 here并开始使用它使您自己的内核代码更加紧凑。

关于linux - pci_user_write_config_word在哪里实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77233206/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com