linux 5.17.12内核nvme驱动中,这么怎么修改pci_alloc_irq_vectors_affinity函数的参数,能将所有的io队列的亲和性绑定到同一个cpu核心上?代码展示

时间: 2024-03-17 15:39:57 浏览: 15
在 Linux 5.17.12 内核版本中,可以通过修改 `pci_alloc_irq_vectors_affinity()` 函数的 `affinity_hint` 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。 以下是示例代码: ```c static int nvme_setup_io_queues(struct nvme_dev *dev) { int err, qid; cpumask_var_t mask; // 分配 CPU 核心亲和性掩码 mask = alloc_cpumask_var(GFP_KERNEL); if (!mask) return -ENOMEM; // 将所有 CPU 核心添加到掩码中 cpumask_setall(mask); // 为每个 I/O 队列分配中断向量 for (qid = 0; qid < dev->ctrl.queue_count; qid++) { struct nvme_queue *nvmeq = &dev->queues[qid]; struct nvme_q_vector *q = &dev->q_vectors[qid]; struct pci_dev *pdev = to_pci_dev(dev->dev); irqreturn_t (*irq_fn)(int, void *); // 设置中断处理函数 irq_fn = nvme_irq; // 分配中断向量 err = pci_alloc_irq_vectors_affinity(pdev, 1, 1, PCI_IRQ_MSIX, q->num_vecs, mask, &q->affinity_hint); if (err < 0) { dev_err(dev->ctrl.device, "Failed to allocate IRQ vectors\n"); goto err_irq_vectors; } // 绑定 I/O 队列和中断向量 nvmeq->cq_vector = q->cq_vector = q->affinity_hint; nvmeq->sq_vector = q->sq_vector = q->affinity_hint; err = request_irq(pci_irq_vector(pdev, q->affinity_hint), irq_fn, IRQF_SHARED, dev_name(dev->dev), nvmeq); if (err < 0) { dev_err(dev->ctrl.device, "Failed to request IRQ %d\n", pci_irq_vector(pdev, q->affinity_hint)); goto err_request_irq; } } free_cpumask_var(mask); return 0; err_request_irq: for (; qid >= 0; qid--) { struct nvme_q_vector *q = &dev->q_vectors[qid]; struct pci_dev *pdev = to_pci_dev(dev->dev); free_irq(pci_irq_vector(pdev, q->affinity_hint), &dev->queues[qid]); } err_irq_vectors: for (; qid >= 0; qid--) { struct nvme_q_vector *q = &dev->q_vectors[qid]; struct pci_dev *pdev = to_pci_dev(dev->dev); if (q->affinity_hint >= 0) pci_free_irq_vectors(pdev); } free_cpumask_var(mask); return err; } ``` 在此示例代码中,我们使用 `alloc_cpumask_var()` 函数来分配一个 CPU 核心亲和性掩码,然后使用 `cpumask_setall()` 函数将所有 CPU 核心添加到掩码中。接下来,我们使用 `pci_alloc_irq_vectors_affinity()` 函数为每个 I/O 队列分配中断向量,并将 `affinity_hint` 参数设置为掩码,以绑定所有 I/O 队列到同一 CPU 核心。最后,我们使用 `request_irq()` 函数将每个 I/O 队列和中断向量绑定在一起,以便在中断处理程序中处理 I/O 完成事件。 请注意,NVMe 驱动的代码可能因版本而异,因此请根据您使用的内核版本和驱动版本进行适当的修改。

相关推荐

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 核心上。代码展示

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 核心上。

最新推荐

recommend-type

NVM_Express_Revision_1.3中文翻译.docx

花的点时间,将NVME协议翻译了下,可能会方便和我一样苦恼英文的你。 注:表格没有翻译。 大家一起共同进步。
recommend-type

老主板支持NVME硬盘.docx

手上有一块华硕的老主板,闲置了有一段时间,由于是个Mini小板,准备在淘宝上淘个小机箱,整一下...考虑到现在是NVMe M.2固态硬盘已经是普及满天下,决定直接上NVMe固态硬盘了,详细过程文档下载按照步骤做就可以了。
recommend-type

PCIe M.2规范 PCI Express M.2 Specification Revision1.0

PCI SIG官方文件,详细介绍了PCI Express M.2的规范标准和接口定义等
recommend-type

NGFF_M.2及SATA_Express基础知识入门

M2接口和SATAe接口已经可以在部分新款笔记本电脑和Intel 9系列主板上见到了,但易与现有的接口相混淆,这里做一个简单介绍
recommend-type

需要系数法负荷计算软件.zip

需要系数法负荷计算软件
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。