2016-10-29 6 views
2

필자는 특정 조건이 충족 될 때까지 쓰기 작업이 실행되지 않도록해야하는 sysfs 인터페이스를 가지고 있습니다.작업 예약 금지

차단 해제의 조건은 같은 형식으로되어 있기 때문에 조건의 성격, 내가 schedule_timeout가 사용할 수있는 권리 메커니즘 생각하지 않는다의

if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) { 
    // Unblock task and let it run again 
} 

; 또는 적어도, 나는 그것을 사용하는 방법을 알아 내지 못한 다음 대기 시간을 취소/적절하게 프로세스 신호.

내가 수동으로하여 sysfs 쓰기에 다음과 같은 일을 시도

: 조건이 충족 될 때 다음

... 
__set_current_state(TASK_INTERRUPTIBLE); 
schedule(); 
... 

과 :

if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) { 
    set_task_state(tsk, TASK_RUNNING); 
} 

이 결과 : BUG: scheduling while atomic: dummyThread/2622/0x00000002
을 감안할 때, 어떻게 schedule_timeout거의 같은 로직이 나올 수도 있습니다. 같은 오류가 발생할 수도 있습니다. BUG: scheduling while atomic: ... erro 아르 자형.

또한 deactivate_taskactivate_task 메서드를 시도했지만 스케줄러의 pick_next_task 체인에서 커널 패닉이 발생합니다. 필요한 경우, 이것을 다시 구현하고 스택 추적을 게시합니다.

특정 조건이 충족 될 때까지 작업이 실행되지 않도록하는 올바른 방법은 무엇입니까?

+0

어쩌면 어리석은 질문 일지 모르지만 내가 이해하는 것으로부터 사용자 공간 프로세스가 쓰기를 시도하면 허용하기 전에 다시 쓸 수 없어야합니다. 그렇다면 왜 write 메소드에서 I/O를 차단하지 않을까요? 그런 식으로 조건이 충족 될 때까지 작가를 차단하거나 데이터를 사용할 수 있습니다. O_NONBLOCK이 지정되어 있지 않으면 I/O 작업 (쓰기)이 이미 차단되었음을 알고 작업 상태를 수동으로 변경하는 것이 약간 이상한 것 같습니다. 그러면 간단한 세마포가 작동할까요? –

+0

동의합니다. 그것은 간단해야합니다. 그러나 세마포어를 획득하면 결과적으로 결국'schedule()'을 호출하게되고, 나의 경우에는'BUG : atomic while : scheduling ... '이 발생합니다. –

답변

1

schedule_timeout()은 시간 초과 대기에 적합한 저수준 기능입니다.

그러나 set_task_state()은 깨우기위한 나쁜 선택입니다.이 기능은 주로 현재 스레드 용입니다. 대신 wake_up_process 또는 wake_up_state을 사용하십시오.

+0

이 작품! 'fs/proc/base.c'에있는 다른 함수에서 빌린 보일러 플레이트 코드가'get_proc_task()'와'task_lock()'내에서'schedule_timeout' 논리를 호출하게했습니다. 일단이 코드를 다른 곳으로 옮기고 나면, 'BUG : atomic while : scheduling ...' –