๊ฐ์ ๐
์ฌ๋ด ์ปค๋ ์คํฐ๋์์ ๊ต์ฌ๋ก์ ์ฌ์ฉํ๊ณ ์๋ ๋๋ฒ๊น ์ ํตํด ๋ฐฐ์ฐ๋ ๋ฆฌ๋ ์ค ์ปค๋์ ๊ตฌ์กฐ์ ์๋ฆฌ ์ฑ ์์๋ ํ์คํฌ๋ฆฟ (Tasklet)์ SoftIRQ์ ํจ๊ป ์๋์ ๊ฐ์ด ์ค๋ช ํ๋ค.
SoftIRQ ์๋น์ค ์ค ํ๋๋ก ๋์ ์ผ๋ก Soft IRQ ์๋น์ค๋ฅผ ์ธ ์ ์๋ ์ธํฐํ์ด์ค์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ํจ๊ป Tasklet์ ์คํ ๋จ๊ณ์ ๋ํ ๋ด์ฉ์ด ์์ธํ๊ฒ ๊ธฐ์ ๋์ด ์๋ค.
์ธํฐ๋ฝํธ ํธ๋ค๋ฌ์์ task_schedule() ํจ์๋ฅผ ํธ์ถํด ํ์คํฌ๋ฆฟ ์ค์ผ์ฅด๋ง์ ์คํํ๋ค. task_schedule() ํจ์๋ raise_softirq_irqoff() ํจ์๋ฅผ ํธ์ถํด TASKLET Soft IRQ ์๋น์ค๋ฅผ ์์ฒญํ๋ค. Soft IRQ ์๋น์ค ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๋ __do_softirq() ํจ์์์ ํ์คํฌ๋ฆฟ ์๋น์ค ํธ๋ค๋ฌ์ธ tasklet_action() ํจ์๋ฅผ ํธ์ถํ๋ค. Soft IRQ ์๋น์ค ํธ๋ค๋ฌ๋ฅผ ์คํํ ํ ์คํ ์๊ฐ์ ์ฒดํฌํด ksoftirqd ๋ฅผ ๊นจ์ฐ๊ณ ์คํ์ ๋ง๋ฌด๋ฆฌํ๋ค. ksoftirqd ์ค๋ ๋์์ ํ์คํฌ๋ฆฟ ์๋น์ค ํธ๋ค๋ฌ์ธ tasklet_action() ํจ์๋ฅผ ํธ์ถํ๋ค. tasklet_action() ํจ์์์ ํ์คํฌ๋ฆฟ ํธ๋ค๋ฌ ํจ์๋ฅผ ํธ์ถํ๋ค. ์ฑ ์์๋ SoftIRQ๋ฅผ ์ธํฐ๋ฝํธ ํ๋ฐ๋ถ๋ฅผ ๋นจ๋ฆฌ ์ฒ๋ฆฌํด์ผ ํ ๋ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ผ๋ก ์ค๋ช ํ๊ณ ์๊ณ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ์์ SoftIRQ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก์ Tasklet ์๋น์ค๋ฅผ ์ค๋ช ํ๊ณ ์๋ค. ๊ทธ๋ฐ๋ฐ ์์ ์์ค ์ฝ๋ ๊ธฐ๋ฐ์ด๋ผ ๊ทธ๋ฐ์ง ์ฐพ์๋ณธ ๋ด์ฉ๊ณผ ๋ค๋ฅธ ๋ถ๋ถ์ด ์๋ค. ์ต์ ์ฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐพ์๋ณด๋ฉด tasklet์ ๋ํด ์๋์ ๊ฐ์ด ์ค๋ช ํ๋ค.
/* Tasklets — multithreaded analogue of BHs.
This API is deprecated. Please consider using threaded IRQs instead: https://lore.kernel.org/lkml/20200716081538.2sivhkj4hcyrusem@linutronix.de
Main feature differing them of generic softirqs: tasklet is running only on one CPU simultaneously.
Main feature differing them of BHs: different tasklets may be run simultaneously on different CPUs.
Properties:
- If tasklet_schedule() is called, then tasklet is guaranteed to be executed on some cpu at least once after this.
- If the tasklet is already scheduled, but its execution is still not started, it will be executed only once.
- If this tasklet is already running on another CPU (or schedule is called from tasklet itself), it is rescheduled for later.
- Tasklet is strictly serialized wrt itself, but not wrt another tasklets. If client needs some intertask synchronization, he makes it with spinlocks. */
$linux/include/linux/interrupt.h
์ฝ๋์์๋ ํ์คํฌ๋ฆฟ ๋์ Threaded IRQ๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถํ๋ค. ์ฝ๋ฉํธ์ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด ํ์คํฌ๋ฆฟ ๋งคํฌ๋ก๋ฅผ ์์ ํ ๊ฑด์ ๋ํ ํจ์น์์ ํ์คํฌ๋ฆฟ์ ๋ณ๋์ ์์ (refactor all tasklet users into other APIs ยท Issue #94 ยท KSPP/linux)์ผ๋ก ์ ๊ฑฐํ์๋ ์๊ธฐ๊ฐ ๋์จ๋ค. ๋ ผ์ ๋ด์ฉ์ ์ ์ ๋ฆฌํ LWN ๊ธฐ์ฌ(Modernizing the tasklet API [LWN.net]) ๋ ์ฐพ์ ์ ์์๋๋ฐ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
Threaded IRQ ๋ atomic context์์ ์คํ๋๋ฏ๋ก tasklet์ ๋์ฒด๋ ์ ์๋ค. ์ฝ์ด ๊ฐ๋ฐ์๋ค๋ ํ์คํฌ๋ฆฟ์ API๋ฅผ ๊ฐ์ ํ๋ ๊ฒ๋ณด๋ค ์ ๊ฑฐํ๋ ๊ฒ ๋ ํฐ ์์ ์ด์ง๋ง next step ์ผ๋ก ์ ๊ฑฐํ๋ ๋ฐ์๋ ๋์ํ์๋ค. LWN ์์ ์ด์ ์ ๋ค๋ฃฌ ๋ด์ฉ์ด์ง๋ง ํ์คํฌ๋ฆฟ์ software interrupt mode์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ highest-priority ํ์คํฌ๋ค์ ๋ธ๋กํ ์ ์๋ latency ์ ํ ๋ฌธ์ ๊ฐ ์๋ค. Tasklet์ workqueues, timers, threaded interrupts๋ก ๋์ฒด ๊ฐ๋ฅํ๋ค. Threaded irq๋ฅผ ์ฌ์ฉํ๋ฉด ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ ์์ฒด์์ ์คํ๋ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ ๊ท ๋งค์ปค๋์ฆ๋ค์ ํ์คํฌ๋ฆฟ์ ๋จ์ ๋ค์ด ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด(?) ๊ฐ๋ฐ์๋ค์ด tasklet ์ ์ธ ์ด์ ๊ฐ ์๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ํ์คํฌ๋ฆฟ์ ๊ผญ ์จ์ผํ๋ค๋ฉด ์ด์ฉ ์ ์๊ฒ ์ง๋ง ์ดํ์ ์๋ก ๋์จ ๋ฐฉ๋ฒ๋ค๋ก๋ ์ถฉ๋ถํ BH ๋ฅผ ๋ค๋ฃฐ ์ ์์ผ๋ฉฐ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ ์ธํ๊ณ ๊ตณ์ด ์จ์ผํ๋ ์ด์ ๋ ์๋ค๋ ๊ฒ์ด๋ค. ํ์คํฌ๋ฆฟ์ ๋ฐ๋์ ์จ์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ํ๋จํด์ผ ํ๋ค๋ฉด ์๋ ๋งํฌ๋ค๊ณผ ๊ต์ฌ ๋ด์ฉ์ ํจ๊ป ์ฐธ๊ณ ํด๋ณด์.
์ฐธ๊ณ ๐
- Modernizing the tasklet API [LWN.net]
- Re: [PATCH 0/3] Modernize tasklet callback API - Allen (kernel.org)