TCP 패킷을 수신할 때 local_bh_enable 하는 이유를 모르겠습니다.
커널에서 네트워크 부분을 공부하고 있는 사람입니다.
TCP 패켓의 수신처리 부분을 보고 있는데요. tcp_input.c 에서 tcp_data_queue() 함수입니다.
그런데 아래 처럼 user buffer 부분에 복사를 할 때 local_bh_enable()을 하는 이유를 모르겠습니다.
이부분이 원래 bh 가 disable 이 되어 있던 코드인가요?? 왜 복사하는 부분에만 BH 을 활성화시키는지 모르겠습니다.
제가 커널에 대한 개념이 부족해서 고수님들의 조언 부탁드립니다.
---------------------------------------------------------------------------------------
/* Queue data for delivery to the user.
* Packets in sequence go to the receive queue.
* Out of sequence packets to the out_of_order_queue.
*/
if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt) {
if (tcp_receive_window(tp) == 0)
goto out_of_window;
/* Ok. In sequence. In window. */
if (tp->ucopy.task == current &&
tp->copied_seq == tp->rcv_nxt && tp->ucopy.len &&
sock_owned_by_user(sk) && !tp->urg_data) {
int chunk = min_t(unsigned int, skb->len,
tp->ucopy.len);
__set_current_state(TASK_RUNNING);
local_bh_enable();
if (!skb_copy_datagram_iovec(skb, 0, tp->ucopy.iov, chunk)) {
tp->ucopy.len -= chunk;
tp->copied_seq += chunk;
eaten = (chunk == skb->len && !th->fin);
tcp_rcv_space_adjust(sk);
}
local_bh_disable();
}
검색하러왔다가 씁니다.
저도 궁금해서 skb_copy_datagram_iovec 함수 쫒아가보니 스케쥴링 구간이 있네요.(copy_to_user 쪽..)
스케쥴링 하려면 softIRQ 를 disable 해야 하나요??
??
스케쥴링 하려면 softIRQ 를 disable 해야 하나요??
??
댓글 달기