From 2bd7ccf52392fe5700adb4a2555d8beddd96efa0 Mon Sep 17 00:00:00 2001 From: Luc Ma Date: Tue, 14 Jan 2025 17:44:24 +0800 Subject: [PATCH] linux: [gpu-sched]describle state transition more specifically Signed-off-by: Luc Ma --- source/_drafts/kernel-sync.md | 55 ++++++++++++++++++++++++++++++++-- source/_posts/lnx/gpu-sched.md | 4 +-- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/source/_drafts/kernel-sync.md b/source/_drafts/kernel-sync.md index 0369d6089..e994dc07a 100644 --- a/source/_drafts/kernel-sync.md +++ b/source/_drafts/kernel-sync.md @@ -13,11 +13,60 @@ categories: linux 信号量的实现基于一个变量,根据这个变量的取值范围可以把信号量分为 -- binary semaphore (0/1) -- normal semaphore (non-negative integer) +- binary semaphore (= 1, mutex) +- normal semaphore (> 1, counting semaphore) 信号量的操作叫 **Acquire** 和 **Release**, 对应的实现是 `void down(struct semaphore *)` 和 `void up(struct semaphore *)` +- down + +```c +static inline int __sched ___down_common(struct semaphore *sem, long state, + long timeout) +{ + struct semaphore_waiter waiter; + + list_add_tail(&waiter.list, &sem->wait_list); + waiter.task = current; + waiter.up = false; + + for (;;) { + if (signal_pending_state(state, current)) + goto interrupted; + if (unlikely(timeout <= 0)) + goto timed_out; + __set_current_state(state); + raw_spin_unlock_irq(&sem->lock); + timeout = schedule_timeout(timeout); + raw_spin_lock_irq(&sem->lock); + if (waiter.up) + return 0; + } + + timed_out: + list_del(&waiter.list); + return -ETIME; + + interrupted: + list_del(&waiter.list); + return -EINTR; +} +``` + +- up + +```c +static noinline void __sched __up(struct semaphore *sem) +{ + struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list, + struct semaphore_waiter, list); + list_del(&waiter->list); + waiter->up = true; + wake_up_process(waiter->task); +} +``` + # References -- [Synchronization primitives in Linux kernel](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/) \ No newline at end of file +- [Synchronization primitives in Linux kernel](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/) +- [https://yarchive.net/comp/linux/semaphores.html](https://yarchive.net/comp/linux/semaphores.html) diff --git a/source/_posts/lnx/gpu-sched.md b/source/_posts/lnx/gpu-sched.md index a208faef5..75efb13e0 100644 --- a/source/_posts/lnx/gpu-sched.md +++ b/source/_posts/lnx/gpu-sched.md @@ -19,11 +19,11 @@ stateDiagram-v2 P: parked I: idle - R --> S: Wait for Sth + R --> S: schedule_timeout() R --> D: Wait for Disk I/O R --> T: SIGTSTP R --> t: gdb/strace - S --> R: Sth Available + S --> R: wake_up_process() D --> R: I/O Completed T --> R: SIGCONT T --> t: gdb/strace