#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 (они совсем не плохие):