> There is another difference between reading sk_peek_offset in the > caller or in __skb_try_recv_from_queue. The latter is called repeatedly > when it returns NULL. Each call can modify *off. I believe that it needs > to restart with _off at sk->sk_peek_off each time, as it restarts from the > head of the queue each time.
I made a mistake here. *off is not updated when returning NULL. In that case, it is better to read sk_peek_offset once, than to read it each time __skb_try_recv_from_queue is entered.