Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b0a231a2 authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller
Browse files

net: caif: avoid using qdisc_qlen()



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: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4c75be07
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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;
	}