raise_softirq_irqoff源码
时间: 2023-10-06 08:11:11 浏览: 95
`raise_softirq_irqoff()` 函数是 Linux 内核中用于触发软中断的函数之一,其定义在 `include/linux/interrupt.h` 头文件中。
函数原型如下:
```c
void raise_softirq_irqoff(unsigned int nr);
```
该函数的参数 `nr` 代表要触发的软中断号,软中断号的取值范围为 `0 ~ NR_SOFTIRQS-1`,其中 `NR_SOFTIRQS` 定义在 `include/linux/interrupt.h` 头文件中,表示软中断的最大数量。
函数实现如下:
```c
void raise_softirq_irqoff(unsigned int nr)
{
unsigned long flags;
local_irq_save(flags);
__raise_softirq_irqoff(nr);
local_irq_restore(flags);
}
```
该函数首先保存当前 CPU 的中断状态,然后调用 `__raise_softirq_irqoff()` 函数触发软中断,最后恢复之前保存的中断状态。
`__raise_softirq_irqoff()` 函数实现如下:
```c
void __raise_softirq_irqoff(unsigned int nr)
{
unsigned long mask = 1UL << nr;
unsigned long *ptr = __get_cpu_var(softirq_pending);
barrier();
*ptr |= mask;
}
```
该函数首先计算出对应软中断的掩码 `mask`,然后通过 `__get_cpu_var()` 函数获取当前 CPU 的软中断挂起位图指针 `ptr`,最后将对应软中断的位设置为 1。
需要注意的是,`raise_softirq_irqoff()` 函数必须在关闭中断的情况下调用,否则在多 CPU 系统中可能会导致软中断的竞争条件。
阅读全文