From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1782155233; cv=none; d=zohomail.com; s=zohoarc; b=RoyVnQrIFNMIBG0EtGY2LVTS6uQc4Ci/TwkhlOjvcU6ZKEsEv4iwCG2OznsMx4l6L0NtwxYAxgjTLjN+lfHtfkOwo/oGVrMhtvmcH/mXi/66nXfYc1L4WLlwwIZPlv24Ei7PsPyuvY5WeKxVw1GOtST0QeRZ7uzokACYtRAI9WQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782155233; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0knJfWc2/EoxbOlmqi5tm+B31wbO8BiGu9Idv2u8VvU=; b=Xrs+3igNyE1zlsKFVcuUQ7r6QYWpl3p1/XcPG6g4hhImW46PfxBlbriph7s08jWiJy0ZpckHC66aj6MmomFDnKILLMWqgX7FiyWWJ6flEXZ7lxv6ebGbzwX/v3/me+PGGtfZQQIZwojjEjMd+7nDXpefWYja5Fu2r+j5e9SE7G0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782155233908727.3131576874877; Mon, 22 Jun 2026 12:07:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wbjyA-0000Wr-Mv; Mon, 22 Jun 2026 15:06:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3l4c5agcKCuQPXNORQKMUUMRK.IUSWKSa-JKbKRTUTMTa.UXM@flex--jrhilke.bounces.google.com>) id 1wbjy8-0000VQ-C5 for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:05 -0400 Received: from mail-pf1-x449.google.com ([2607:f8b0:4864:20::449]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3l4c5agcKCuQPXNORQKMUUMRK.IUSWKSa-JKbKRTUTMTa.UXM@flex--jrhilke.bounces.google.com>) id 1wbjy6-0002kc-L3 for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:04 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-8421f5d76aaso3237255b3a.2 for ; Mon, 22 Jun 2026 12:06:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782155160; x=1782759960; darn=nongnu.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=0knJfWc2/EoxbOlmqi5tm+B31wbO8BiGu9Idv2u8VvU=; b=mFXxECr0cOL3oxDYBZSQOpduQYyl2YlhwCp6LvqH7hmq2eZwLpjuGDCutPE4oHj5nH 4CvpMhVot9j6ZlG3zJZio99RTwxCo65gNPGmFnBXpAxqV7jAwKbYI4iE9RlW9wiSMHO0 T77x79S5FPFlrhP+iZRQxGb9mTeTfXhw3LkEFVBr65UkUTxRQ1+th9SLhA7xhrwcDJte G9ecYfa7WEW7VOJHFNv7QWxnMunKDxj/oZ6DRMsoy8YZFmxjrEbxHnnc2ssYahkJVmll yUppJn0TvsxCun41nccsLu88pI7+2DNDjdJkmMcoSMpciV2WaYPJwi6XMF4mNREdiLvk 9hmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782155160; x=1782759960; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=0knJfWc2/EoxbOlmqi5tm+B31wbO8BiGu9Idv2u8VvU=; b=K9SiIBsTCk5zTTscPSImiErd1ftAAEXwzNUHE+cyU/ZfaI7IAdl7OUBF3ICgBlBoQR x4ftFXQSqx9AHUz12BRH3m33gH/+afBArWVA/llES+fy0ApmYVmrgXQRDQoSzThjbBKM JEeelmD1bn0hXWCslpuDh0dLhAOpbBBteb3oln2JuqglKthMvkSAUlf2/X3QyNTfNHdn qWsuuiktomUSwUYR0w2C85ZNf5jT6LHeH+BSI4HkF3qNq0T6+4xh4pkNzBoKSX3YaqEc q43/KeCv7RiNTcb+1HJUt9l04f0K+ObaGScmdKj6Bm01qWl3h/HH36DZkp1/dOcDJqRU tzqA== X-Forwarded-Encrypted: i=1; AFNElJ/CFpC7y5UHJilJMQ85Jo/YiUH8a0ZY+Fq33jP0QOUWuhgx0GMQqu1lQJFNmLQ4+6bEIWU74sO4KaRP@nongnu.org X-Gm-Message-State: AOJu0YyQjjHTUEK7QplIpKXUmZJsgxUUW60EVtq4VdhxcJGWeneGZU6/ iOhKxCYME8sYSPLpKlyPzvl4e9cebpBJpEHwBNuViHdNX9eTVW9813YanC8TubR7C3ce8S8OOsy 0SD0h7Aln X-Received: from pfbkm55.prod.google.com ([2002:a05:6a00:3c77:b0:842:3c77:598c]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1792:b0:842:6a3b:60c9 with SMTP id d2e1a72fcca58-8455087226bmr16004423b3a.24.1782155159599; Mon, 22 Jun 2026 12:05:59 -0700 (PDT) Date: Mon, 22 Jun 2026 19:05:38 +0000 In-Reply-To: <20260622-igb-trl-v7-0-abb960e767ac@google.com> Mime-Version: 1.0 References: <20260622-igb-trl-v7-0-abb960e767ac@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260622-igb-trl-v7-1-abb960e767ac@google.com> Subject: [PATCH v7 1/7] igb: Define TRL registers and core state From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::449; envelope-from=3l4c5agcKCuQPXNORQKMUUMRK.IUSWKSa-JKbKRTUTMTa.UXM@flex--jrhilke.bounces.google.com; helo=mail-pf1-x449.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1782155234577158500 Content-Transfer-Encoding: quoted-printable Introduce register offsets and bitmask constants for the Transmit Rate Limiter (TRL). Add the IGBTrlQueue structure and corresponding fields to IGBCore to track TRL state (timers, throttling status, and target rates) per queue. Initialize and free these timers during the device realize/uninit lifecycle, and reset them on device reset. Signed-off-by: Josh Hilke Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/net/igb_common.h | 1 + hw/net/igb_core.c | 41 +++++++++++++++++++++++++++++++++++++++++ hw/net/igb_core.h | 12 ++++++++++++ hw/net/igb_regs.h | 5 +++++ 4 files changed, 59 insertions(+) diff --git a/hw/net/igb_common.h b/hw/net/igb_common.h index b316a5b..8c0a0cf 100644 --- a/hw/net/igb_common.h +++ b/hw/net/igb_common.h @@ -148,6 +148,7 @@ enum { defreg(MTA_A), =20 defreg(VTIVAR), defreg(VTIVAR_MISC), + defreg(TRLDQSEL), defreg(TRLRC), }; =20 uint64_t igb_mmio_read(void *opaque, hwaddr addr, unsigned size); diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 45d8fd7..44e8e58 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -2136,6 +2136,15 @@ igb_set_phy_ctrl(IGBCore *core, uint16_t val) } } =20 + +static void igb_trl_reset(IGBCore *core) +{ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + core->trl[i].trlrc =3D 0; + timer_del(core->trl[i].timer); + } +} + void igb_core_set_link_status(IGBCore *core) { NetClientState *nc =3D qemu_get_queue(core->owner_nic); @@ -4282,6 +4291,33 @@ igb_autoneg_resume(IGBCore *core) } } =20 +bool igb_trl_enabled(const IGBTrlQueue *q) +{ + return q->trlrc & E1000_TRLRC_RS_ENA; +} + +static void igb_trl_timer_cb(void *opaque) +{ + /* Stub */ +} + +static void igb_trl_init(IGBCore *core) +{ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + IGBTrlQueue *q =3D &core->trl[i]; + q->timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, igb_trl_timer_cb, q); + q->core =3D core; + q->qidx =3D i; + } +} + +static void igb_trl_uninit(IGBCore *core) +{ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + timer_free(core->trl[i].timer); + } +} + void igb_core_pci_realize(IGBCore *core, const uint16_t *eeprom_templ, @@ -4297,6 +4333,7 @@ igb_core_pci_realize(IGBCore *core, for (i =3D 0; i < IGB_NUM_QUEUES; i++) { net_tx_pkt_init(&core->tx[i].tx_pkt, E1000E_MAX_TX_FRAGS); } + igb_trl_init(core); =20 net_rx_pkt_init(&core->rx_pkt); =20 @@ -4321,6 +4358,8 @@ igb_core_pci_uninit(IGBCore *core) net_tx_pkt_uninit(core->tx[i].tx_pkt); } =20 + igb_trl_uninit(core); + net_rx_pkt_uninit(core->rx_pkt); } =20 @@ -4469,6 +4508,8 @@ static void igb_reset(IGBCore *core, bool sw) =20 igb_intrmgr_reset(core); =20 + igb_trl_reset(core); + memset(core->phy, 0, sizeof core->phy); memcpy(core->phy, igb_phy_reg_init, sizeof igb_phy_reg_init); =20 diff --git a/hw/net/igb_core.h b/hw/net/igb_core.h index d70b54e..922d8cd 100644 --- a/hw/net/igb_core.h +++ b/hw/net/igb_core.h @@ -63,6 +63,13 @@ typedef struct IGBIntrDelayTimer_st { IGBCore *core; } IGBIntrDelayTimer; =20 +typedef struct IGBTrlQueue_st { + QEMUTimer *timer; + IGBCore *core; + uint32_t qidx; + uint32_t trlrc; +} IGBTrlQueue; + struct IGBCore { uint32_t mac[E1000E_MAC_SIZE]; uint16_t phy[MAX_PHY_REG_ADDRESS + 1]; @@ -99,6 +106,9 @@ struct IGBCore { void (*owner_start_recv)(PCIDevice *d); =20 int64_t timadj; + + /* Transmit Rate Limiting */ + IGBTrlQueue trl[IGB_NUM_QUEUES]; }; =20 void @@ -143,4 +153,6 @@ igb_receive_iov(IGBCore *core, const struct iovec *iov,= int iovcnt); void igb_start_recv(IGBCore *core); =20 +bool igb_trl_enabled(const IGBTrlQueue *q); + #endif diff --git a/hw/net/igb_regs.h b/hw/net/igb_regs.h index 4dc4c31..4c31e4b 100644 --- a/hw/net/igb_regs.h +++ b/hw/net/igb_regs.h @@ -718,4 +718,9 @@ static inline uint8_t igb_ivar_entry_tx(uint8_t i) return i < 8 ? i * 4 + 1 : (i - 8) * 4 + 3; } =20 +/* Transmit Rate Limiting */ +#define E1000_TRLDQSEL 0x03604 +#define E1000_TRLRC 0x036B0 +#define E1000_TRLRC_RS_ENA BIT(31) + #endif --=20 2.55.0.rc0.786.g65d90a0328-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1782155240; cv=none; d=zohomail.com; s=zohoarc; b=Ud3gTbj/mbR1dEtS0pmSRK0ETi4Pj0xgcJ88qIT46MnLaM3QuhgHXx35etztfcAVH+r9mzOm4jZI8+EblFyOylJ0x87/g2ezFo1+DYcdnvTy/RtFzH/NM2ZufiABHHsG8BDGt6pvEwfGj1XagqbLKBnpxwiPfKb6tlEwdCLZqcI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782155240; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Zk7AZQi/DcslPBQn4Y+CFUCxhv8E8y9BafSKtq6CD7k=; b=KGqe1hGa55xUI4KZNtxUAEsb/NNh98esEOha0zGW09NSUTt4WcifSjXeqrKIGR9FRyHnLpg8l9+LbiNSkGmYYv+ZpjbYkaR+maMBpON4Ui4VANQs0wNOEUkR1V+PfcclAwORgytou4NXbcH50VQ26Fz8LcUnz/QDD9zWsyR4a0k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782155240362529.2507738373993; Mon, 22 Jun 2026 12:07:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wbjyB-0000X7-5a; Mon, 22 Jun 2026 15:06:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3mYc5agcKCuYRZPQTSMOWWOTM.KWUYMUc-LMdMTVWVOVc.WZO@flex--jrhilke.bounces.google.com>) id 1wbjy9-0000W3-Fj for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:05 -0400 Received: from mail-pf1-x44a.google.com ([2607:f8b0:4864:20::44a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3mYc5agcKCuYRZPQTSMOWWOTM.KWUYMUc-LMdMTVWVOVc.WZO@flex--jrhilke.bounces.google.com>) id 1wbjy7-0002km-Vs for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:05 -0400 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-84540c1fff4so6781317b3a.1 for ; Mon, 22 Jun 2026 12:06:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782155162; x=1782759962; darn=nongnu.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Zk7AZQi/DcslPBQn4Y+CFUCxhv8E8y9BafSKtq6CD7k=; b=rCLRA3EEL27vJfA6Mur2hrSJHRkfSwGy3J/QxVVSl0drToNXfuzYCXDCrdpb64BMjB lfEzdgeli3iYqBGf7tP8BoE+TmYwWNSyqZVH3VxXRlszPJWWvBmxg0M57k6dWltK4IB/ W0XlpnJvNULN0q/4+pEpc/PGUletVUUIg91RL1/rOwAqTeBD8iliESB2C0D1YTZ6PypU 7noVHZK5g8rqeub3Quyd5a18cqhEhqZm7LGhV4lK7T2fIXmnGXy72levrQC2Wr38bOpt sjejBw5Re5ei7oACuJ6HqtUX0vn0gZjHZl+N6rXGVv07a5az2fWWdvKOFiQTNB1D1sT5 HOug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782155162; x=1782759962; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Zk7AZQi/DcslPBQn4Y+CFUCxhv8E8y9BafSKtq6CD7k=; b=Kuz5KofzhAP2JQPYy4XBzujVHvjb0M5zloBP4McuWflwWWTpsitbHQ6mlwk3vxxKGN ZDdw8w7N+jflNvNTAPQGb4QFSXgDgk0WcLiXswMd43ToqRQPU1VIR41FNX0C5YaC2Z4v iRFkqXgS9OZt1YSD+CNEWo8SdW/kl+MYwARRDXsUvXvA+bjQBSyrfnrjyZnT6W2oGQct xLkpsdJk4pQwKgz1I74HE0ycKz2Tq1fE3LjRAM0I9OYaFe8i++mCFsytXWHH9unA0I3o qG82+o74PFIgbAAwcY/o0DR7A/SkWR8KVns/qsuvY5ab96857guem4/EIpNzeNYOpdEx pJiA== X-Forwarded-Encrypted: i=1; AFNElJ99QXcN9DUwicUyP/f+Tq2QtfVKO6dr/0mOSOEJRYII7XtEcZiMjU9FSnpXeNc/Ynl6mADEM4yRHP2Q@nongnu.org X-Gm-Message-State: AOJu0YyfKw8li5oZN41FGk87DtUc3O3dedbCmqGdjhKD3cPlhuV31U+o FSNMAxHq7fbNcQfBMJKV4PRZLNia/B/D60F/82Dkx3sUc+u5WHfikPhJhI9hDQdz4RK7ENMfCa9 KLPJ9yOH2 X-Received: from pfak18.prod.google.com ([2002:aa7:92d2:0:b0:842:54be:af3e]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3cd4:b0:842:5564:2e2c with SMTP id d2e1a72fcca58-8455604e44dmr15693741b3a.5.1782155161532; Mon, 22 Jun 2026 12:06:01 -0700 (PDT) Date: Mon, 22 Jun 2026 19:05:39 +0000 In-Reply-To: <20260622-igb-trl-v7-0-abb960e767ac@google.com> Mime-Version: 1.0 References: <20260622-igb-trl-v7-0-abb960e767ac@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260622-igb-trl-v7-2-abb960e767ac@google.com> Subject: [PATCH v7 2/7] igb: Add VMState support for TRL state From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::44a; envelope-from=3mYc5agcKCuYRZPQTSMOWWOTM.KWUYMUc-LMdMTVWVOVc.WZO@flex--jrhilke.bounces.google.com; helo=mail-pf1-x44a.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1782155240850158500 Content-Transfer-Encoding: quoted-printable Add VMState representation for the Transmit Rate Limiter (TRL) state to support migration. This includes the TRL timers and target rates per queue. Signed-off-by: Josh Hilke Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/net/igb.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/hw/net/igb.c b/hw/net/igb.c index c076807..773da26 100644 --- a/hw/net/igb.c +++ b/hw/net/igb.c @@ -563,6 +563,45 @@ static const VMStateDescription igb_vmstate_intr_timer= =3D { VMSTATE_STRUCT_ARRAY(_f, _s, _num, 0, \ igb_vmstate_intr_timer, IGBIntrDelayTimer) =20 +static bool igb_trl_needed(void *opaque) +{ + IGBState *s =3D opaque; + + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + if (s->core.trl[i].trlrc) { + return true; + } + } + + return false; +} + +static const VMStateDescription igb_vmstate_trl_queue =3D { + .name =3D "igb-trl-queue", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_TIMER_PTR(timer, IGBTrlQueue), + VMSTATE_UINT32(trlrc, IGBTrlQueue), + VMSTATE_END_OF_LIST() + } +}; + +#define VMSTATE_IGB_TRL_QUEUE_ARRAY(_f, _s, _num) \ + VMSTATE_STRUCT_ARRAY(_f, _s, _num, 0, \ + igb_vmstate_trl_queue, IGBTrlQueue) + +static const VMStateDescription igb_vmstate_trl_state =3D { + .name =3D "igb/trl_state", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D igb_trl_needed, + .fields =3D (const VMStateField[]) { + VMSTATE_IGB_TRL_QUEUE_ARRAY(core.trl, IGBState, IGB_NUM_QUEUES), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription igb_vmstate =3D { .name =3D "igb", .version_id =3D 1, @@ -591,6 +630,10 @@ static const VMStateDescription igb_vmstate =3D { VMSTATE_INT64(core.timadj, IGBState), =20 VMSTATE_END_OF_LIST() + }, + .subsections =3D (const VMStateDescription * const []) { + &igb_vmstate_trl_state, + NULL } }; =20 --=20 2.55.0.rc0.786.g65d90a0328-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1782155201; cv=none; d=zohomail.com; s=zohoarc; b=dO/8OzOR0SEaMgzAiG6tXQ2rVQKTZlTIrr6wd+6qJj5mKB7p3dAUkAAhMCYICRcn4XExbB9NuIYBmQp6AEsdWcCNPVAfolrqatMN2s0ofM8fecIauChLU23IXwXmwzYwGyXtGTKatWGrqJKVe7SZRvevpZpA19ReiyuwBTz1QqQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782155201; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=29vAj9EnEPfhnl5PfImVwUUiMUlcltE8sGk+mLO5PFw=; b=dckHjQ5z4TjiEGqCFCc07JHkwIdG8pNdbQhqdUKA38zXsDhC2s0ZcGCqGskCM4zRjRhk8pd0BJKmcqfghMuRwTN6GU7Xf8SXKYop/URCv7skyE240fGm9pmsQ5ITAxSI6HGQDf0U4KuoSwMmNDN4ApLNOCgQGI6/v3WBkHeudZU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782155201006185.40889282868932; Mon, 22 Jun 2026 12:06:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wbjyB-0000XN-Ou; Mon, 22 Jun 2026 15:06:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3m4c5agcKCugTbRSVUOQYYQVO.MYWaOWe-NOfOVXYXQXe.YbQ@flex--jrhilke.bounces.google.com>) id 1wbjyA-0000Wt-ML for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:06 -0400 Received: from mail-pf1-x44a.google.com ([2607:f8b0:4864:20::44a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3m4c5agcKCugTbRSVUOQYYQVO.MYWaOWe-NOfOVXYXQXe.YbQ@flex--jrhilke.bounces.google.com>) id 1wbjy9-0002kw-3r for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:06 -0400 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-84245e2bb00so4135565b3a.1 for ; Mon, 22 Jun 2026 12:06:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782155163; x=1782759963; darn=nongnu.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=29vAj9EnEPfhnl5PfImVwUUiMUlcltE8sGk+mLO5PFw=; b=vdn2Tce7rAcuPBjUkouWxjKatyveYJO4SbAOXhThQSQx91V2kApyTxzS4JP25KVqo5 2hXcIzD1dX+R07Uj/lVV8I9kzopdJyRALWv5GGtJVeNWUyYEvJ2JAXr85VSesMUfClRr 29beUVHHhiTcmp8j8gB3eyfH7FDC0Ek999/p9C/jekK2Y1shDYsJn0EWH6IQKVakxand pzyh+WBw4U8bmXypjTEVQjYCLFQHPINfLY38MqpXWmvsJ7Um+t8Jmo3pvYF/Y1f/U3dd N7LGLBQ+Ms0aIutvsfXlM6mI5OKim7YSjLwMUiy1SJxPWhY20n4gYgYMjDxk74lO2RVn nv0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782155163; x=1782759963; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=29vAj9EnEPfhnl5PfImVwUUiMUlcltE8sGk+mLO5PFw=; b=HkUMLLhSQ/g6mknvcJcYm+J0w5XvuEi68CqX7757XKRCljeF4z05DBLj+oqjDQuMH8 E1YOJwXJWma99CGhUzgKCovS0aS3TNIp2qRLW9yKzUJezo49L0WQFjR3n0vGOXWTyJr6 spF9GjROpmRzEtGb1r5thBrpxiokUmva2jaj9WwxkB1uilPTk6LKfLYytWGsR5Fn8thm i0XDF5v7l9asJ7jlO98I6ler6Ur1I3SHbDTEpwDZr2O3GRKUAFXUAr+P6gQTNb0H+/2M iIofrUTEBnKbdptPcPICJgc7KaRgfmDSPWwiCOYcPMMN5sctvspxLxrBCHwUdJ4PU5CO EbMg== X-Forwarded-Encrypted: i=1; AFNElJ+U+MuMIbjXqR3Lw49Tu1XLdTXf1FW7EkHXCpuMfoyK5nG3rh9lV0kKf2Ovc0Q1XIQ26f7CuP/otLQs@nongnu.org X-Gm-Message-State: AOJu0YwazusspsNFP0hpyR9aPJhE7flEPYa9lsoJdvvDu9Ey/Qgvj1bF nnONzR18r6wzuVpob2N/sBfL2Un0oDzFDwKZGzrBgnzWv4iXBNYPGcs+0h0BPtxj+oe1tytIcp/ 3E2zhpahY X-Received: from pfcp22.prod.google.com ([2002:a05:6a00:a256:b0:842:5659:67de]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:23d6:b0:842:4f20:53ff with SMTP id d2e1a72fcca58-845508d322dmr15431579b3a.42.1782155163283; Mon, 22 Jun 2026 12:06:03 -0700 (PDT) Date: Mon, 22 Jun 2026 19:05:40 +0000 In-Reply-To: <20260622-igb-trl-v7-0-abb960e767ac@google.com> Mime-Version: 1.0 References: <20260622-igb-trl-v7-0-abb960e767ac@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260622-igb-trl-v7-3-abb960e767ac@google.com> Subject: [PATCH v7 3/7] igb: Implement TRL register write and configuration From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::44a; envelope-from=3m4c5agcKCugTbRSVUOQYYQVO.MYWaOWe-NOfOVXYXQXe.YbQ@flex--jrhilke.bounces.google.com; helo=mail-pf1-x44a.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1782155203249158500 Content-Transfer-Encoding: quoted-printable Implement write handlers for TLDQSEL and TRLRC registers to allow the guest to configure Transmit Rate Limiting. Translate the register Rate Factor into a physical target rate (bytes/sec) per queue. Disable TRL and clear timers when the link status changes or when TRL is disabled by the guest. Signed-off-by: Josh Hilke --- hw/net/igb_core.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 44e8e58..ca427d7 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -2150,6 +2150,11 @@ void igb_core_set_link_status(IGBCore *core) NetClientState *nc =3D qemu_get_queue(core->owner_nic); uint32_t old_status =3D core->mac[STATUS]; =20 + /* Disable TRL for all queues (section 4.5.12.1) */ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + core->trl[i].trlrc &=3D ~E1000_TRLRC_RS_ENA; + } + trace_e1000e_link_status_changed(nc->link_down ? false : true); =20 if (nc->link_down) { @@ -2632,6 +2637,25 @@ static void igb_set_vtivar(IGBCore *core, int index,= uint32_t val) */ } =20 +static uint32_t igb_get_trlrc(IGBCore *core, int index) +{ + const uint32_t qidx =3D core->mac[TRLDQSEL]; + + return core->trl[qidx].trlrc; +} + +static void igb_set_trldqsel(IGBCore *core, int index, uint32_t val) +{ + core->mac[index] =3D extract32(val, 0, 4); +} + +static void igb_set_trlrc(IGBCore *core, int index, uint32_t val) +{ + const uint32_t qidx =3D core->mac[TRLDQSEL]; + + core->trl[qidx].trlrc =3D val; +} + static inline void igb_autoneg_timer(void *opaque) { @@ -3687,6 +3711,7 @@ static const readops igb_macreg_readops[] =3D { [RQDPC15] =3D igb_mac_read_clr4, [VTIVAR ... VTIVAR + 7] =3D igb_mac_readreg, [VTIVAR_MISC ... VTIVAR_MISC + 7] =3D igb_mac_readreg, + [TRLRC] =3D igb_get_trlrc, }; enum { IGB_NREADOPS =3D ARRAY_SIZE(igb_macreg_readops) }; =20 @@ -4135,7 +4160,9 @@ static const writeops igb_macreg_writeops[] =3D { [PVTEICR6] =3D igb_set_vteicr, [PVTEICR7] =3D igb_set_vteicr, [VTIVAR ... VTIVAR + 7] =3D igb_set_vtivar, - [VTIVAR_MISC ... VTIVAR_MISC + 7] =3D igb_mac_writereg + [VTIVAR_MISC ... VTIVAR_MISC + 7] =3D igb_mac_writereg, + [TRLDQSEL] =3D igb_set_trldqsel, + [TRLRC] =3D igb_set_trlrc, }; enum { IGB_NWRITEOPS =3D ARRAY_SIZE(igb_macreg_writeops) }; =20 --=20 2.55.0.rc0.786.g65d90a0328-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1782155201; cv=none; d=zohomail.com; s=zohoarc; b=B5CMmepAAGgz5vbituGodm4VCGgAiqfs1koUscv3Mok6s/5nNfDuZaSFZXgaGXgaPxAp4MXXf7sZf8TRbcTspM2ucVwcKJHnQL7dfUP4jGdhYkj9CNW6QTXKq7pif1SRlAmFT1GlQmmhaJIqDjExtV3gIp1+AaXGshc2mgQ9gl4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782155201; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=bwipex1FBopre8Ml7Ity94bcXpGxhXYtuQX3kKiDtE8=; b=bM7xCd19TAFp5p7YJaL4kcMMKHeQdgmutAxMWstaImE3Y7/C7bJLmnUq0+idG3TguLEfQvbzp1I9PVWTZ401CiCrHD6cijyPnCrUQ0dlpdSlF/JQbMGBnE4EdO1g7fx7m9BwZakcDf9n9dZ95q31Pc2aaTYr65flbJpDXJzqdMw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782155201091896.0206578057034; Mon, 22 Jun 2026 12:06:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wbjyE-0000Xs-89; Mon, 22 Jun 2026 15:06:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3nYc5agcKCuoVdTUXWQSaaSXQ.OaYcQYg-PQhQXZaZSZg.adS@flex--jrhilke.bounces.google.com>) id 1wbjyC-0000XU-Mh for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:08 -0400 Received: from mail-pf1-x44a.google.com ([2607:f8b0:4864:20::44a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3nYc5agcKCuoVdTUXWQSaaSXQ.OaYcQYg-PQhQXZaZSZg.adS@flex--jrhilke.bounces.google.com>) id 1wbjyB-0002lB-4S for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:08 -0400 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-8428419982eso4389795b3a.3 for ; Mon, 22 Jun 2026 12:06:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782155165; x=1782759965; darn=nongnu.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=bwipex1FBopre8Ml7Ity94bcXpGxhXYtuQX3kKiDtE8=; b=tQNpbPnVuugHMJiauzc+CKu6JaIgJlgW55tH4o3sF7b+NTirdDDioEYdoV1YEgryPk xR60ZGKN2jpgpYNEBSFczf3GuAvsBXVREiQaC/1a3laSfbU/tZ5BDpB4dy8lGVOGkJ7g tNmo9yjg4kawlN5THQyaFlZ1NZQ4izFzdKoWS3PX+4oCiaOJ8h8f4VyZ3sLTH71bjxT6 dwehkZiowx7eYNibngai4IRZh1mCpJ8w2COO7GKxyE+o5RTt0woScaW+v9FFn1UCVMGG uz+OKHi6ndjNtsSq0h5U0/QywL5/eD8vOjjqCAsYxX4M/jCEh/ares7r1vMihJ4eCNoW ZKBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782155165; x=1782759965; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=bwipex1FBopre8Ml7Ity94bcXpGxhXYtuQX3kKiDtE8=; b=M2lZh196kGTNZDHMnvELLWbe0s1knOQTakkvbCIRy0aviejrpFAjYRAqiZiBaAccKC zRRWq+Mu968fUsc1f2pfq/sfwi1PFRHjDMmHhn2F8FXumQykB4tnGd5uFiltvsmfnVIB WfpAdG5h9ZnIewA07TC2vhwmo8TtIauxjxdcAvm/+2A6LyDhus0crMMtZXuPLe3/Z7TV KkiZCoXwUDLWZkFMLb+kiuQaobAeNpM8Na3CYWSdrl6tOJx62LYpsX8KbyjkKpFq3M6c Io4fqEpJ3iv6aMnVrNASmZ4Z/69S2bbA7aM22k8HeP5ZBjdky9K/YtB2YnWTq8W3mND4 CDtA== X-Forwarded-Encrypted: i=1; AHgh+RrteMswYxmEiwWooWcDGCMAfxgT3gdqN0iXpBJuw8z+nuGDzOqA8ZAP9FqwwbvVflNUiuci0e4E5md3@nongnu.org X-Gm-Message-State: AOJu0YxnTw5Ks3U+j/sxV4LLWQc04e8u7FF8NQwLms9ZGAZ+5wGFXfFR gcRtab5+i63C1j4daVBccgSYtF6OKmREg/vnNWiiyWcqD8zhR/5FnoWzLGXzEOosAeEUW+xugXL XmZIxmIYo X-Received: from pfbkt3.prod.google.com ([2002:a05:6a00:4ba3:b0:845:3e90:1d65]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:288b:b0:845:286d:468a with SMTP id d2e1a72fcca58-845507d55dfmr17641807b3a.13.1782155165146; Mon, 22 Jun 2026 12:06:05 -0700 (PDT) Date: Mon, 22 Jun 2026 19:05:41 +0000 In-Reply-To: <20260622-igb-trl-v7-0-abb960e767ac@google.com> Mime-Version: 1.0 References: <20260622-igb-trl-v7-0-abb960e767ac@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260622-igb-trl-v7-4-abb960e767ac@google.com> Subject: [PATCH v7 4/7] igb: Refactor TX path to return processed byte count From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::44a; envelope-from=3nYc5agcKCuoVdTUXWQSaaSXQ.OaYcQYg-PQhQXZaZSZg.adS@flex--jrhilke.bounces.google.com; helo=mail-pf1-x44a.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1782155203245158500 Content-Transfer-Encoding: quoted-printable Modify igb_process_tx_desc to return the total size of the transmitted packet (in bytes) when processing the End of Packet (EOP) descriptor, and 0 otherwise. This allows the transmission loop to track how many bytes are being sent for rate-limiting calculations. Signed-off-by: Josh Hilke Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/net/igb_core.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index ca427d7..9a8ef15 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -599,7 +599,7 @@ igb_on_tx_done_update_stats(IGBCore *core, struct NetTx= Pkt *tx_pkt, int qn) } } =20 -static void +static size_t igb_process_tx_desc(IGBCore *core, PCIDevice *dev, struct igb_tx *tx, @@ -632,10 +632,10 @@ igb_process_tx_desc(IGBCore *core, tx->ctx[idx].seqnum_seed =3D le32_to_cpu(tx_ctx_desc->seqnum_s= eed); tx->ctx[idx].type_tucmd_mlhl =3D le32_to_cpu(tx_ctx_desc->type= _tucmd_mlhl); tx->ctx[idx].mss_l4len_idx =3D le32_to_cpu(tx_ctx_desc->mss_l4= len_idx); - return; + return 0; } else { /* unknown descriptor type */ - return; + return 0; } } else { /* legacy descriptor */ @@ -654,11 +654,13 @@ igb_process_tx_desc(IGBCore *core, } =20 if (cmd_type_len & E1000_TXD_CMD_EOP) { + size_t total_len =3D 0; if (!tx->skip_cp && net_tx_pkt_parse(tx->tx_pkt)) { idx =3D (tx->first_olinfo_status >> 4) & 1; igb_tx_insert_vlan(core, queue_index, tx, tx->ctx[idx].vlan_macip_lens >> IGB_TX_FLAGS_VLAN_SHIFT, !!(tx->first_cmd_type_len & E1000_TXD_CMD_VLE)); + total_len =3D net_tx_pkt_get_total_len(tx->tx_pkt); =20 if ((tx->first_cmd_type_len & E1000_ADVTXD_MAC_TSTAMP) && (core->mac[TSYNCTXCTL] & E1000_TSYNCTXCTL_ENABLED) && @@ -675,7 +677,9 @@ igb_process_tx_desc(IGBCore *core, tx->first =3D true; tx->skip_cp =3D false; net_tx_pkt_reset(tx->tx_pkt, net_tx_pkt_unmap_frag_pci, dev); + return total_len; } + return 0; } =20 static uint32_t igb_tx_wb_eic(IGBCore *core, int queue_idx) --=20 2.55.0.rc0.786.g65d90a0328-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1782155204; cv=none; d=zohomail.com; s=zohoarc; b=NBkE492wVxJBg2zdzJMFX5iyFlh/ha04Kxg6Lhh5c9bOd3LriC+eeG5V3XzBMlLBROBN4K87HAoYPab9ErIHoiriUVMNtBrqt3lyF2cSakWRn7NfK3y820euDEfWIPua6XxSObMwbqPx/bTtd3MWl3b8248yI4leCa8cJqqmTKI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782155204; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=DGwnbL1mqMd4oPQ4Qoq/8lDTF7NGdi4gUHTkHub77bY=; b=H+BPTTlRCH+5PJy6Tw7co5JCG51M/SneWRU0HRCvOISSN8JlbW1Or1zldMaYqNtAvxypH++kM20Bwgd5A6FiVRxWqyoC9wKJLzkTDnQJYxvQS1UdXsPrT/1yNdh99t9vhtWJfrD2bUv4dUwwRbnk7vQA++27ADgRxwOChvYFcpg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782155204855354.439236664442; Mon, 22 Jun 2026 12:06:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wbjyG-0000YS-M3; Mon, 22 Jun 2026 15:06:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3n4c5agcKCuwXfVWZYSUccUZS.QcaeSai-RSjSZbcbUbi.cfU@flex--jrhilke.bounces.google.com>) id 1wbjyF-0000YG-CL for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:11 -0400 Received: from mail-pg1-x54a.google.com ([2607:f8b0:4864:20::54a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3n4c5agcKCuwXfVWZYSUccUZS.QcaeSai-RSjSZbcbUbi.cfU@flex--jrhilke.bounces.google.com>) id 1wbjyD-0002lO-Jz for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:11 -0400 Received: by mail-pg1-x54a.google.com with SMTP id 41be03b00d2f7-c88fc985a65so2981608a12.2 for ; Mon, 22 Jun 2026 12:06:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782155167; x=1782759967; darn=nongnu.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=DGwnbL1mqMd4oPQ4Qoq/8lDTF7NGdi4gUHTkHub77bY=; b=wjgW3iT4b2+54A16VFG2UFtYchugPJuRJN/qdEnjUTCohUEW0/NpLAAM0MgtLZs0Lw niGN7Qcc9nRrJTKqiRFys+zWhE2M50K44OqsVkBKZQanKJom4BYea5C+cUBJEPGiiTK9 NkCwCcu+tr62mn+GQVQlDvzqHhr7bzUWp1GRKQP9GxymZghKAqGmHLeOOTy0P9Tl9Fq3 8ks/y9st/5JZda9oVPNvH5q+CKUaP8XItOWBB7RM85VarTetRYEhpkWXLX18+UExEtlM FcLGxJAs/U8pVCDUZPcluxuzC64/T3nRgBn77fc0saz1hnxV6j7xZuEYCJDtmo4gUUN9 e8SA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782155167; x=1782759967; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=DGwnbL1mqMd4oPQ4Qoq/8lDTF7NGdi4gUHTkHub77bY=; b=ghnzfJ3Y+GH/+OG71zoi8KsSlgv+FlVkUNbJ5MyHPHoo0IJUOVpP/tW/Tl67KsDwri +so/hNFtTlI3elem9X7IkHN4Yh5AjoUZuEPzP9plYqe8Tc+a6md7xJQQ/XiGYKXGEuKM qbVIQX3uqfVQWa5dhebXJe0LZcnPGPiVdfBAYqNGU8Kvx3R73Xauw/Xj8bB35nVTM0W5 LeasJYdh6OroD/k1XdsFpW8JROALy77XSKO7xkJ4gS8JJgTEy1S5c8GU9W03dH/PEwai iCkeLa1Y3qsYwI0KZ6kjeCKx0o/IPQI+c+eG8LJL2iPVN3mXtQdtlmWLwY8UsVftwcpB A9aA== X-Forwarded-Encrypted: i=1; AFNElJ+WYk+94gVlfzxcWIBsHpZ+Jlvqtk53nTwE6EqdyleyIBtMHzSuI9ZrwqK+WllMeNr5qg7V7OpDmjfj@nongnu.org X-Gm-Message-State: AOJu0Yx5AvmTETTzkH+bX/CAByiFPq4HcFe1fc9A8LlAdQRhAXe0aJPQ dUfUxB86gYEDI499g/csWoBpibL0MTVGAaMHPmEx2AH8qwlRsevnBp5jvqCRRzfBfwWLvZC7rrz gAH/Dtjvi X-Received: from pfbde4.prod.google.com ([2002:a05:6a00:4684:b0:845:4b17:ddc6]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1748:b0:82f:72e6:ed4 with SMTP id d2e1a72fcca58-845505438f5mr17177315b3a.0.1782155167248; Mon, 22 Jun 2026 12:06:07 -0700 (PDT) Date: Mon, 22 Jun 2026 19:05:42 +0000 In-Reply-To: <20260622-igb-trl-v7-0-abb960e767ac@google.com> Mime-Version: 1.0 References: <20260622-igb-trl-v7-0-abb960e767ac@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260622-igb-trl-v7-5-abb960e767ac@google.com> Subject: [PATCH v7 5/7] igb: Implement TRL throttling and timer resumption From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::54a; envelope-from=3n4c5agcKCuwXfVWZYSUccUZS.QcaeSai-RSjSZbcbUbi.cfU@flex--jrhilke.bounces.google.com; helo=mail-pg1-x54a.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1782155206927158500 Content-Transfer-Encoding: quoted-printable Integrate throttling logic into the transmission path. In `igb_start_xmit`, check if the queue is currently throttled. Accumulate bytes sent, calculate the transmission delay based on the configured target rate, and if a throttle is triggered, set the virtual timer, mark the queue as throttled, and defer remaining packets. Implement the timer callback to clear the throttled state and resume transmission when the timer expires. Signed-off-by: Josh Hilke Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/net/igb_core.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 9a8ef15..e158837 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -97,6 +97,7 @@ igb_receive_internal(IGBCore *core, const struct iovec *i= ov, int iovcnt, static void igb_raise_interrupts(IGBCore *core, size_t index, uint32_t cau= ses); static void igb_reset(IGBCore *core, bool sw); =20 + static inline void igb_raise_legacy_irq(IGBCore *core) { @@ -875,6 +876,48 @@ igb_tx_enabled(IGBCore *core, const E1000ERingInfo *tx= i) (core->mac[TXDCTL0 + (qn * 16)] & E1000_TXDCTL_QUEUE_ENABLE); } =20 +static uint64_t igb_trl_calculate_delay(const IGBTrlQueue *q, size_t bytes= _sent) +{ + uint32_t divisor; + uint32_t rf; + + if (!igb_trl_enabled(q)) { + return 0; + } + + /* + * 7.8 Transmit Rate Limiting (TRL) + * + * > RF =3D 1Gb/s / Target-Rate (Rate Factor) is the ratio between the + * > nominal link rate and the target maximum rate to achieve for + * > that rate controlled queue. It is a decimal number ranging from + * > 1 to 1,000 (1 Mb/s minimum target rate) at least 10-bits before + * > the hexadecimal point and 14-bits after, as required for the + * > maximum PL by which it is multiplied. + * + * The TRLRC register stores the RF in 10.14 fixed-point format: + * - Bits 13:0: Fractional part + * - Bits 23:14: Integer part + * + * Combined, the lower 24 bits of the register (23:0) represent the + * RF directly. + */ + rf =3D MAX(extract32(q->trlrc, 0, 24), 1 << 14); + + /* + * Delay =3D PL (Packet Length) / Target-Rate + * =3D PL / (1Gb/s / RF) + * =3D PL * RF / 1Gb/s + * =3D PL * RF / (1G / b/B / ns/s) B/ns + * =3D (bytes_sent * (RF_scaled / 2^14) / (1G / b/B / ns/s)) ns + * =3D (bytes_sent * RF_scaled / (1G / b/B * 2^14 / ns/s)) ns + */ + divisor =3D ((1000000000ULL / BITS_PER_BYTE) << 14) / + NANOSECONDS_PER_SECOND; + + return (uint64_t)bytes_sent * rf / divisor; +} + static void igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) { @@ -883,12 +926,19 @@ igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) union e1000_adv_tx_desc desc; const E1000ERingInfo *txi =3D txr->i; uint32_t eic =3D 0; + size_t bytes_sent =3D 0; + uint64_t delay_ns; =20 if (!igb_tx_enabled(core, txi)) { trace_e1000e_tx_disabled(); return; } =20 + if (igb_trl_enabled(&core->trl[txi->idx]) && + timer_pending(core->trl[txi->idx].timer)) { + return; + } + d =3D pcie_sriov_get_vf_at_index(core->owner, txi->idx % 8); if (!d) { d =3D core->owner; @@ -902,9 +952,16 @@ igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) trace_e1000e_tx_descr((void *)(intptr_t)desc.read.buffer_addr, desc.read.cmd_type_len, desc.wb.status); =20 - igb_process_tx_desc(core, d, txr->tx, &desc, txi->idx); + bytes_sent +=3D igb_process_tx_desc(core, d, txr->tx, &desc, txi->= idx); igb_ring_advance(core, txi, 1); eic |=3D igb_txdesc_writeback(core, base, &desc, txi); + + delay_ns =3D igb_trl_calculate_delay(&core->trl[txi->idx], bytes_s= ent); + if (delay_ns > 0) { + timer_mod(core->trl[txi->idx].timer, + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + delay_ns); + break; + } } =20 if (eic) { @@ -4321,7 +4378,6 @@ igb_autoneg_resume(IGBCore *core) qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } } - bool igb_trl_enabled(const IGBTrlQueue *q) { return q->trlrc & E1000_TRLRC_RS_ENA; @@ -4329,7 +4385,11 @@ bool igb_trl_enabled(const IGBTrlQueue *q) =20 static void igb_trl_timer_cb(void *opaque) { - /* Stub */ + IGBTrlQueue *trl =3D opaque; + IGB_TxRing txr; + + igb_tx_ring_init(trl->core, &txr, trl->qidx); + igb_start_xmit(trl->core, &txr); } =20 static void igb_trl_init(IGBCore *core) --=20 2.55.0.rc0.786.g65d90a0328-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1782155230; cv=none; d=zohomail.com; s=zohoarc; b=fwjHy6uOaB85lPYMZX4i15Thwcp1wRItzPd4CmzozTozR02cFR0UVl2t9Ptp3+52jKIqNYIlqXSHQpUkZaJBXQf9sbgVYltSoSNd5WsPIg2anD34corwxch6AHY67J9opFoVnsrD/CNwh50syhiWSLczaqeuNW4lIRMuF3urbjs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782155230; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=F2v9cyEeXLMRxY4RJyY8ilPvdLI29m6QducxNaUF4Io=; b=S8KLAQWkjhGVvidKYrHO1shay7tkvnHOW0/M1gHy+L1DpqW392JgwP5wCk8v3wFhe3dy2EAv5PtIfclbc8AqR6DKeRVFkEGpMzZsxhXFdbPA8TSQwKhjZl/n6SORwveN5p15J1W6mm6f2BrGrintaQyNNZ7q3ZnCl+uz/7j83L0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782155230649133.4592610090292; Mon, 22 Jun 2026 12:07:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wbjyI-0000ZA-Rt; Mon, 22 Jun 2026 15:06:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3oYc5agcKCu4ZhXYbaUWeeWbU.SecgUck-TUlUbdedWdk.ehW@flex--jrhilke.bounces.google.com>) id 1wbjyH-0000Yo-DD for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:13 -0400 Received: from mail-pj1-x1049.google.com ([2607:f8b0:4864:20::1049]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3oYc5agcKCu4ZhXYbaUWeeWbU.SecgUck-TUlUbdedWdk.ehW@flex--jrhilke.bounces.google.com>) id 1wbjyF-0002m2-QL for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:13 -0400 Received: by mail-pj1-x1049.google.com with SMTP id 98e67ed59e1d1-36d97a4e08fso3438833a91.0 for ; Mon, 22 Jun 2026 12:06:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782155170; x=1782759970; darn=nongnu.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=F2v9cyEeXLMRxY4RJyY8ilPvdLI29m6QducxNaUF4Io=; b=a/tTUDZzuJQs1LyniwMSe1AcFoA9mQ+yKYr8erdGdeyH6Xo+UnM1auPsiaCvv7XNGS DoAqW16UHfXCC1eKx9rGPYD9+zFGGy+qqCQZVSzi2orKGao6tTK6GOUAGi4NxvS5KaU0 ZBWtuLSoh97o+Mjg7fMqqBFEpM8UahL64ZZWJii1mvvGTD3tr03i5BmgNSTD0uMeJ9Vk l/s5XW93ugYkz29N+bssEBJq4MovwkPrbRcfQV6r8ncZroyPPP162C70cwp4/O9v17Gg qnci3IXWlY0G08atsr7e+/qKZwoPK3uyXSqaqLN+88vJlM0ZjC1pbQzoTCK466jJx9Gb duHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782155170; x=1782759970; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=F2v9cyEeXLMRxY4RJyY8ilPvdLI29m6QducxNaUF4Io=; b=TaHOhKHPJMXA4bHF04D9f7qPBEVLxVIaZczFyh0savyH4+SX6b60IuQmlE/82JwXIz 5Mnn03mYd1i3OPRaMzTjRrlfC3wkkVdbjo9JhmZoQAMVIl2XkZCckmLMjEwzEVw9fky6 F5UUYMK4YfryBDLq2nNiqJMYil90p0eUnt6/kR/J8ih4YfxUH3H6WUVyxNZ4tzkMvkEn 5juMk3OB8Hnl/1bWwiz+mNxxIbS8zCiaJdBhGVV5sse1wMV/y8VMLKQJ6i9WaBfBOdFQ eMay4UDPuQmy7b4/r5n/6UVUKIL+SRwq2QHedmWEpQUhiwRDYzw9D0d1sDqMFo8uXzvV VjGA== X-Forwarded-Encrypted: i=1; AHgh+RpwTueVXvdUzNYIOeOHKxdinnqTvABx6weupEqCtNIxkBeIYYUKAbisYbdN9ShupVYvCZbbLzF0cICh@nongnu.org X-Gm-Message-State: AOJu0YyGhPWrRem24WkeirABrijE9PgTY/H4xzrXSTzPPEeX781txiUG meNili0iK1ZZy4s9ouZrazfIoirkfbmIpmA5hXU45LCeczDCDhue8p3h1iAp2OL5Egrd1Qa83rW lKsf4SojT X-Received: from pjboj13.prod.google.com ([2002:a17:90b:4d8d:b0:37d:cda8:9a1]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4a51:b0:377:424b:59e3 with SMTP id 98e67ed59e1d1-37d15ed439cmr16875442a91.24.1782155169009; Mon, 22 Jun 2026 12:06:09 -0700 (PDT) Date: Mon, 22 Jun 2026 19:05:43 +0000 In-Reply-To: <20260622-igb-trl-v7-0-abb960e767ac@google.com> Mime-Version: 1.0 References: <20260622-igb-trl-v7-0-abb960e767ac@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260622-igb-trl-v7-6-abb960e767ac@google.com> Subject: [PATCH v7 6/7] igb: Add QTest for Transmit Rate Limiter register multiplexing From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1049; envelope-from=3oYc5agcKCu4ZhXYbaUWeeWbU.SecgUck-TUlUbdedWdk.ehW@flex--jrhilke.bounces.google.com; helo=mail-pj1-x1049.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1782155232817158501 Content-Transfer-Encoding: quoted-printable Add a unit test to verify register writes/reads to the rate limit register (TRLC) return the correct value based on which queue is currently selected in the queue selection register (TRLDQSEL). Signed-off-by: Josh Hilke --- tests/qtest/igb-test.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 51 insertions(+) diff --git a/tests/qtest/igb-test.c b/tests/qtest/igb-test.c index 3d397ea..0a4d0b1 100644 --- a/tests/qtest/igb-test.c +++ b/tests/qtest/igb-test.c @@ -45,6 +45,20 @@ static const struct eth_header packet =3D { .h_source =3D E1000E_ADDRESS, }; =20 +/* + * Calculate TRL rate factor for a given target rate. + * + * Rate Factor =3D 1 Gbps / Target Rate. + * + * The hardware TRLRC register stores the rate factor as a fixed-point num= ber + * with 14 fractional bits. Scale 1Gbps by 2^14 before dividing to preserve + * precision in integer arithmetic. + */ +static uint32_t igb_trl_get_rate_factor(uint64_t rate_bytes_s) +{ + return ((1000000000ULL / BITS_PER_BYTE) << 14) / rate_bytes_s; +} + static void igb_send_verify(QE1000E *d, int *test_sockets, QGuestAllocator= *alloc) { union e1000_adv_tx_desc descr; @@ -191,6 +205,41 @@ static void test_igb_multiple_transfers(void *obj, voi= d *data, =20 } =20 +/* + * Verify the rate limit value register (TRLC) returns the correct value b= ased + * on which queue is selected (TRLDQSEL). + */ +static void test_igb_transmit_rate_limiter_regs(void *obj, void *data, + QGuestAllocator *alloc) +{ + QOSGraphObject *e_object =3D obj; + QE1000E_PCI *e1000e =3D obj; + QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); + QE1000E *d =3D &e1000e->e1000e; + const int qidx0 =3D 0, qidx1 =3D 1; + uint32_t val0, val1; + + if (qpci_check_buggy_msi(dev)) { + return; + } + + e1000e_macreg_write(d, E1000_TRLDQSEL, qidx0); + val0 =3D E1000_TRLRC_RS_ENA | + igb_trl_get_rate_factor(125000); + e1000e_macreg_write(d, E1000_TRLRC, val0); + + e1000e_macreg_write(d, E1000_TRLDQSEL, qidx1); + val1 =3D E1000_TRLRC_RS_ENA | + igb_trl_get_rate_factor(250000); + e1000e_macreg_write(d, E1000_TRLRC, val1); + + e1000e_macreg_write(d, E1000_TRLDQSEL, qidx0); + g_assert_cmphex(e1000e_macreg_read(d, E1000_TRLRC), =3D=3D, val0); + + e1000e_macreg_write(d, E1000_TRLDQSEL, qidx1); + g_assert_cmphex(e1000e_macreg_read(d, E1000_TRLRC), =3D=3D, val1); +} + static void data_test_clear(void *sockets) { int *test_sockets =3D sockets; @@ -247,6 +296,8 @@ static void register_igb_test(void) qos_add_test("rx", "igb", test_igb_rx, &opts); qos_add_test("multiple_transfers", "igb", test_igb_multiple_transfers, &opts); + qos_add_test("transmit_rate_limiter_regs", "igb", + test_igb_transmit_rate_limiter_regs, &opts); #endif =20 opts.before =3D data_test_init_no_socket; --=20 2.55.0.rc0.786.g65d90a0328-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1782155246; cv=none; d=zohomail.com; s=zohoarc; b=Xv6Erx/WAslieVR2z10H5eREXBwmNSqU2sXDmrQZHdVn5BNU7GZQakhUbBOeRsCBY10QTiwbVDAaqiCBXQ1lalm3DRdBzOIME6hbdqAnGbPW7UTOixRFz0NP6r50umRCavfmEKzrdujV1Vk6dN9KL6jer+bZocMIxhDPuy/5Cmg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782155246; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=GOpYLqYb0m0OlIH0rl7mRp0VlvhMTNSJwAYjKLT4+U0=; b=Vy9NT5x22c6c3AJszZmT6nvURvnV6PYu5RGIMaCUZEBXCqFokD6g2WI+0E3lhOlHloZfJ4vOnMsX3579+OhANNUHXU2YwqJxAnYnfca+OcYg0Ds+Hib6wYS35SHpb4lHbECBvaW5XoZqHuVCAjvHFYGXRWFzEl8E+obpB3C/rB8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782155246267403.30788370500784; Mon, 22 Jun 2026 12:07:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wbjyN-0000a7-8u; Mon, 22 Jun 2026 15:06:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3o4c5agcKCvAbjZadcWYggYdW.UgeiWem-VWnWdfgfYfm.gjY@flex--jrhilke.bounces.google.com>) id 1wbjyK-0000ZV-3K for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:16 -0400 Received: from mail-pf1-x449.google.com ([2607:f8b0:4864:20::449]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3o4c5agcKCvAbjZadcWYggYdW.UgeiWem-VWnWdfgfYfm.gjY@flex--jrhilke.bounces.google.com>) id 1wbjyH-0002oN-UO for qemu-devel@nongnu.org; Mon, 22 Jun 2026 15:06:15 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-8423970cb30so3529437b3a.2 for ; Mon, 22 Jun 2026 12:06:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782155171; x=1782759971; darn=nongnu.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=GOpYLqYb0m0OlIH0rl7mRp0VlvhMTNSJwAYjKLT4+U0=; b=QBXXyekRDxdvRGh26dCJTLc1kSVSfWtzprAzolh6t31AD68XGURjJkMgRizNGLkF0u pJCwnccPbbI3h3UB7sfI1Z9ouE5wcrcRBJNAPVb/3cKK6pldrb7T8faksInumvNkvgcn RY50PnBu9bMbXk/IbmzZDDRk2bqcPd2f8Jo5EgmWiv6bHhJs3v6/iZ6UERoyqeIDqBSZ il06JQBBkkWaigZBFJrrJ7giqUPsxiC/6UnP1fmkGhK4KdRIc9erJF8eH9ZoOoq4wfL2 mgtgRS6grh9oxFakXlWFYW09ZVkl/zl4zEt/fHCFKRgxpv2hQPa+dkzdDZKRYtlppoyu j6LQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782155171; x=1782759971; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=GOpYLqYb0m0OlIH0rl7mRp0VlvhMTNSJwAYjKLT4+U0=; b=GcdeMgCGctp3UoM+SfgWA46vXYWkLiFlOC7y9W4ScRv2TnWqH2Rj3eMAvmSaYt+sbm LsVepDEnBMWa11g1OwX+OnAe5jj1XtH3O91IllZbsWv7WdxKiUoxjhjsdKzugYauCQ/O 8j83mRMC7ohSAaTo/nDndo33MZiL4+GkezM7Orf8cv/h38tg07x34CLN32sZTCmqE9tK uGFRvvgvK423Gd94R3EKx0X3iziuaMLG8C0vDmQOIJVJ/WJWW+GFgEzTlxfuYfyp62ju 0dgl8D7VjEZFhX7GLFYUksoh1YikuSjPnEGw8eGKJLtXEQ2MAwlLlvU/v+rKyly5yJ7w V0MA== X-Forwarded-Encrypted: i=1; AFNElJ8XStYXMrkhL/HLkwv1g4MjZFbuDBP616MH8uiVDZK2s7ypedx0TfGzLMZ5cdv62lxT2NmJJxp5mlD6@nongnu.org X-Gm-Message-State: AOJu0YzJLhhGIlTe++/crdPhDKZZ2L6nKCYzaqEjk8EL84rGCX5r09Dw UoceiNbj7pWwiR8hfg2s+pc1JBrIeol7gw6mBctphGcu7WuiMmtK3Jv3DmZzQJCb5pN5gPyuaDF Jbolyf32X X-Received: from pfbiv3.prod.google.com ([2002:a05:6a00:66c3:b0:845:4ca2:60a5]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3e07:b0:842:7476:236e with SMTP id d2e1a72fcca58-845508f2bcamr16003144b3a.41.1782155171130; Mon, 22 Jun 2026 12:06:11 -0700 (PDT) Date: Mon, 22 Jun 2026 19:05:44 +0000 In-Reply-To: <20260622-igb-trl-v7-0-abb960e767ac@google.com> Mime-Version: 1.0 References: <20260622-igb-trl-v7-0-abb960e767ac@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260622-igb-trl-v7-7-abb960e767ac@google.com> Subject: [PATCH v7 7/7] igb: Add QTest for Transmit Rate Limiter traffic throttling From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::449; envelope-from=3o4c5agcKCvAbjZadcWYggYdW.UgeiWem-VWnWdfgfYfm.gjY@flex--jrhilke.bounces.google.com; helo=mail-pf1-x449.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1782155247424158500 Content-Transfer-Encoding: quoted-printable Add a test for the IGB transmit rate limiting functionality. The test verifies that TRL is enabled by setting the appropriate registers and that data is transmitted at the appropriate rate based on chosen target rate. Signed-off-by: Josh Hilke --- tests/qtest/igb-test.c | 155 +++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 155 insertions(+) diff --git a/tests/qtest/igb-test.c b/tests/qtest/igb-test.c index 0a4d0b1..31f2bbe 100644 --- a/tests/qtest/igb-test.c +++ b/tests/qtest/igb-test.c @@ -34,9 +34,11 @@ #include "qemu/iov.h" #include "qemu/module.h" #include "qemu/bitops.h" +#include "qemu/timer.h" #include "libqos/libqos-malloc.h" #include "libqos/e1000e.h" #include "hw/net/igb_regs.h" +#include "hw/pci/pci_regs.h" =20 #ifndef _WIN32 =20 @@ -59,6 +61,58 @@ static uint32_t igb_trl_get_rate_factor(uint64_t rate_by= tes_s) return ((1000000000ULL / BITS_PER_BYTE) << 14) / rate_bytes_s; } =20 +static void igb_trl_enable(QE1000E *d, uint64_t rate_bytes_s) +{ + /* Select Queue 0 */ + e1000e_macreg_write(d, E1000_TRLDQSEL, 0); + /* Enable TRL with target rate */ + e1000e_macreg_write(d, E1000_TRLRC, + E1000_TRLRC_RS_ENA | + igb_trl_get_rate_factor(rate_bytes_s)); +} + +static void igb_trl_disable(QE1000E *d) +{ + /* Select Queue 0 */ + e1000e_macreg_write(d, E1000_TRLDQSEL, 0); + /* Disable TRL */ + e1000e_macreg_write(d, E1000_TRLRC, 0); +} + +static void igb_msix_clear_pending(QPCIDevice *dev, uint16_t entry) +{ + uint64_t vector_offset =3D + dev->msix_table_off + (entry * PCI_MSIX_ENTRY_SIZE); + uint32_t val =3D qpci_io_readl(dev, dev->msix_table_bar, + vector_offset + PCI_MSIX_ENTRY_VECTOR_CTR= L); + + /* Unmask (clears pending bit in QEMU) */ + qpci_io_writel(dev, dev->msix_table_bar, + vector_offset + PCI_MSIX_ENTRY_VECTOR_CTRL, + val & ~PCI_MSIX_ENTRY_CTRL_MASKBIT); + + /* Mask again */ + qpci_io_writel(dev, dev->msix_table_bar, + vector_offset + PCI_MSIX_ENTRY_VECTOR_CTRL, + val); +} + +static void igb_read_tx_tail(QE1000E *d, void *descr) +{ + QE1000E_PCI *d_pci =3D container_of(d, QE1000E_PCI, e1000e); + uint32_t last_entry; + uint32_t tail; + uint32_t len; + + tail =3D e1000e_macreg_read(d, E1000_TDT_A(0)); + len =3D e1000e_macreg_read(d, E1000_TDLEN_A(0)) / E1000_RING_DESC_LEN; + last_entry =3D (tail + len - 1) % len; + + qtest_memread(d_pci->pci_dev.bus->qts, + d->tx_ring + last_entry * E1000_RING_DESC_LEN, descr, + E1000_RING_DESC_LEN); +} + static void igb_send_verify(QE1000E *d, int *test_sockets, QGuestAllocator= *alloc) { union e1000_adv_tx_desc descr; @@ -84,6 +138,14 @@ static void igb_send_verify(QE1000E *d, int *test_socke= ts, QGuestAllocator *allo /* Wait for TX WB interrupt */ e1000e_wait_isr(d, E1000E_TX0_MSG_ID); =20 + /* + * Read the descriptor back from guest memory again, now that WB has + * occurred. This is required because if the packet was delayed by the + * trasmit rate limiter, e1000e_tx_ring_push read it back before QEMU + * actually processed it. + */ + igb_read_tx_tail(d, &descr); + /* Check DD bit */ g_assert_cmphex(le32_to_cpu(descr.wb.status) & E1000_TXD_STAT_DD, =3D= =3D, E1000_TXD_STAT_DD); @@ -147,6 +209,29 @@ static void igb_receive_verify(QE1000E *d, int *test_s= ockets, QGuestAllocator *a guest_free(alloc, data); } =20 +/* Returns the amount of microseconds it takes to transmit a 64-byte packe= t.*/ +static uint64_t igb_send_and_measure(QE1000E *d, int *test_sockets, + QGuestAllocator *alloc) +{ + QE1000E_PCI *d_pci =3D container_of(d, QE1000E_PCI, e1000e); + QPCIDevice *pdev =3D &d_pci->pci_dev; + QTestState *qts =3D global_qtest; + uint64_t start_time, end_time; + + /* Clear any stale pending interrupt for this vector before we start */ + igb_msix_clear_pending(pdev, E1000E_TX0_MSG_ID); + + /* Clear EICR to allow new interrupts to be raised in MSI-X mode */ + e1000e_macreg_write(d, E1000_EICR, 0xFFFFFFFF); + + /* Send a test packet and measure the time it takes. */ + start_time =3D qtest_clock_step(qts, 1); + igb_send_verify(d, test_sockets, alloc); + end_time =3D qtest_clock_step(qts, 1); + + return end_time - start_time; +} + static void test_e1000e_init(void *obj, void *data, QGuestAllocator * allo= c) { /* init does nothing */ @@ -240,6 +325,74 @@ static void test_igb_transmit_rate_limiter_regs(void *= obj, void *data, g_assert_cmphex(e1000e_macreg_read(d, E1000_TRLRC), =3D=3D, val1); } =20 +/* + * Test for Transmit Rate Limiter (TRL) traffic throttling. + * + * Verifies that: + * 1. Packets are transmitted without delay when TRL is disabled. + * 2. Enabling TRL on a queue throttles subsequent transmissions. + * 3. The delay matches the expected transmission time calculated from the + * packet size and the configured target rate. + * 4. Disabling TRL restores normal (unthrottled) transmission behavior. + */ +static void test_igb_transmit_rate_limiter(void *obj, void *data, + QGuestAllocator *alloc) +{ + QOSGraphObject *e_object =3D obj; + QE1000E_PCI *e1000e =3D obj; + QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); + QE1000E *d =3D &e1000e->e1000e; + const uint64_t expected_baseline_elapsed =3D 10 * SCALE_US; + const uint64_t expected_max_elapsed =3D 530 * SCALE_US; + const uint64_t expected_min_elapsed =3D 500 * SCALE_US; + uint64_t elapsed; + + if (qpci_check_buggy_msi(dev)) { + return; + } + + /* Send a test packet to verify there's no rate limit. */ + elapsed =3D igb_send_and_measure(d, data, alloc); + + /* + * QEMU doesn't emulate the hardware line rate of the device, so the p= acket + * is processed instantly (requiring 0 clock steps in wait_isr, which = steps + * by 10us). Give a 10us margin for error. + */ + g_assert_cmpint(elapsed, <, expected_baseline_elapsed); + + /* Enable TRL and set the target rate to 125 KB/s */ + igb_trl_enable(d, 125000); + + /* + * Send Packet 1 (no delay) + * The first packet triggers rate limiting for subsequent transmission= s. + */ + elapsed =3D igb_send_and_measure(d, data, alloc); + g_assert_cmpint(elapsed, <, expected_baseline_elapsed); + + /* Send Packet 2 (should be delayed) */ + elapsed =3D igb_send_and_measure(d, data, alloc); + /* + * Expected delay: 64 byte packet / 125 KB/s =3D 512 us. + * Since QEMU steps the clock by 10 us on each wait_isr iteration, + * the delay is rounded up to the next 10 us step, which is 520 us. + */ + g_assert_cmpint(elapsed, >=3D, expected_min_elapsed); + g_assert_cmpint(elapsed, <=3D, expected_max_elapsed); + + /* Send Packet 3 (should also be delayed) */ + elapsed =3D igb_send_and_measure(d, data, alloc); + g_assert_cmpint(elapsed, >=3D, expected_min_elapsed); + g_assert_cmpint(elapsed, <=3D, expected_max_elapsed); + + igb_trl_disable(d); + + /* Send Packet 4 (no delay since TRL is disabled) */ + elapsed =3D igb_send_and_measure(d, data, alloc); + g_assert_cmpint(elapsed, <, expected_baseline_elapsed); +} + static void data_test_clear(void *sockets) { int *test_sockets =3D sockets; @@ -298,6 +451,8 @@ static void register_igb_test(void) test_igb_multiple_transfers, &opts); qos_add_test("transmit_rate_limiter_regs", "igb", test_igb_transmit_rate_limiter_regs, &opts); + qos_add_test("transmit_rate_limiter", "igb", + test_igb_transmit_rate_limiter, &opts); #endif =20 opts.before =3D data_test_init_no_socket; --=20 2.55.0.rc0.786.g65d90a0328-goog