Это допустимое состояние SKB? (где skb-> user=1 и skb_shinfo(skb)-> dataref= 0)

#linux #linux-kernel #network-programming #linux-device-driver #embedded-linux

#linux #linux-ядро #сетевое программирование #linux-драйвер устройства #встроенный-linux

Вопрос:

Следующая проблема касается буферов ядра Linux для управления сетевыми пакетами, известных как sk_buff.

Я довольно много читал о структуре ядра Linux sk_buff и API, но все еще есть некоторые проблемы, которые я пока не понимаю. Вот ситуация, с которой я столкнулся (пожалуйста, посмотрите на код ниже):

 while (dirty-- > 0) {
    if (likely(!rx_q->rx_skbuff[entry])) {
        struct sk_buff *skb;

        skb = netdev_alloc_skb_ip_align(priv->dev, bfsize);
        if (unlikely(!skb)) {
            break;
        }

        rx_q->rx_skbuff[entry] = skb;
    }
    /* 
    This section code has been added by me for debugging:
    */
    else {
        int refcount = refcount_read(amp;(rx_q->rx_skbuff[entry]->users));
        int dataref = (atomic_read(amp;skb_shinfo(rx_q->rx_skbuff[entry])->dataref) amp; SKB_DATAREF_MASK);
        if ( (refcount != 1) || (dataref != 1) ) {
            printk("rx_q->rx_skbuff[%d] is DIRTY but not NULL. refcount(%d), dataref(%d)n", 
                entry, refcount, dataref);
        }
    }
}
  

Иногда, когда код вводит оператор else, он выводит следующее:

 rx_q->rx_skbuff[a valid index] is DIRTY but not NULL. refcount(1), dataref(0)
  

Вопрос: Это допустимое состояние SKB? (где skb->user=1 и skb_shinfo(skb)->dataref=0 )
Я предполагаю, что skb_shinfo(skb)->dataref=0 это было каким-то образом перезаписано, но мне нужно это проверить.

Спасибо!! И если кому-то интересно, вот учебные пособия / статьи, которые я прочитал, чтобы разобраться в структуре sk_buff и API (они совсем не плохие):