if (priv.dev && priv.dev->sem)报错 不允许使用指向不完整类型 "struct corwn_device" 的指针或引用
时间: 2024-09-13 21:06:02 浏览: 37
当您在代码中遇到错误提示“不允许使用指向不完整类型 `struct corwn_device` 的指针或引用”时,这通常意味着在尝试访问结构体 `corwn_device` 的成员之前,编译器没有足够的信息来确定该结构体的完整定义。在C语言中,您必须在使用结构体之前先定义它。
例如,如果您在头文件中定义了结构体,并在多个源文件中使用它,您应该这样做:
头文件(corwn_device.h):
```c
#ifndef CORWN_DEVICE_H
#define CORWN_DEVICE_H
// 定义结构体
struct corwn_device {
int sem; // 假设这是结构体的一个成员
// 其他成员...
};
#endif // CORWN_DEVICE_H
```
源文件1(例如使用结构体的文件):
```c
#include "corwn_device.h" // 包含结构体定义的头文件
// 函数定义或者代码块
void some_function(struct corwn_device *priv) {
if (priv && priv->sem) {
// 代码逻辑...
}
}
```
确保在包含头文件之前定义结构体,或者确保头文件中已经定义了该结构体,否则编译器会报错。这通常发生在结构体定义和使用不在同一个编译单元中,或者头文件保护(防止多次包含)没有正确设置导致的。
相关问题
static void nvme_calc_irq_sets(struct irq_affinity *affd, unsigned int nrirqs) { struct nvme_dev *dev = affd->priv; unsigned int nr_read_queues, nr_write_queues = dev->nr_write_queues; if (!nrirqs) { nrirqs = 1; nr_read_queues = 0; } else if (nrirqs == 1 || !nr_write_queues) { nr_read_queues = 0; } else if (nr_write_queues >= nrirqs) { nr_read_queues = 1; } else { nr_read_queues = nrirqs - nr_write_queues; } dev->io_queues[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; affd->set_size[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; dev->io_queues[HCTX_TYPE_READ] = nr_read_queues; affd->set_size[HCTX_TYPE_READ] = nr_read_queues; affd->nr_sets = nr_read_queues ? 2 : 1; }static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) { struct pci_dev *pdev = to_pci_dev(dev->dev); struct irq_affinity affd = { //ָ���ж����Եļ��㷽���Ͳ��� .pre_vectors = 1, .calc_sets = nvme_set_irq_affinity, //nvme_calc_irq_sets, .priv = dev, }; unsigned int irq_queues, poll_queues; poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1); dev->io_queues[HCTX_TYPE_POLL] = poll_queues; dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; irq_queues = 1; if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)) irq_queues += (nr_io_queues - poll_queues); return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } 在 Linux 5.17.12 内核版本中,可以通过修改 pci_alloc_irq_vectors_affinity() 函数的 affinity_hint 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。
是的,通过设置 affinity_hint 参数为一个指定的 CPU 核心,可以将 NVMe 驱动的所有 I/O 队列绑定到同一 CPU 核心上,从而提高系统的性能和响应速度。这个参数可以在 nvme_setup_irqs() 函数中调用 pci_alloc_irq_vectors_affinity() 函数时设置。同时,在 nvme_calc_irq_sets() 函数中也可以根据系统的硬件资源和配置情况,动态计算 IRQ 的分配方式和数量,以实现更加高效的 IRQ 管理和利用。
static void nvme_calc_irq_sets(struct irq_affinity *affd, unsigned int nrirqs) { struct nvme_dev *dev = affd->priv; unsigned int nr_read_queues, nr_write_queues = dev->nr_write_queues; if (!nrirqs) { nrirqs = 1; nr_read_queues = 0; } else if (nrirqs == 1 || !nr_write_queues) { nr_read_queues = 0; } else if (nr_write_queues >= nrirqs) { nr_read_queues = 1; } else { nr_read_queues = nrirqs - nr_write_queues; } dev->io_queues[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; affd->set_size[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; dev->io_queues[HCTX_TYPE_READ] = nr_read_queues; affd->set_size[HCTX_TYPE_READ] = nr_read_queues; affd->nr_sets = nr_read_queues ? 2 : 1; }static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) { struct pci_dev *pdev = to_pci_dev(dev->dev); struct irq_affinity affd = { //ָ���ж����Եļ��㷽���Ͳ��� .pre_vectors = 1, .calc_sets = nvme_set_irq_affinity, //nvme_calc_irq_sets, .priv = dev, }; unsigned int irq_queues, poll_queues; poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1); dev->io_queues[HCTX_TYPE_POLL] = poll_queues; dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; irq_queues = 1; if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)) irq_queues += (nr_io_queues - poll_queues); return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } 在 Linux 5.17.12 内核版本中,如何修改 pci_alloc_irq_vectors_affinity() 函数的 affinity_hint 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。代码展示
可以在 nvme_setup_irqs() 函数中调用 pci_alloc_irq_vectors_affinity() 函数时,将 affinity_hint 参数设置为指定的 CPU 核心编号,来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。具体代码如下:
```
int cpu = 0; // 设置 CPU 核心编号
return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd, &cpu);
```
其中,第 6 个参数是一个指向 CPU 核心编号的指针。在函数返回时,该指针将被设置为实际使用的 CPU 核心编号。如果想要绑定到指定的 CPU 核心上,可以先将该指针设置为指定的核心编号,然后调用函数即可。
阅读全文