问题标签 [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 - softirq 和 tasklet 在哪个上下文中?
我知道有进程上下文和中断上下文,但是我不明白在执行 softirq 或 tasklet 时,它在哪个上下文下运行。
我看到有些人使用“下半部分上下文”一词,如果有这样的词,与其他词相比有什么区别。
softirq 和 tasklet 的另一个问题是为什么在执行期间不允许休眠?
谁能帮我找出这些问题,谢谢!
linux-kernel - SoftIRQ 和 Tasklet 之间的区别
在研究 Linux 中断处理时,我发现 Tasklet 和 SoftIRQ 是执行“下半部分”(优先级较低的工作)的两种不同方法。我理解这一点(非常真实的需要)。
不同之处在于,SoftIRQ 是可重入的,而 Tasklet 则不是。相同的 SoftIRQ 可以在不同的 CPU 上运行,而 Tasklet 则不是这样。
虽然我从表面上理解这一点,但我无法理解这两个功能的要求。在什么情况下我们可以使用这些设施?如何识别我现在应该使用 Tasklet,然后使用 SoftIRQ。
另外,我们所说的 Tasklet 是在 SoftIRQ 上制作的是什么意思?在我用 LKML 阅读的一本书中,有关于删除 Tasklet 的争论。我完全糊涂了,为什么要引入这样的功能?有些短视(没有冒犯的意思)?
对此的任何指示都会有很大帮助。
linux-kernel - Linux IRQ:在 ISR 中取消屏蔽 IRQ
我有一个 IRQ 正在使用handle_level_irq()
. 大多数时候,ISR 要求安排下半部分,但偶尔,它能够确定它是虚假的,并且不想安排下半部分(出于性能原因)。问题是,在后一种情况下,存在竞争条件。如果 ISR 确定它是虚假的,它将取消屏蔽中断并准备退出(注意——此时 ISR 不受保护desc->lock
)。但是随后,在第二个 CPU 上触发了中断,根据handle_level_irq()
,抓取desc->lock
,屏蔽 IRQ,确定 ISR 正在第一个 CPU 上进行,因此它解锁desc->lock
并退出。然后第一个 CPU 上的原始 ISR 也将退出,使中断一直被屏蔽。
除非我需要,否则我希望能够不安排下半部分,那么 ISR 是否有某种方法可以在避免上述竞争条件的同时揭露自身?
android - 如何在linux内核中定义和触发我自己的新softirq?
我想在 linux 内核中创建自己的 softirq。这样做是否正确:
在init
模块中,我想触发softirq
from 我将添加一个调用:
在片段中,我想提出 softirq,我将添加对raise_softirq
函数的调用:
并添加我的新softirq
内容:
在这里:
问题:
- 我是对的还是我错过了什么?
- 这是正确的方法吗?还有其他选择吗?
c - 在 softirq 和进程上下文之间共享数据
我正在开发一个内核模块,它在 softirq(netfilter 预路由钩子)和用户上下文(在 ioctl 调用中)之间共享数据结构。
阅读此链接后,我知道我需要在修改数据(使用spin_lock_bh
或spin_lock_irqsave
)时禁用用户上下文中的软件中断,并在完成对共享数据的操作后重新启用它们。
但是,我不确定是否需要在 softirq 处理函数中获取锁。我是否也需要在这里抓住锁(使用 spin_lock)?
据我了解,如果与另一个 softirq 或 hardirq 共享数据,我只需要在 softirq 处理程序中使用自旋锁。我的理解正确吗?
linux - 为什么 softirq 用于高线程和高频率用途?
是什么让 softirq 如此特别,以至于我们将它用于高频用途,例如在网络驱动程序和块驱动程序中。
opencl - amd radeon r9 系列 smp_affinity
在opencl程序中使用taskset -c 1,它的运行速度与在四核机器上不使用它的速度相同。但是任务集的负载是 13%,没有它是 50%。
我在 Fedora 20 中使用 AMD 驱动程序 13.12,经过太多问题(fedora 不支持 amd r9 opencl 并且 AMD 驱动程序无法编译,需要第三方补丁)。
该系统有 3 个 GPU,我试图将一个 GPU 的中断分配给一个 CPU 内核。问题是我无法在 /proc/irq/60/ 中向 smp_affinity 回显任何内容
可以将 IRQ 60 分配给核心 0、61 分配给 1 和 62 分配给 2 吗?或者减少CPU负载。
cpu-usage - ksoftirq is NOT using CPU and should be, why?
Both Linux 2.6 and 3.8. Linux setup as a router passing a 3 gig file
Doing a top, %SI is high at 30%, but ksoftirqd is doing 0% CPU. So the question is "What thread is handling the softirq???" I've read the code and it is suppose to be ksoftirqd, but it is idle.
[can't post image, not enough points]
Is this an accounting issue?
dreez
multithreading - local_bh_disable, preempt_disable, local_irq_disable
local_bh_disable
禁用下半部分(softirqs)的处理。Softirq 在中断返回路径或 ksoftirqd-(per cpu)-thread 上进行处理,如果系统遭受严重的 softirq-load,该线程将被唤醒。
preempt_disable
禁用抢占,这意味着当线程在preempt_disable
<->preemt_enable
范围内执行时,调度程序不会将其置于睡眠状态。这意味着,如果当前线程在该范围内时发生系统定时器中断,它可能会更新调度程序的计费表,但不会将上下文切换到另一个线程。这包括softirqd。
local_irq_disable
或local_irq_save
禁用本地 cpu 的中断。这意味着本地 cpu 不会对任何 irq 做出反应,因此它不会运行任何中断返回路径,因此无法在那里运行 softirq。
假设我的上述陈述是正确的(我不确定),那么在local_bh_disable
你调用之后调用preempt_disable
并且local_irq_save
(在进程上下文中)调用不是多余的吗?
linux - 运行多个进程无法扩展
有两个 C++ 进程,每个进程中有一个线程。该线程处理来自 32 个传入 TCP 连接的网络流量(Diameter),对其进行解析并通过 32 个传出 TCP 连接转发拆分消息。让我们称这个 C++ 进程为 DiameterFE。
如果只有一个 DiameterFE 进程在运行,它可以处理 70 000 条消息/秒。
如果两个 DiameterFE 进程正在运行,它们每个可以处理 35 000 条消息/秒,因此总共可以处理 70 000 条消息/秒。
他们为什么不按比例缩放?什么是瓶颈?
详细信息:每个 Diameter 前端进程有 32 个客户端(seagull)和 32 个服务器(seagull),在不同的主机上运行。
为这两个进程提供了一个专用主机 - 2 个 E5-2670 @ 2.60GHz CPU x 8 个内核/插槽 x 2 个硬件线程/内核 = 总共 32 个线程。
10 GBit/sec 网络。平均直径消息大小为 700 字节。
看起来只有 Cpu0 处理网络流量 - 58.7%si。我是否必须为不同的 CPU 显式配置不同的网络队列?
第一个进程 (PID=7615) 占用 89.0 % CPU,它在 Cpu0 上运行。
第二个进程 (PID=59349) 占用 70.8% CPU,它在 Cpu8 上运行。
另一方面,Cpu0 加载在:95.2% = 9.7%us + 26.8%sy + 58.7%si,
而 Cpu8 仅在 70.3% = 14.8%us + 55.5%sy 加载
看起来 Cpu0 也在为第二个进程做这项工作。有非常高的 softirq 并且仅在 Cpu0 = 58.7% 上。为什么?
这是按下键“1”的顶部输出: