Linux

interrupt context와 process context간 lock 사용 및 wait_queue 사용법 관련

Roien 2015. 7. 4.
반응형

1.인터럽트context process context간 공유자원 보호 방법

INTR context process context간 공유 자 원이 존재할 경우 다음과 같이 처리합니다.

 

Interrupt context에서는 mutexsemaphore의 사용이 불가능 (선점 될 수 있음)

그래서 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 시 모든 interruptenable 시키기에

이경우엔, 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);

}



 

반응형

댓글