2015-01-16 4 views
0

kfree_skb 사용과 관련하여 몇 가지 문제가 있습니다. 이상한 방법으로 코드 동작합니다 3 줄,kfree_skb() 예기치 않은 동작

printk(KERN_ALERT"1 - SKB user: %d", atomic_read(&skb->users)); 
kfree_skb(skb); 
printk(KERN_ALERT"2 - SKB user: %d", atomic_read(&skb->users)); 

아래 나는 두 번째의 printk 내가 SKB 해방 이후 커널 패닉이 발생합니다 있지만 그렇지 않은 기대합니다. 이 행의 출력은 다음과 같습니다.

1 - SKB user: 1 
2 - SKB user: 2 

내가 놓친 요점은 무엇인가요?

편집 : 죄송합니다. 두 번째 출력을 잘못 입력했습니다. 다음과 같습니다 :

2 - SKB user: 1 
+0

나는 당신이 ar에 유효한 포인터가있는 운이 좋다는 것을 생각한다 여기서 임의의 데이터. – 0andriy

답변

0

skb를 해제하면 다른 스레드에서 할당 될 가능성이 큽니다. 그냥 다시

printk(KERN_ALERT"2 - SKB user: %d", atomic_read(&skb->users)); 

스레드 1

지금 그런 다음이

Thread 1: 

printk(KERN_ALERT"1 - SKB user: %d", atomic_read(&skb->users)); 
kfree_skb 
-------> scheduled out 

Thread 2: 
alloc_skb() 
//inc user count (whatever the kernel call) 
-------> Scheduled out 

생각 당신은 사용자 수를 얻을 수있는 가능성이 지금은 매우 높은 2.

SKBS는 슬랩 캐시에서 할당되기 때문에 , 그것은 지금 막 지금 막 자유로 웠던 skb가 첫째로 할당되는 얻는다

+0

출력 섹션에 실수가 있습니다. 죄송합니다. 수정했습니다. – auc

+0

이 경우에도 대답은 변경되지 않습니다. 그냥 "// inc 사용자 수 (커널 호출이 무엇이든)"경우는 발생하지 않습니다. – sysinit