diff --git a/homa_qdisc.c b/homa_qdisc.c index b84ef03c..12d174c2 100755 --- a/homa_qdisc.c +++ b/homa_qdisc.c @@ -1400,7 +1400,9 @@ void homa_qdev_update_sysctl(struct homa_qdisc_dev *qdev) qdev->link_mbps = homa->link_mbps; ops = qdev->dev->ethtool_ops; if (ops && ops->get_link_ksettings) { - if (ops->get_link_ksettings(qdev->dev, &ksettings) == 0) + if (ops->get_link_ksettings(qdev->dev, &ksettings) == 0 && + ksettings.base.speed != 0 && + ksettings.base.speed != SPEED_UNKNOWN) qdev->link_mbps = ksettings.base.speed; } diff --git a/test/unit_homa_qdisc.c b/test/unit_homa_qdisc.c index 9ea5bb8f..1efa3250 100644 --- a/test/unit_homa_qdisc.c +++ b/test/unit_homa_qdisc.c @@ -2502,6 +2502,22 @@ TEST_F(homa_qdisc, homa_qdev_update_sysctl__cant_get_link_speed_from_dev) homa_qdisc_qdev_put(qdev); } +TEST_F(homa_qdisc, homa_qdev_update_sysctl__link_speed_unknown) +{ + struct homa_qdisc_dev *qdev; + + qdev = homa_qdisc_qdev_get(self->dev); + EXPECT_FALSE(IS_ERR(qdev)); + + /* Some drivers, such as virtio_net, don't know the link speed. */ + self->homa.link_mbps = 16000; + mock_link_mbps = SPEED_UNKNOWN; + homa_qdev_update_sysctl(qdev); + EXPECT_EQ(16000, qdev->link_mbps); + EXPECT_EQ(529583, qdev->cycles_per_mibyte); + + homa_qdisc_qdev_put(qdev); +} TEST_F(homa_qdisc, homa_qdisc_update_sysctl_deps__clamp_values) {