Tasklet

ยท 1130 words ยท 3 minute read

๊ฐœ์š” ๐Ÿ”—

์‚ฌ๋‚ด ์ปค๋„ ์Šคํ„ฐ๋””์—์„œ ๊ต์žฌ๋กœ์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋ฐฐ์šฐ๋Š” ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ๊ตฌ์กฐ์™€ ์›๋ฆฌ ์ฑ…์—์„œ๋Š” ํƒœ์Šคํฌ๋ฆฟ (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)