发布时间:2026/6/13 15:57:29
Linux irq_set_affinity中断亲和力设置与chip_irq_set
Linux irq_set_affinity中断亲和力设置与chip_irq_set中断亲和力IRQ Affinity是Linux内核将特定中断绑定到指定CPU核心执行的机制。通过设置irq_desc的affinity掩码可以控制中断路由到哪些CPU实现负载均衡和性能优化。核心接口是irq_set_affinity定义在kernel/irq/manage.c。irq_set_affinity函数的实现cint irq_set_affinity(unsigned int irq, const struct cpumask *cpumask){struct irq_desc *desc irq_to_desc(irq);unsigned long flags;int ret;if (!desc)return -EINVAL;raw_spin_lock_irqsave(desc-lock, flags);ret __irq_set_affinity_locked(irq_desc_get_irq_data(desc), cpumask, false);raw_spin_unlock_irqrestore(desc-lock, flags);return ret;}__irq_set_affinity_locked是实际执行设置的核心函数cint __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, bool force){struct irq_chip *chip irq_data_get_irq_chip(data);struct irq_desc *desc irq_data_to_desc(data);const struct cpumask *prog_mask;int ret -EINVAL;if (!chip || !chip-irq_set_affinity)goto out;if (!force !irq_can_set_affinity(data))goto out;prog_mask irq_data_get_affinity_mask(data);if (cpumask_equal(mask, prog_mask) cpumask_subset(prog_mask, cpu_online_mask))return 0;ret chip-irq_set_affinity(data, mask, force);if (!ret) {cpumask_copy(prog_mask, mask);irq_data_update_effective_affinity(data, mask);}out:return ret;}函数首先验证芯片支持irq_set_affinity回调且中断允许设置亲和力IRQ_NO_BALANCING标志未设置。如果新掩码与当前掩码相同且在线CPU子集未变化则直接返回0避免冗余的硬件操作。实际设置由chip-irq_set_affinity完成成功后将prog_mask复制为最新掩码。对于x86 IO-APICirq_set_affinity对应ioapic_set_affinitycstatic int ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force){struct irq_cfg *cfg data-chip_data;unsigned int dest;unsigned int vector;int cpu;cpu cpumask_first_and(mask, cpu_online_mask);if (cpu nr_cpu_ids)return -EINVAL;dest apic-calc_dest(cpu);vector cfg-vector;raw_spin_lock(ioapic_lock);__ioapic_write_entry(cfg-irq_2_pin, vector, dest, data-irq);raw_spin_unlock(ioapic_lock);cpumask_copy(irq_data_get_effective_affinity_mask(data), cpumask_of(cpu));return 0;}该实现首先从mask中选取第一个在线CPU通过calc_dest计算APIC destination ID将中断重定向到目标CPU的vector。IOAPIC的RTERedirection Table Entry中包含dest字段和vector字段硬件在中断产生时根据dest将中断发送到指定CPU的Local APIC。用户空间的亲和力设置通过/proc/irq/{irq}/smp_affinity文件暴露cstatic ssize_t smp_affinity_write(struct file *file, const char __user *buf,size_t count, loff_t *pos){struct irq_desc *desc file_inode(file)-i_private;cpumask_var_t new_value;int err;if (!zalloc_cpumask_var(new_value, GFP_KERNEL))return -ENOMEM;err cpumask_parse_user(buf, count, new_value);if (err)goto out;err irq_set_affinity(desc-irq_data.irq, new_value);if (!err)err count;out:free_cpumask_var(new_value);return err;}irqbalance守护进程周期性扫描/proc/interrupts统计各CPU中断计数动态调整smp_affinity。它计算每个中断在各CPU上的分布偏差若偏差超过阈值则调用irq_set_affinity将中断迁移到负载更低的CPU。默认策略是查找具有最低中断数的CPU核心。effective_affinity与requested_affinity的区别值得注意。requested_affinity是用户或内核请求的CPU掩码而effective_affinity是硬件实际路由的目标CPU。对于X86 MSI和MSI-X中断一个中断请求只能路由到一个CPU但用户请求可能包含多个CPU位此时内核选取第一个在线CPU写入硬件effective_affinity记录该单一CPUrequested_affinity保留原始多CPU掩码。中断迁移irq_migrate_all_off_this_cpu在CPU热拔插时被调用将即将离线的CPU上的所有中断迁移到其他在线CPUcvoid irq_migrate_all_off_this_cpu(void){unsigned int irq;struct irq_desc *desc;for_each_irq_desc(irq, desc) {bool affinity_broken false;const struct cpumask *affinity;affinity irq_data_get_affinity_mask(desc-irq_data);if (!cpumask_test_cpu(smp_processor_id(), affinity))continue;cpumask_clear_cpu(smp_processor_id(), affinity);if (cpumask_empty(affinity))cpumask_setall(affinity);__irq_set_affinity_locked(desc-irq_data, affinity, true);}}该函数在CPU_DOWN_PREPARE阶段执行确保所有中断被重新分配避免离线CPU无法处理中断导致中断丢失。调度域层面的中断负载均衡由内核线程irqbalance或内核参数irqaffinity控制。内核启动参数irqaffinity0-3允许在启动阶段指定默认亲和掩码通过init_irq_default_affinity设置到desc-irq_data.affinity。numa_node字段辅助将中断分配给与设备所在NUMA节点相同的CPU减少跨节点内存访问延迟。

