alloc_skb(..) 에서 궁금한 것.

지나가는새의 이미지

다음은 net/core/skbuff.c의 일부입니다.

struct sk_buff *alloc_skb(unsigned int size,int gfp_mask)
{
    struct sk_buff *skb;
    u8 *data;

    if (in_interrupt() && (gfp_mask & __GFP_WAIT)) {
        static int count = 0;
        if (++count < 5) {
            printk(KERN_ERR "alloc_skb called nonatomically "
                   "from interrupt %p\n", NET_CALLER(size));
            BUG();
        }
        gfp_mask &= ~__GFP_WAIT;
    }

여기서 if( ++count < 5 ) { ... 부분이 어떻게 필요하게 된건지 궁금하네요.
둘 사이의 분기는 panic이냐 아니냐의 큰 차인데, 제가 보기에 무조건 panic인것 처럼 보이는데.. 게다가 static int란 말입죠. 허 참 궁금함다.
kyong의 이미지

지나가는새 wrote:
다음은 net/core/skbuff.c의 일부입니다.

struct sk_buff *alloc_skb(unsigned int size,int gfp_mask)
{
    struct sk_buff *skb;
    u8 *data;

    if (in_interrupt() && (gfp_mask & __GFP_WAIT)) {
        static int count = 0;
        if (++count < 5) {
            printk(KERN_ERR "alloc_skb called nonatomically "
                   "from interrupt %p\n", NET_CALLER(size));
            BUG();
        }
        gfp_mask &= ~__GFP_WAIT;
    }

여기서 if( ++count < 5 ) { ... 부분이 어떻게 필요하게 된건지 궁금하네요.
둘 사이의 분기는 panic이냐 아니냐의 큰 차인데, 제가 보기에 무조건 panic인것 처럼 보이는데.. 게다가 static int란 말입죠. 허 참 궁금함다.

__GFP_WAIT로 call 했다면 schedule 될 수 있다는 뜻인데 그러므로
interrupt context에서는 호출 돼서는 안됩니다. 그래서 4번 정도 경고 주는
것입니다. __GFP_WAIT는 빼 버리고요.
프로그래머의 잘못에 알아서 커널이 대처하고 있는 것이지요.