0

일반적으로 sk_buff는 전송 측에서 "alloc_skb"을 통해 네트워크 드라이버에 제공 한 모듈 (네트워크 드라이버에 대한 인터페이스)에 의해 할당되며 네트워크 드라이버에 제공됩니다. 그것은 기본적으로 네트워크 드라이버에 의해 보낸 후 무료입니다.SKB 할당 감지 및 무료

내 개발 된 모듈에서 SKB를 무료로 사용할 수있는 방법이 있습니까? 아니면 네트워크 드라이버가 SKB 버프를 올바르게 해제하는지 확인하는 방법이 있습니까?

+0

"송신 측"이라고 말하면 무엇을 의미합니까? 나중에 "네트워크 드라이버"로 구별하고 결국 "내 송신자 드라이버"라는 단어를 사용하기 때문에. 따라서, "전송 측"이 무엇인지, 그리고 어떤 네트워크 드라이버 (커널에서 실행 중인지)가 무엇인지 명확하게 설명해 주시겠습니까? 당신이 찾고있는 것은'sk_buff' 참조 카운터 일 것입니다. 'sk_buff'에서 필드'users'를 증가시켜 버퍼를 비우는 것이 안전하지 않다는 것을 나타낼 수 있습니다. 필드는 http://elixir.free-electrons.com/linux/latest/source/include/linux/skbuff.h#L764입니다. –

+0

질문이 제대로 업데이트되었습니다. –

답변

1

올바르게 회신하면 버퍼의 "송신 측"에 skb_get() ~ increment reference counter을 사용할 수 있습니다. 이것은 네트워크 드라이버가 유선 상태에서 버퍼를 비우기로 결정하자마자 참조 카운터를 감소시키는 적절한 함수를 호출하지만 여전히 이전의 + 1 때문에 0이 아닌 값을 유지하게됨을 의미합니다. 해방되지 않을 것이다. 그런 다음 버퍼를 유지하고 필요할 때마다 무료로 사용할 수 있습니다 (마지막 사용자). 당신이 체인sk_buff의 -s이있는 경우

그러나, 나는 당신이 각 세그먼트에 skb_get()를 수행 할 필요가 두려워.

네트워크 드라이버 자체가 버퍼를 올바르게 해제해야하는 경우 네트워크 드라이버에서 송신 및 삽입 디버그 출력시 버퍼가 해제되는 위치를 찾을 수 있습니다. 그런 다음 다시 컴파일하고 정상적인 방법으로 드라이버와 상호 작용을 시도한 다음 (즉, skb_get()을 실행하지 않고 드라이버에 버퍼를 넘김) 디버그 출력을 확인하십시오 (dmesg).

+0

감사합니다. 내가 sk-buff-s 체인을 가지고 있기 때문에 나는 네트워크 드라이버에서 디버깅을 시도 할 것이다. –

관련 문제