QUOTE (Olej @ Jun 24 2017, 00:23)
Комментарии говорят совсем о другом, о том, что очередь сокетных буферов может быть изменена (переставлена, перетасована). Но это вовсе не значит, что изменится хоть один конкретный struct sk_buff*.
Комментарии к функции дважды это упоминают:
CODE
/**
* __pskb_pull_tail - advance tail of skb header
* ...
* All the pointers pointing into skb header may change and must be
* reloaded after call to this function.
*/
/* Moves tail of skb head forward, copying data from fragmented part,
* when it is necessary.
* 1. It may fail due to malloc failure.
* 2. It may change skb pointers.
* ...
*/
Функция изменяет как минимум два указателя, tail и data_len, это видно из кода.
QUOTE
Но![/b]
Кроме того, если вы лезете в такую глубину, то:
- должны бы знать, что API ядра, начинающиеся с __ (2-х _) предназначены для внутреннего использования, а не для сторонних вызовов в качестве API;
Такого правила, "высеченного в камне", нет. Использование функций с "__" префиксом широко практикуется в драйверах, там где это оправданно, например исключить проверки и валидации входных параметров, поскольку это уже сделано в коде драйвера. Более того, __pskb_pull_tail() экспортируемый символ, следовательно может использоваться.
QUOTE
- должны бы прочитать, в тех же комментариях, что это вызов сложный, экзотика и вызывается только в исключительных случаях.
Эта функция вызывается из pskb_may_pull(), в чем экзотика?