interrupt context와 process context간 lock 사용 및 wait_queue 사용법 관련
1.인터럽트context와 process context간 공유자원 보호 방법
INTR context와 process context간 공유 자 원이 존재할 경우 다음과 같이 처리합니다.
Interrupt context에서는 mutex와semaphore의 사용이 불가능 (선점 될 수 있음)
그래서 interrupt context와 process context간 공유자원의 access 시 critical section을 잡을경우에는 spin_lock_irq을 사용
(spin_lock은 기본적으로 busy-wait임)
1. Interruptcontext
hub_irq_handler(…) { unsigned long flags; spin_lock_irqsave(&audio->lock, flags); // 여기서 공유자원에 access spin_unlock_irqrestore(&audio->lock, flags); } |
2. Processcontext
hub_start_pcm(…) { unsigned long flags; spin_lock_irqsave(&audio->lock, flags); // 여기서 공유자원에 access spin_unlock_irqrestore(&audio->lock, flags); } |
부연설명
1) Processcontext에서의 lock 사용시에는 spin_lock 사용
2) Interruptcontext와 process context간 lock 공유시에는 spin_lock_irq 사용
spin_lock_irq 시 interrupt 처리를 하지 않음
3) Interruptnesting이 가능한 경우, (여러 interrupt가 발생 가능한 경우)는 spin_unlock_irq 시 모든 interrupt를enable 시키기에
이경우엔, spin_lock_irqsave 사용 (위 ex. 경우)
2.대기 방법
data__write 시wait_queue_head_t에서 wait 방법
data_write(…) { int ret;
// 버퍼 copy 작업 수행
// 버퍼의 소진을 wait_queue에서 기다림 ret = wait_event_timeout(wq[ch]->wait_command_queue, condition_to_check, UCODE_READY_TIMEOUT); } |
ISR 이후 bottom half에서 깨워주는코드
hub_workqueue_handler(…) { wake_up(&wq[ch]->wait_command_queue); } |
'Linux' 카테고리의 다른 글
Linux kernel: kthread & wait_event_interruptible 사용법 (0) | 2018.03.18 |
---|---|
process scheduling (0) | 2015.10.02 |
Linux kernel: kthread & wait_event_interruptible 사용법 (0) | 2015.07.04 |
Kinux kernel Bottom half 정리 (softirq, tasklet, workqueue) - part 1 (0) | 2015.07.04 |
Kinux kernel Bottom half 정리 (softirq, tasklet, workqueue) - part 2 (0) | 2015.07.04 |
댓글