问题标签 [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.

0 投票
3 回答
13151 浏览

linux - softirq 和 tasklet 在哪个上下文中?

我知道有进程上下文和中断上下文,但是我不明白在执行 softirq 或 tasklet 时,它在哪个上下文下运行。

我看到有些人使用“下半部分上下文”一词,如果有这样的词,与其他词相比有什么区别。

softirq 和 tasklet 的另一个问题是为什么在执行期间不允许休眠?

谁能帮我找出这些问题,谢谢!

0 投票
4 回答
36742 浏览

linux-kernel - SoftIRQ 和 Tasklet 之间的区别

在研究 Linux 中断处理时,我发现 Tasklet 和 SoftIRQ 是执行“下半部分”(优先级较低的工作)的两种不同方法。我理解这一点(非常真实的需要)。

不同之处在于,SoftIRQ 是可重入的,而 Tasklet 则不是。相同的 SoftIRQ 可以在不同的 CPU 上运行,而 Tasklet 则不是这样。

虽然我从表面上理解这一点,但我无法理解这两个功能的要求。在什么情况下我们可以使用这些设施?如何识别我现在应该使用 Tasklet,然后使用 SoftIRQ。

另外,我们所说的 Tasklet 是在 SoftIRQ 上制作的是什么意思?在我用 LKML 阅读的一本书中,有关于删除 Tasklet 的争论。我完全糊涂了,为什么要引入这样的功能?有些短视(没有冒犯的意思)?

对此的任何指示都会有很大帮助。

0 投票
1 回答
574 浏览

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 是否有某种方法可以在避免上述竞争条件的同时揭露自身?

0 投票
2 回答
2154 浏览

android - 如何在linux内核中定义和触发我自己的新softirq?

我想在 linux 内核中创建自己的 softirq。这样做是否正确:

init模块中,我想触发softirqfrom 我将添加一个调用:

在片段中,我想提出 softirq,我将添加对raise_softirq函数的调用:

并添加我的新softirq内容:

在这里:

问题:

  • 我是对的还是我错过了什么?
  • 这是正确的方法吗?还有其他选择吗?
0 投票
1 回答
791 浏览

c - 在 softirq 和进程上下文之间共享数据

我正在开发一个内核模块,它在 softirq(netfilter 预路由钩子)和用户上下文(在 ioctl 调用中)之间共享数据结构。

阅读此链接后,我知道我需要在修改数据(使用spin_lock_bhspin_lock_irqsave)时禁用用户上下文中的软件中断,并在完成对共享数据的操作后重新启用它们。

但是,我不确定是否需要在 softirq 处理函数中获取锁。我是否也需要在这里抓住锁(使用 spin_lock)?

据我了解,如果与另一个 softirq 或 hardirq 共享数据,我只需要在 softirq 处理程序中使用自旋锁。我的理解正确吗?

0 投票
1 回答
24459 浏览

linux - 为什么 softirq 用于高线程和高频率用途?

是什么让 softirq 如此特别,以至于我们将它用于高频用途,例如在网络驱动程序和块驱动程序中。

0 投票
0 回答
190 浏览

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负载。

0 投票
1 回答
1882 浏览

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

0 投票
2 回答
3200 浏览

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_disablelocal_irq_save禁用本地 cpu 的中断。这意味着本地 cpu 不会对任何 irq 做出反应,因此它不会运行任何中断返回路径,因此无法在那里运行 softirq。

假设我的上述陈述是正确的(我不确定),那么在local_bh_disable你调用之后调用preempt_disable并且local_irq_save(在进程上下文中)调用不是多余的吗?

0 投票
1 回答
90 浏览

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”的顶部输出: