Skip to content

Commit

Permalink
net: caif: avoid using qdisc_qlen()
Browse files Browse the repository at this point in the history
Such helper does not cope correctly with NOLOCK qdiscs.
In the following patches we will move back qlen to per CPU
values for such qdiscs, so qdisc_qlen_sum() is not an option,
too.
Instead, use qlen only for lock qdiscs, and always set
flow off for NOLOCK qdiscs with a not empty tx queue.

Signed-off-by: Paolo Abeni <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Paolo Abeni authored and davem330 committed Apr 10, 2019
1 parent 4c75be0 commit b0a231a
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions net/caif/caif_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,15 +186,19 @@ static int transmit(struct cflayer *layer, struct cfpkt *pkt)
goto noxoff;

if (likely(!netif_queue_stopped(caifd->netdev))) {
struct Qdisc *sch;

/* If we run with a TX queue, check if the queue is too long*/
txq = netdev_get_tx_queue(skb->dev, 0);
qlen = qdisc_qlen(rcu_dereference_bh(txq->qdisc));

if (likely(qlen == 0))
sch = rcu_dereference_bh(txq->qdisc);
if (likely(qdisc_is_empty(sch)))
goto noxoff;

/* can check for explicit qdisc len value only !NOLOCK,
* always set flow off otherwise
*/
high = (caifd->netdev->tx_queue_len * q_high) / 100;
if (likely(qlen < high))
if (!(sch->flags & TCQ_F_NOLOCK) && likely(sch->q.qlen < high))
goto noxoff;
}

Expand Down

0 comments on commit b0a231a

Please sign in to comment.