On 16-08-23 02:08 PM, Eric Dumazet wrote:
> On Tue, 2016-08-23 at 13:23 -0700, John Fastabend wrote:
>> This patch adds a flag for queueing disciplines to indicate the
>> stack does not need to use the qdisc lock to protect operations.
>> This can be used to build lockless scheduling algorithms and
>> improving performance.
>>
[...]
>> * Heuristic to force contended enqueues to serialize on a *
>> separate lock before trying to get qdisc main lock. @@ -3898,19
>> +3913,22 @@ static void net_tx_action(struct softirq_action *h)
>>
>> while (head) { struct Qdisc *q = head; - spinlock_t
>> *root_lock; +
>> spinlock_t *root_lock = NULL;
>>
>> head = head->next_sched;
>>
>> - root_lock = qdisc_lock(q); -
>> spin_lock(root_lock); + if
>> (!(q->flags & TCQ_F_NOLOCK)) { + root_lock =
>> qdisc_lock(q); +
>> spin_lock(root_lock); + } /* We need to make sure
>> head->next_sched is read * before clearing __QDISC_STATE_SCHED */
>> smp_mb__before_atomic(); clear_bit(__QDISC_STATE_SCHED,
>> &q->state); qdisc_run(q); - spin_unlock(root_lock); +
>> if
>> (!(q->flags & TCQ_F_NOLOCK))
>
> This might be faster to use : if (root_lock) (one less memory read
> and mask)
>
hmm this actually gets factored out in patch 12 but I'll go ahead
and make this change and then I think it reads a bit better through
the series.
>> + spin_unlock(root_lock); } } } diff --git
>> a/net/sched/sch_generic.c b/net/sched/sch_generic.c index
>> e305a55..af32418 100644 --- a/net/sched/sch_generic.c +++
>> b/net/sched/sch_generic.c @@ -170,7 +170,8 @@ int
>> sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, int ret =
>> NETDEV_TX_BUSY;
>>
>> /* And release qdisc */ - spin_unlock(root_lock); + if (!(q->flags
>> & TCQ_F_NOLOCK)) + spin_unlock(root_lock);
>
> You might use the same trick, if root_lock is NULL for lockless
> qdisc.
So what I just did is pass NULL into sch_direct_xmit() for root_lock
when the qdisc is lockless. This replaces the qdisc flags checks in this
call to checking root_lock.
Seems like a nice cleanup/optimization. I'll wait a bit and then push
it in v2 after giving folks a day or two to review this set.