通过request_irq 申请的irq,默认是可以运行在所有online的cpu上
来源:互联网 发布:浏览器无法连接网络 编辑:程序博客网 时间:2024/06/06 03:25
request_irq->request_threaded_irq->__setup_irq,在这个函数中和绑定cpu最终要的参数是
首先定义: cpumask_var_t mask;
然后为mask申请空间:
if (!alloc_cpumask_var(&mask, GFP_KERNEL)) {
ret = -ENOMEM;
goto out_thread;
}
3调用 setup_affinity(desc, mask);将irq 默认绑定到cpu0上
static int setup_affinity(struct irq_desc *desc, struct cpumask *mask)
{
struct cpumask *set = irq_default_affinity;
int node = irq_desc_get_node(desc);
/* Excludes PER_CPU and NO_BALANCE interrupts */
if (!__irq_can_set_affinity(desc))
return 0;
/*
* Preserve the managed affinity setting and an userspace affinity
* setup, but make sure that one of the targets is online.
*/
if (irqd_affinity_is_managed(&desc->irq_data) ||
irqd_has_set(&desc->irq_data, IRQD_AFFINITY_SET)) {
if (cpumask_intersects(desc->irq_common_data.affinity,
cpu_online_mask))
set = desc->irq_common_data.affinity;
else
irqd_clear(&desc->irq_data, IRQD_AFFINITY_SET);
}
//可以看到直接调用将cpu_online_mask和set 做与操作后复制给mask,这里的set 可以通过kernel commandline
irqaffinity来制定,如果没有指定的话,会调用init_irq_default_affinity 设置为全F。
cpumask_and(mask, cpu_online_mask, set);
if (node != NUMA_NO_NODE) {
const struct cpumask *nodemask = cpumask_of_node(node);
/* make sure at least one of the cpus in nodemask is online */
if (cpumask_intersects(mask, nodemask))
cpumask_and(mask, mask, nodemask);
}
//最终调用irq_do_set_affinity 来设置irq的affinity
irq_do_set_affinity(&desc->irq_data, mask, false);
return 0;
}
所以总结一下,通过request_irq 申请的中断,如果不制定irq affinity的话,irq的handler就是可以运行在所有cpu上。具体可以通过 cat /proc/interrupts
首先定义: cpumask_var_t mask;
然后为mask申请空间:
if (!alloc_cpumask_var(&mask, GFP_KERNEL)) {
ret = -ENOMEM;
goto out_thread;
}
3调用 setup_affinity(desc, mask);将irq 默认绑定到cpu0上
static int setup_affinity(struct irq_desc *desc, struct cpumask *mask)
{
struct cpumask *set = irq_default_affinity;
int node = irq_desc_get_node(desc);
/* Excludes PER_CPU and NO_BALANCE interrupts */
if (!__irq_can_set_affinity(desc))
return 0;
/*
* Preserve the managed affinity setting and an userspace affinity
* setup, but make sure that one of the targets is online.
*/
if (irqd_affinity_is_managed(&desc->irq_data) ||
irqd_has_set(&desc->irq_data, IRQD_AFFINITY_SET)) {
if (cpumask_intersects(desc->irq_common_data.affinity,
cpu_online_mask))
set = desc->irq_common_data.affinity;
else
irqd_clear(&desc->irq_data, IRQD_AFFINITY_SET);
}
//可以看到直接调用将cpu_online_mask和set 做与操作后复制给mask,这里的set 可以通过kernel commandline
irqaffinity来制定,如果没有指定的话,会调用init_irq_default_affinity 设置为全F。
cpumask_and(mask, cpu_online_mask, set);
if (node != NUMA_NO_NODE) {
const struct cpumask *nodemask = cpumask_of_node(node);
/* make sure at least one of the cpus in nodemask is online */
if (cpumask_intersects(mask, nodemask))
cpumask_and(mask, mask, nodemask);
}
//最终调用irq_do_set_affinity 来设置irq的affinity
irq_do_set_affinity(&desc->irq_data, mask, false);
return 0;
}
所以总结一下,通过request_irq 申请的中断,如果不制定irq affinity的话,irq的handler就是可以运行在所有cpu上。具体可以通过 cat /proc/interrupts
阅读全文
0 0
- 通过request_irq 申请的irq,默认是可以运行在所有online的cpu上
- 如何将所有的进程运行在一个指定的CPU上
- 如何将所有的进程运行在一个指定的CPU上
- 如何将所有的进程运行在一个指定的CPU上
- 如何将所有的进程运行在一个指定的CPU上
- 如何将所有的进程运行在一个指定的CPU上
- JAVA的线程可以在多个CPU上运行么?
- JAVA的线程可以在多个CPU上运行么?
- Kivy A to Z -- 通过绑定进程运行CPU提高Python程序在多核CPU平台上的性能
- wince在运行的时候是否可以修改CPU频率?
- 在Ubuntu上通过ssh远程挂载数莓派的共享目录(也可以是根目录)
- linux下让进程运行在指定的cpu上
- linux下让进程运行在指定的cpu上
- linux下让进程运行在指定的cpu上
- 如何设置进程(线程)在指定的CPU上运行
- 如何设置进程(线程)在指定的CPU上运行
- linux下让进程运行在指定的cpu上
- 如何设置进程(线程)在指定的CPU上运行
- iOS XCTest UiTesting: Apple Mach-o linker error use -v to see invocation
- 对版本更新的管理
- Spring Web MVC简介 、基于XML配置的MVC应用 、基于注解配置的MVC应用
- 07. DNS 域名解析 ❀ 数据包分析工具 Wireshark
- crond和crontab调研
- 通过request_irq 申请的irq,默认是可以运行在所有online的cpu上
- Mysql存储过程基础
- OpenJudge-2152:Pots
- 几种任务调度的 Java 实现方法与比较
- error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- FFmpeg源码调试:解析H.264 SPS(Sequence Parameter Set)中帧的宽高
- 高级Android开发工程师进阶路线
- 构造函数
- Eclipse设置Tomcat