Add test ensuring that network device stats are updated appropriately when a previously pushed packet fails to send during a subsequent push.
Signed-off-by: James Lee <[email protected]> --- drivers/net/mctp/mctp-usblib-test.c | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/drivers/net/mctp/mctp-usblib-test.c b/drivers/net/mctp/mctp-usblib-test.c index 7dc382caffc17644dd616f78df332201d412f709..b3a2cc5cbd99defde308cf23a1b559dbdc73ca22 100644 --- a/drivers/net/mctp/mctp-usblib-test.c +++ b/drivers/net/mctp/mctp-usblib-test.c @@ -6,6 +6,7 @@ * Copyright (C) 2026 Code Construct Pty Ltd */ +#include "linux/percpu-defs.h" #include <linux/array_size.h> #include <uapi/linux/netdevice.h> #include <linux/netdevice.h> @@ -871,6 +872,46 @@ static void mctp_usblib_test_tx_multi_push(struct kunit *test) KUNIT_EXPECT_EQ(test, i, ARRAY_SIZE(sends)); } +static void mctp_usblib_test_tx_overflow(struct kunit *test) +{ + struct mctp_usblib_test_ctx *ctx; + struct mctp_usblib_tx_ops ops; + struct pcpu_dstats *dstats; + struct mctp_usblib_tx *tx; + struct net_device *ndev; + struct sk_buff *skb; + unsigned int start; + size_t len, i; + u64 stats; + u8 *buf; + int rc; + + len = 200; + + ctx = mctp_usblib_test_init(test); + ndev = ctx->dev->ndev; + + ops.send = mctp_usblib_test_tx_send_fail; + + tx = mctp_usblib_test_tx_init(test, &ops, ctx, false); + buf = mctp_usblib_test_init_buf(test, len); + + for (i = 0; i < 3; i++) { + skb = mctp_usblib_test_init_skb(test, len, ndev, buf); + + rc = mctp_usblib_tx_push(ndev, tx, skb, i != 2); + KUNIT_EXPECT_EQ(test, rc, 0); + } + + dstats = get_cpu_ptr(ndev->dstats); + do { + start = u64_stats_fetch_begin(&dstats->syncp); + stats = u64_stats_read(&dstats->tx_drops); + } while (u64_stats_fetch_retry(&dstats->syncp, start)); + + KUNIT_EXPECT_EQ(test, stats, 3); +} + static struct kunit_case mctp_usblib_test_cases[] = { KUNIT_CASE(mctp_usblib_test_rx_single), KUNIT_CASE_PARAM(mctp_usblib_test_rx_pkt_span, @@ -883,6 +924,7 @@ static struct kunit_case mctp_usblib_test_cases[] = { KUNIT_CASE(mctp_usblib_test_tx_pkt_span), KUNIT_CASE(mctp_usblib_test_tx_multi_push), KUNIT_CASE(mctp_usblib_test_tx_failing_send), + KUNIT_CASE(mctp_usblib_test_tx_overflow), {} }; -- 2.47.3