相关新闻

四足机器人ROS2 SDK实战:从WebRTC连接到自主导航
2026/6/13 15:57:29

四足机器人ROS2 SDK实战:从WebRTC连接到自主导航

四足机器人ROS2 SDK实战:从WebRTC连接到自主导航 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk 在四足机器人开发领域,Unitree GO2系列机器…

阅读更多
前端开发必看:你的innerHTML用对了吗?从一次DOM XSS漏洞排查说起
2026/6/13 14:57:29

前端开发必看:你的innerHTML用对了吗?从一次DOM XSS漏洞排查说起

前端安全实战:从innerHTML误用到DOM XSS防御体系构建那天凌晨三点,当我被安全团队的紧急电话惊醒时,怎么也没想到问题出在那行看似无害的innerHTML赋值语句上。我们的用户数据面板突然出现异常弹窗,而罪魁祸首正是开发时为了赶进度…

阅读更多
【Springboot毕设全套源码+文档】基于Java+springboot的手机电脑数码售卖系统的设计与实现(丰富项目+远程调试+讲解+定制)
2026/6/13 14:57:29

【Springboot毕设全套源码+文档】基于Java+springboot的手机电脑数码售卖系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

阅读更多
MuleSoft驱动的企业级AI编排:LLM与业务系统深度集成实践
2026/6/14 0:57:30

MuleSoft驱动的企业级AI编排:LLM与业务系统深度集成实践

1. 项目概述:当企业级集成平台遇上大语言模型“AI Orchestration in Action: How MuleSoft and LLMs Fuel the Future of Enterprise AI”——这个标题不是一句空泛的营销口号,而是我在过去18个月里亲手搭建、上线并持续迭代的三个核心生产系统的统一命名…

阅读更多
数据反熵自动化:构建可自愈的数据一致性系统
2026/6/14 0:57:30

数据反熵自动化:构建可自愈的数据一致性系统

1. 项目概述:这不是“数据修复”,而是让系统自己学会“纠错”和“自愈”“Data Anti-Entropy Automation”——这个标题乍看像学术论文里的术语,但在我过去十年带团队做数据平台、治理中台和实时数仓的实战里,它其实对应着一个每天…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/14 0:57:30

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
美国政府禁 Fable/Mythos,AI 市场或生变,大语言模型未来使用成谜?
2026/6/13 23:57:30

美国政府禁 Fable/Mythos,AI 市场或生变,大语言模型未来使用成谜?

美国政府禁 Fable/Mythos,AI 市场或将生变,未来大语言模型使用成谜?本来周五我打算放松一下,一边让智能代理帮我写代码,一边和朋友们看足球赛。我最近在做有趣的 HTML 游戏,还写了篇草稿文章探讨如何借助 A…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/14 0:57:30

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/14 0:57:30

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
GIT修改用户名
2026/6/13 10:50:23

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/13 15:45:46

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/13 11:10:35

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多