On Wed, Nov 15, 2017 at 10:11 AM, John Fastabend <john.fastab...@gmail.com> wrote: > On 11/14/2017 04:41 PM, Willem de Bruijn wrote: >>> /* use instead of qdisc->dequeue() for all qdiscs queried with ->peek() */ >>> static inline struct sk_buff *qdisc_dequeue_peeked(struct Qdisc *sch) >>> { >>> - struct sk_buff *skb = sch->gso_skb; >>> + struct sk_buff *skb = skb_peek(&sch->gso_skb); >>> >>> if (skb) { >>> - sch->gso_skb = NULL; >>> + skb = __skb_dequeue(&sch->gso_skb); >>> qdisc_qstats_backlog_dec(sch, skb); >>> sch->q.qlen--; >> >> In lockless qdiscs, can this race, so that __skb_dequeue returns NULL? >> Same for its use in qdisc_peek_dequeued. >> > > Yes, agree if this was used in lockless qdisc it could race. However, > I don't think it is actually used in the lockless cases yet. For pfifo > fast __skb_array_peek is used.
Oh right. That will be easy to miss when other qdiscs are converted to lockless. Perhaps another location to add lockdep annotations. Related: what happens when pfifo_fast is used as a leaf in a non-lockless qdisc hierarchy, say htb? The individual leaves will still have TCQ_F_NOLOCK, so will try to take the qdisc lock in dequeue_skb and other locations, but that is already held? Thanks for revising and resubmitting the patchset, btw!