리눅스 커널 코드에서 local_bh_disable() 을 쓰는 이유가 궁금합니다.

trymp의 이미지


리눅스에서 필요시에 local_bh_disable() 로 BH softIRQ 를 금지시키는 걸로 알고 있는데요

네트워크에서 패킷을 처리하는 루틴에서 전역 PER CPU 변수 처리시에

local_bh_disable() 을 해주지 않으면 변수 구조체의 값이 깨지는 경우를 확인하였습니다.

한가지 예로 동일 core 에서 패킷을 ip_rcv() 함수에서 수신했을때,

그 함수 도중에 갑자기 soft_IRQ raise 되서 다른 패킷이 먼저 처리될 수도 있는건가요?

아니면 함수 도중에 그 함수로 재진입이 이루어지는 건가요?

아직 softIRQ 영역에서 처리시 local_bh_disable() 금지시키는 이유가 명확하게 이해가 되지 않습니다.

고수님들의 조언 부탁드립니다

shint의 이미지

- 예시와 설명이 보이네요.

//local_bh_disable()

spin_lock 때문에 애좀 먹었다.
http://pak2536.tistory.com/93

[Tech] 리눅스 커널에 대하여
https://blog.naver.com/gluesys/70097399057

https://blog.naver.com/leojesus/80165280102

[PATCH RT 16/22] crypto: cryptd - add a lock instead preempt_disable/local_bh_disable
https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1760245.html

local_bh_disable()/local_bh_enable() include/linux/interrupt.h
https://www.kernel.org/doc/htmldocs/kernel-hacking/routines-softirqs.html

local_bh_disable, preempt_disable, local_irq_disable
https://stackoverflow.com/questions/24260087/local-bh-disable-preempt-disable-local-irq-disable

//
IRQ 리눅스 - 네이버 북
https://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=IRQ+리눅스

리눅스 커널 - 네이버 북
https://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=리눅스+커널

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com