问题标签 [softirq]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - softirq处理程序运行时内核如何禁用本地处理器中的softirq
最近我研究了 Robert Love 的 Linux-Kernel-Development。
有一段描述了softirq的机制。
softirq 处理程序在启用中断的情况下运行并且不能休眠。当处理程序运行时,当前处理器上的软中断被禁用。然而,另一个处理器可以执行其他软中断。
我不明白“当前处理器上的软中断已禁用”的含义。
这是否意味着在运行 __do_softirq 时,即使 softirq_pending 中的某些位再次升高,__do_softirq 函数也不能被中断?如果是,那么 __do_softirq 中的哪些语句会进行这种保护?
在跟踪__do_softirq中的代码时,我发现有一对__local_bh_disable和__local_bh_enable函数。
他们是否禁用本地软中断?
谢谢。
linux-kernel - 为什么相同的任务不能同时在两个核心上执行?
在 ARM 平台的 linux 内核实现中,tasklet 中的延迟工作被添加到 percpu vec|vec_hi 列表中。
- 现在,当从 ISR 执行返回时,它会处理 softirq 和 tasklet 中的延迟工作。
- 现在可以在启用 IRQ 的中断上下文中处理此延迟工作,或者有可以在进程上下文中处理它的 ksoftirq 线程。
- 相同的 tasklet 将在相同的 CPU 上执行,因为 ksoftirq 线程是 percpu。
- 我一直在很多书中看到,例如LDD,Robert Love的书,它声称不能同时在两个核心上执行同一个tasklet?
如何?有人可以帮我解决这个问题...如果是这样,我错过了什么?
kernel - 为什么原子读取来计算 tasklet 结构中的变量?
在 tasklet_action 例程中 - 在处理来自 tasklet_vec
核心列表的条目时,我们正在原子地读取 atomic_read(&t->count),我
在整个例程中看不到它的任何用途,它有什么意义?
linux - 为什么在禁用 irq 时不能启用下半部分?
在__local_bh_enable
中,我们有一个
我想知道这个警告的目的是什么——我想你会希望能够在说 spinlock_irq
受保护的代码时重新启用底半部分......(注意:我在这里查看的是 linux 3.4 代码,但它似乎也在 4.1 中)。
linux-kernel - 如何在驱动程序中将中断固定到 CPU
是否可以将软中断或任何其他下半部分固定到处理器。我怀疑这可以从软中断代码中完成。但是在驱动程序内部,可以将特定的 IRQ 固定到核心。
c - 有没有办法用我自己的softirq调用linux内核
与系统调用的工作方式类似int 0x80
,是否可以在内核中实现我自己的 ISR,以便在 softirq 假设int 0x120
或任何其他 softirq 程序计数器可以从用户空间跳转到内核空间?
以特权模式进入内核是否仅与int 0x80
,或者与任何softirq实现相关联,我可以自动进入特权模式或禁用保护模式并进入特权模式,我们必须通过编写其关联标志手动执行?
还有一件事,如果可以实现这种类型的 ISR,数据交换的最佳方式是使用寄存器 EBX、ECX、EDX、ESI、EDI 和 EBP 还是任何其他方式仍然存在?
我已经看到了如何在 linux 内核中定义和触发我自己的新软中断?但没有得到我正在寻找的解决方案。
我会更清楚一点,为什么我需要这个
我已经实现了几个内核函数,它们直接与硬件外围设备对话,我希望它们使用软件中断从用户空间触发。不能使用具有可用驱动程序架构的系统调用,因为我需要减少执行时间。
linux-kernel - 是否有带有自旋锁保护桶的哈希表的 linux 标头?
我编写的代码很少创建/删除对象(最多数千个),但在软 IRQ 上下文中非常频繁地修改它们。这些对象也很少从任务上下文中读取(并且可能也很少被修改)(通过 procfs:每个对象的文件)。目前我的代码包含全局的 per-CPU 数据块,每个数据块都由一个自旋锁保护。这样的块包含用于对象存储的固定大小的哈希表。
显然,当前的设计不是最优的,尤其是在对象更新负载非常高的情况下:从 procfs 读取对象会导致更新软 IRQ 时数据丢失。我需要重写同步方案以摆脱全局锁。最明显的选择 - 为每个哈希表存储桶设置一个自旋锁 - 它应该可以很好地扩展。问题是我可能需要使用我自己的哈希表实现,或者至少重新实现几个顶级宏(在 linux/hashtable.h 中没有找到那些用于自旋锁保护的存储桶)。我是否也应该考虑启用 RCU 的哈希表(但我对这种同步方法没有深入的了解)?
linux - SoftIRQ 能否抢占当前与 Linux 内核运行相同的 SoftIRQ?
我正在努力提高驱动程序的性能,应该考虑死锁的可能性。在 SoftIRQ 上下文中,将持有 spin_lock 并保护一些变量。在这种情况下,我应该使用 spin_lock 还是 spin_lock_bh?spin_lock_bh 听起来更安全,但我有一个关于 SoftIRQ 实现的一般性问题。
- 在 SoftIRQ 执行期间,可以在同一个 CPU 上调度相同的 softIRQ 函数 -> 我们需要在 SoftIRQ 中使用 spin_lock_bh
- 相同的 softIRQ 函数可以在另一个 CPU 上调度,但不是同一个 CPU -> 我们可以在 SoftIRQ 中使用 spin_lock
从上面的陈述中什么是正确的?
linux-kernel - 在 irq 上下文的情况下的 PID
“current->pid”在以下 2 种情况下打印什么
1) 硬中断上下文
2) 软中断上下文
我知道 IRQ 上下文和进程上下文是不同的,并且在 IRQ 上下文的情况下 PID 必须是无效的。但是当尝试在 IRQ 上下文中打印“current->pid”时,它正在打印一些有效的 PID,因此产生了疑问。请澄清。
谢谢你,
戈皮纳特。
c - linux softirq cpu 使用情况看起来很奇怪
我在客户端运行一个简单的程序,它继续向服务器发送 udp 数据包。服务器的接口是一个多队列网卡,但是我将它的udp4的rx-flow-hash设置为sd。所以所有的数据包都将在一个 CPU 中产生。
当我收到 40Wpackets/s 时,服务器在 softirq 中的 CPU 成本为 1%。当我收到 60Wpackets/s 时,服务器在 softirq 中的 CPU 成本为 8%。当我收到 90Wpackets/s 时,服务器在 softirq 中的 CPU cosr 100%。
收到的号码是通过运行sar -n UDP 1
一段时间得到的。cpu成本暂时可以通过mpstat -P ALL 1
。
所以我对此感到困惑。
为什么它不是线性的?