@@ -1478,6 +1478,94 @@ TEST_F(homa_qdisc, homa_qdisc_redirect_skb__no_suitable_qdisc)
14781478 homa_qdisc_destroy (self -> qdiscs [i ]);
14791479}
14801480
1481+ TEST_F (homa_qdisc , homa_qdisc_pacer_check__enqueue_packet )
1482+ {
1483+ struct homa_qdisc_dev * qdev , * qdev2 ;
1484+ struct homa_rpc * srpc ;
1485+
1486+ /* Create 2 qdevs to verify that homa_qdisc_pacer_check loops over
1487+ * all qdevs.
1488+ */
1489+ qdev2 = homa_qdisc_qdev_get (mock_dev (1 , & self -> homa ));
1490+ qdev = homa_qdisc_qdev_get (self -> dev );
1491+ srpc = unit_server_rpc (& self -> hsk , UNIT_OUTGOING , & self -> client_ip ,
1492+ & self -> server_ip , self -> client_port ,
1493+ self -> server_id , 10000 , 10000 );
1494+ ASSERT_NE (NULL , srpc );
1495+ EXPECT_EQ (0 , homa_qdisc_init (self -> qdiscs [3 ], NULL , NULL ));
1496+ qdev -> pacer_qix = 3 ;
1497+ EXPECT_EQ (0 , self -> qdiscs [3 ]-> q .qlen );
1498+ homa_qdisc_defer_homa (qdev , new_test_skb (srpc , & self -> addr , 0 , 1000 ));
1499+ EXPECT_TRUE (homa_qdisc_any_deferred (qdev ));
1500+
1501+ atomic64_set (& qdev -> link_idle_time , 20000 );
1502+ mock_clock = 15000 ;
1503+ self -> homa .pacer -> max_nic_queue_cycles = 12000 ;
1504+
1505+ homa_qdisc_pacer_check (& self -> homa );
1506+ EXPECT_EQ (1 , self -> qdiscs [3 ]-> q .qlen );
1507+ EXPECT_FALSE (homa_qdisc_any_deferred (qdev ));
1508+ EXPECT_EQ (1 , homa_metrics_per_cpu ()-> pacer_needed_help );
1509+
1510+ homa_qdisc_destroy (self -> qdiscs [3 ]);
1511+ homa_qdisc_qdev_put (qdev );
1512+ homa_qdisc_qdev_put (qdev2 );
1513+ }
1514+ TEST_F (homa_qdisc , homa_qdisc_pacer_check__no_deferred_rpcs )
1515+ {
1516+ struct homa_qdisc_dev * qdev , * qdev2 ;
1517+
1518+ /* Create 2 qdevs to verify that homa_qdisc_pacer_check loops over
1519+ * all qdevs.
1520+ */
1521+ qdev2 = homa_qdisc_qdev_get (mock_dev (1 , & self -> homa ));
1522+ qdev = homa_qdisc_qdev_get (self -> dev );
1523+ EXPECT_EQ (0 , homa_qdisc_init (self -> qdiscs [3 ], NULL , NULL ));
1524+ qdev -> pacer_qix = 3 ;
1525+ EXPECT_EQ (0 , self -> qdiscs [3 ]-> q .qlen );
1526+
1527+ atomic64_set (& qdev -> link_idle_time , 20000 );
1528+ mock_clock = 15000 ;
1529+ self -> homa .pacer -> max_nic_queue_cycles = 12000 ;
1530+
1531+ homa_qdisc_pacer_check (& self -> homa );
1532+ EXPECT_EQ (0 , self -> qdiscs [3 ]-> q .qlen );
1533+ EXPECT_FALSE (homa_qdisc_any_deferred (qdev ));
1534+ EXPECT_EQ (0 , homa_metrics_per_cpu ()-> pacer_needed_help );
1535+
1536+ homa_qdisc_destroy (self -> qdiscs [3 ]);
1537+ homa_qdisc_qdev_put (qdev );
1538+ homa_qdisc_qdev_put (qdev2 );
1539+ }
1540+ TEST_F (homa_qdisc , homa_qdisc_pacer_check__lag_not_long_enough )
1541+ {
1542+ struct homa_qdisc_dev * qdev ;
1543+ struct homa_rpc * srpc ;
1544+
1545+ qdev = homa_qdisc_qdev_get (self -> dev );
1546+ srpc = unit_server_rpc (& self -> hsk , UNIT_OUTGOING , & self -> client_ip ,
1547+ & self -> server_ip , self -> client_port ,
1548+ self -> server_id , 10000 , 10000 );
1549+ ASSERT_NE (NULL , srpc );
1550+ EXPECT_EQ (0 , homa_qdisc_init (self -> qdiscs [3 ], NULL , NULL ));
1551+ qdev -> pacer_qix = 3 ;
1552+ EXPECT_EQ (0 , self -> qdiscs [3 ]-> q .qlen );
1553+ homa_qdisc_defer_homa (qdev , new_test_skb (srpc , & self -> addr , 0 , 1000 ));
1554+ EXPECT_TRUE (homa_qdisc_any_deferred (qdev ));
1555+
1556+ atomic64_set (& qdev -> link_idle_time , 20000 );
1557+ mock_clock = 13000 ;
1558+ self -> homa .pacer -> max_nic_queue_cycles = 12000 ;
1559+
1560+ homa_qdisc_pacer_check (& self -> homa );
1561+ EXPECT_EQ (0 , self -> qdiscs [3 ]-> q .qlen );
1562+ EXPECT_TRUE (homa_qdisc_any_deferred (qdev ));
1563+ EXPECT_EQ (0 , homa_metrics_per_cpu ()-> pacer_needed_help );
1564+
1565+ homa_qdisc_destroy (self -> qdiscs [3 ]);
1566+ homa_qdisc_qdev_put (qdev );
1567+ }
1568+
14811569TEST_F (homa_qdisc , homa_qdisc_update_sysctl__basics )
14821570{
14831571 struct homa_qdisc_dev * qdev ;
0 commit comments