[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAL87dS3zUG65ADXD4E2EnBSO_4FBrB4k=uLc_cT0tr7gbPeMOA@mail.gmail.com>
Date: Wed, 30 Jun 2021 16:42:21 +0800
From: mingkun bian <bianmingkun@...il.com>
To: netdev@...r.kernel.org
Subject: [ISSUE] EDT will lead ca_rtt to 0 when different tx queue have
different qdisc
Hi,
I found a problem that ca_rtt have a small chance to become 0 when
using EDT, then find that it is caused by different tx queue which
have different qdisc as following:
The case may be caused by my operation of the network card(ethtool -L
ethx combined 48)
1. Network card original num_tx_queues is 64, real_num_tx_queues
is 24, so in "mq_init" and "mq_attach", only the first 24 queues are
set by default qdisc(fq),
and the last 40 queues are set to pfifo_fast_ops.
2. After the system starts, I exec "ethtool -L ethx combined 48"
to make the tx/rx queue to 48, but it does not modify qdisc's
configuration,
at this time for bbr, bbr will use fq when "
__dev_queue_xmit->netdev_pick_tx" select the first 24 queues, and bbr
will use tcp stack's timer(qdisc is pfifo_fast_ops) when "
__dev_queue_xmit->netdev_pick_tx" select the last24 queues,
and in this case, bbr works normally.
3. The wrong scenario is:
a. tcp select one of the first 24 tx queues to send, then sch_fq
change sk->sk_pacing_status from SK_PACING_NEEDED to SK_PACING_FQ,
then tcp will use fq to send.
b. after a while, not sure for some reason, __dev_queue_xmit->
netdev_pick_tx select the last 24 queues which qdisc is
pfifo_fast_ops, then qdisc send this skb immediately(no pacing), then
ca_rtt = curtime - skb->timestamp_ns, skb->timestamp_ns may be bigger
than curtime.
Why does not get_default_qdisc_ops return all queues to the default qdisc?
get_default_qdisc_ops(const struct net_device *dev, int ntx)
{
return ntx < dev->real_num_tx_queues ?
default_qdisc_ops : &pfifo_fast_ops;
}
Thanks.
Powered by blists - more mailing lists