中断上下文能睡眠吗?
没有 task_struct 的 ISR
众所周知,中断上下文不能睡眠,但是这句话细说起来,还是有很多值得深究的地方。所谓中断上下文,就是中断触发后,执行中断服务例程 (Interrupt Service Routine/Interrupt Handler) 的资源,这些资源有哪些呢?少得可怜,除了执行 ISR 代码的 CPU 核心外,中断上下文甚至都没有自己的栈来保存临时变量,所有的资源都是抢占中断触发时那个进程的,显然不能让这种“抢占”持续太久,所以 Linux 内核就将 ISR 分成了 top 和 bottom 两部分,也就是硬件中断上下文和软件中断上下文, 所以严格来说是,在 Linux 内核中,硬件中断上下文不能睡眠。
drm_gpu_scheduler
flowchart TD
subgraph GPU
slot-0[HW Run Queue]
slot-1[HW Run Queue]
slot-2[HW Run Queue]
end
sched0[drm_gpu_scheduler]
sched1[drm_gpu_scheduler]
sched2[drm_gpu_scheduler]
runq00[drm_sched_rq<br>KERNEL]
runq01[drm_sched_rq<br>HIGH]
runq02[drm_sched_rq<br>NORMAL]
runq03[drm_sched_rq<br>LOW]
runq10[drm_sched_rq<br>KERNEL]
runq11[drm_sched_rq<br>HIGH]
runq20[drm_sched_rq<br>KERNEL]
runq21[drm_sched_rq<br>HIGH]
runq22[drm_sched_rq<br>NORMAL]
entity00@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity01@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity02@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity03@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity10@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity11@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity12@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity20@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity21@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity22@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity00 --> entity01 --> entity02 --> entity03 --> runq00
entity10 --> entity11 --> entity12 --> runq10
entity20 --> entity21 --> entity22 --> runq02
runq00 --> sched0
runq01 --> sched0
runq02 --> sched0
runq03 --> sched0
runq10 --> sched1
runq11 --> sched1
runq20 --> sched2
runq21 --> sched2
runq22 --> sched2
sched0 --> slot-0
sched1 --> slot-1
sched2 --> slot-2
这年初二
![]() |
小小的人儿 捂住双耳 这年初二 |
GPU Firmware
1 | UVD feature version: 0, firmware version: 0x40000d00 |