From nobody Sun Jul 26 12:28:58 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=1782227231; cv=none; d=zohomail.com; s=zohoarc; b=h4n0iEYcHA2DnSgiij/7xrdvNrfp71M8mSiL/4Jm5k0Z/tVQzxnJTBLSJ2wa0teYglb2fN8a8cpNO3XuHM8neRWIZd2d0bROb/ZmCZ33567vtkyEai2A2KvR/6HMAVmDvljsg9pVY1wIQ41hGq1lxNCFv7l0+wa7L9h6BQ2v2Ok= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782227231; h=Content-Type:Content-Transfer-Encoding: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=+wKnuH/EYw36sv7myy4ussVx/8yUNMBCS9IBE09tR7Q=; b=LxQLnDbJVGsocuSF1T9zv8UDNLVfKhuGo43Tn55IaKbOm9st/uP2gIBOTwAnwyXCrbujV61WjJ/lK1Qi8VXbmP4mpu7lJF0XyBEIQRgKD5lR67UyuW5tjQz4aUMVRnzVhSZbWTjsVEkpb1bKbQlzUdYiko5qlm2ZBUjVDH0QGKE= 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 1782227231075763.9306887871037; Tue, 23 Jun 2026 08:07:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wc2hv-0006ib-HE; Tue, 23 Jun 2026 11:06:35 -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 <39aA6agcKCnohpfgjicemmejc.amkocks-bctcjlmlels.mpe@flex--jrhilke.bounces.google.com>) id 1wc2ht-0006iN-QA for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:33 -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 <39aA6agcKCnohpfgjicemmejc.amkocks-bctcjlmlels.mpe@flex--jrhilke.bounces.google.com>) id 1wc2hs-0006nj-5q for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:33 -0400 Received: by mail-pj1-x1049.google.com with SMTP id 98e67ed59e1d1-37c9d82cd57so19716a91.1 for ; Tue, 23 Jun 2026 08:06:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782227190; x=1782831990; darn=nongnu.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=+wKnuH/EYw36sv7myy4ussVx/8yUNMBCS9IBE09tR7Q=; b=NMTXn6qDe4A4nNOfeMuGoOp1yyTuNi8EEPDdy7j1KKuK4kOmmshB9FzBnpx6GzXyBA jz/AAjtPDQE9ueq4nmKLcWVN6G/DDsjjPJha1Lx3VyUKUhiNDLw25IafEERVQNzT4hXo KA4hUN9q/o1wKKGETMX9clLk6NaQatZCY5zA2RHFKQiwGPXeT4JXJHQzZnre2GNC0b7q 7sl8S+xtnoY9MfiRLXknGKqeNMDCZ3vFQlkDZoUsO+eCObEWZoXyw1KhBycyYzPo5fts vn9YTaZ/I/4FiZiUDgtumufnmkQdJewVYmNbeKcQvmUaQb6xHCsYSyxGB6b3aRTUK3yb HbPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782227190; x=1782831990; h=content-transfer-encoding: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=+wKnuH/EYw36sv7myy4ussVx/8yUNMBCS9IBE09tR7Q=; b=ed3m/ZbX2LeuWNFIrNai7pU4jijFJfGNOOFYbFk8vSZSVMvbinq1f71OPO0eY1ZNH1 DDGo5BMXizOn8cPEFh9LSYksfqgWOKGPmu/kjXVm7PhpbvalTKKZ2WzTb75+W2bzQsq1 xEyVOwNCPO/2SRC9RwvqiDbbZe/DjYaTL043QKVbmjvHw6fmaFW9WSa+Hx8bsZyUIzb6 fo18JHt19e8rzG4XmoGwsD/owa/nfNZKWK1nDEgbINEaDdYaxG49ibEgLQ3lQpiFNOSM sg9SLecWmxvPE/0P8M9o4r74tqudG64A7nznY0xgk3jBVifOiiBlvbhUjXQgpXwzKdoR CA+g== X-Forwarded-Encrypted: i=1; AHgh+RphhRSheDDwdx2CSSPkZaCezArvK3+xF9jtIFRTxMgmtLwYEJMB6OPpSx+NH7ePzPtlg2f662LqVssf@nongnu.org X-Gm-Message-State: AOJu0YyrBGSVOEjegcVRoXqh0c10/9NhRtq4DTSdodYM1GiSIy12Gx+q SCS3EWgklEhtufnTx5lUFDlKeKE9Y4R9npuo/a8doefF3Du9EoS2+Fdu38K18lcW2hWwy7MUiMm dBgOT87gT X-Received: from pjvl7.prod.google.com ([2002:a17:90a:dd87:b0:37c:cfa1:253a]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:e7c9:b0:368:ed26:15b2 with SMTP id 98e67ed59e1d1-37dd16ea27bmr3155340a91.8.1782227189371; Tue, 23 Jun 2026 08:06:29 -0700 (PDT) Date: Tue, 23 Jun 2026 15:05:59 +0000 In-Reply-To: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> Mime-Version: 1.0 References: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260623-igb-trl-v8-1-c9b1fc6c3304@google.com> Subject: [PATCH v8 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 , "=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?=" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=39aA6agcKCnohpfgjicemmejc.amkocks-bctcjlmlels.mpe@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: 1782227232380158500 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 Reviewed-by: Akihiko Odaki --- 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:28:58 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=1782227214; cv=none; d=zohomail.com; s=zohoarc; b=gs8vaTUBJz1aKdeDxzwsCZcNB1/qPAUC4nSmvV+Ww1DZ+qd9aOjTT2jRYRDqVCafy70pWudLBQCGV6Yj/h2cDvuXixMsuMNA+fyzk2CGh6e71m2EQvfuVh6Le4C7tkYyQx38Rvk+XlBGt868bR28t0UEx9pCvi6uKf4bSLeQqfo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782227214; h=Content-Type:Content-Transfer-Encoding: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=mLeTvO+TAT0U9Hqanhzqp9AmOAQssIaaKQ1hKkdaXcs=; b=FJZuUe9Ld0cKiHWO2nRzt+epn+8Tenxdnj5lri5AWl4k4JIZGZh6uJAli2PU5IiR1ZfZ22y3Tx5xem3J/9tGxLK3xcfJ5np0qmJ5cqQTHCdQsQ2PlZRnmD5prmpULPXWLKsP9omTmqLr862qwMz54pjLn95/PiTZm4wrqy2tvbM= 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 1782227214344403.7189663493988; Tue, 23 Jun 2026 08:06:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wc2i0-0006j8-En; Tue, 23 Jun 2026 11:06:40 -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 <3-aA6agcKCn4ltjknmgiqqing.eqosgow-fgxgnpqpipw.qti@flex--jrhilke.bounces.google.com>) id 1wc2hy-0006is-2d for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:38 -0400 Received: from mail-pl1-x64a.google.com ([2607:f8b0:4864:20::64a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3-aA6agcKCn4ltjknmgiqqing.eqosgow-fgxgnpqpipw.qti@flex--jrhilke.bounces.google.com>) id 1wc2hw-0006oJ-7o for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:37 -0400 Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-2c725d3e886so76670875ad.0 for ; Tue, 23 Jun 2026 08:06:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782227194; x=1782831994; darn=nongnu.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=mLeTvO+TAT0U9Hqanhzqp9AmOAQssIaaKQ1hKkdaXcs=; b=DTTUf6+Ks0CBcUo3wA7iTI2XoDL/Di0ZIRcE15K39VsCRdSoE5FkCJESJjRR5wj+VQ 3mHtbhDqv4WiqSPSfvQ7sb8VdxKTyn8wBI5wPpQ5W8IMFjd0xIubWwDMluhU/jvvAxdM 9m8XOtS3VBhkga39GzXrco2cTZX29hYHE8b3qZo2hD9wfzF8GLZaXrKqk4IsRffNXJjv HpuW43EiHOYdB1iUxDHB4PLZeBT9Qos3nLa5u3/2j3DlQkbldgGUaxssaFRl7RKQhO32 ogF+eE9Rvc1VhXfZq9IPy5ruiFDhhomrHWKRvY+FrKTZOTfUA8V8nM1prW+MpYPT4qlf E6YQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782227194; x=1782831994; h=content-transfer-encoding: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=mLeTvO+TAT0U9Hqanhzqp9AmOAQssIaaKQ1hKkdaXcs=; b=Wv1EF4taB4b0uLBHUG2aiap3Rv/rYOkYOgeF/uAyg4fuldDqTuq60R0uJz3/xo/C5N mEgic8wiPrxcptP2Cal/ARNRTWBevq+sQuIzcIxFbFAkF0DOUEbf7sYthGFfG4bbT508 mFt9wGuAcaZERYl0+Fjw7eM/Lr6NCetSwrxLwBGnNXfF18eA4wci8QALpR+/B3mJVEpn m86sfWTLrHT5qk7k561ns2ST47teSmPBU6sntO0wQ9UlKh5nJnxK2L29zDjYUGqLVmc3 NXd7Ba+iFRjdfA0C7pHiGwhO9QotWc45plTHUlUvOI39oKcVkNROL+y0pQd4OBoUQCkc if5A== X-Forwarded-Encrypted: i=1; AHgh+RqGIo8zoYixWTjn/hDBXFlrsra2DZQxfpL31svzpyEUzBBsJFY1Sj2SXXP/otvgk20sEIhcCpKpz+KP@nongnu.org X-Gm-Message-State: AOJu0Yxk2nQ5RdccvGmjFzlPVqNYCi8lBRaOHYw/ry2CsvdUdWY3Sc2i iDRib6S2v290V5h7MXmreFX6+ZTbveAdB8/qTyqPhfHRUOZ9DRyiEJ6sf4uTt4UBIXTeS8MqO2v rXmB4D4/H X-Received: from plof5.prod.google.com ([2002:a17:902:8605:b0:2bf:1274:c8f]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ce84:b0:2c0:ab92:584c with SMTP id d9443c01a7336-2c7c9a2884dmr28369985ad.25.1782227193727; Tue, 23 Jun 2026 08:06:33 -0700 (PDT) Date: Tue, 23 Jun 2026 15:06:00 +0000 In-Reply-To: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> Mime-Version: 1.0 References: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260623-igb-trl-v8-2-c9b1fc6c3304@google.com> Subject: [PATCH v8 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 , "=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?=" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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::64a; envelope-from=3-aA6agcKCn4ltjknmgiqqing.eqosgow-fgxgnpqpipw.qti@flex--jrhilke.bounces.google.com; helo=mail-pl1-x64a.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: 1782227215861158500 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 Reviewed-by: Akihiko Odaki --- 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:28:58 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=1782227231; cv=none; d=zohomail.com; s=zohoarc; b=gg5D+UiJhDlShZBP/OF1XBJ9r8CidI3dkWJt+GhCvvsRCxfZRNjOIRhlpoMZlVvNcjkbn9nYvuE+3/wIBMB35w/Mp5hVmlPhmdgy3rYsnGzCVI4wv1rUHpD/+SKpyUEc0q3J+3LSy9ImeE0qlyEO3UN1ZLe7s3PCm0S1+Kv65Wc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782227231; 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=XyGnjYxCZ8EZlyVDw6/Cpef9pS+2gVNz5k73BtUmcPMfCw0nfLoYemFyTRRhbfAwgO/NkKb7e07g/U9+er/YNDRYazs4VSRkrq42nND5/byYMOfuxklecaNKIPujIFyNNKDTj0QFchyl/9ZifhyN5dFsmmzM940Cj3mNhN2q4yo= 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 1782227231154413.80703948591884; Tue, 23 Jun 2026 08:07:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wc2iI-0006nN-RK; Tue, 23 Jun 2026 11:07:01 -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 <3_KA6agcKCoEowmnqpjlttlqj.htrvjrz-ij0jqstslsz.twl@flex--jrhilke.bounces.google.com>) id 1wc2hz-0006j6-VE for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:40 -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 <3_KA6agcKCoEowmnqpjlttlqj.htrvjrz-ij0jqstslsz.twl@flex--jrhilke.bounces.google.com>) id 1wc2hy-0006oc-GS for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:39 -0400 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-84238e83851so18862b3a.1 for ; Tue, 23 Jun 2026 08:06:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782227197; x=1782831997; 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=keoHfw93ll0h5fRoxi0wMDqkZOlQliG42XKbTO+Wnr7Ktfk0Zo+QW3udLjaJlmB9jp JvTvKVXYTp9MuORT58taN9pL12LP+XWL5ujbzqpKUCFMbeZC+nUE/ST27khRpbUULxyC P20jT3i4OZRfDkAp6hKq5VkJ2z0wKhdk80SUbJr9zyz/3T9SEnxkQlYaTBJTqq070V8n lFpbHLZX2a86VjqCJtn/9Fh6wY+DjuN9METHOvymf2tfaxiNbqk39cvRs5pjyO9Vkisl 6mvi+VnEKfx8NsloDdvpHNCX3dIjP7P3E8gSPNpE7a5Mbc642GBL4DlMiL/j8xQOZVIg 275g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782227197; x=1782831997; 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=APCW61fJeBQpKONXzZWHhXo+QEjs9k537PVt3eom4QkniHinvHcQQgiSuI/QyWOWUm 5vORwQ1H2CAgxaQRTbJKAE5qGtzjs46BXXihPeNuhEgtASKOnV8qr3FASC9p2OUVlhpd RuYmHKfk1bfuFP3t/+kbZfoKDkaYl+lrjFCGhCPJb5ImEFBTV3T4nH/z6GFt7ErgbfML ZBdk1VQgR2IYthUbwkfZkKMz8F7l+8kDfn7/HjMHx2nCX8SfJFLe5HLW8YYpErHZXnmL BqZNisg0KBnL0jbvY8s4N93wbGHhQFDlVDHX8nGbAutuf0w/i07nqIAKuCdHxuuIOq+m wVog== X-Forwarded-Encrypted: i=1; AFNElJ/LZXwtYiGz64mvVMnnkFf1FPFkbAxA/SZtffjONt5u9cOz21PoWo9NPPsBcxLHcrJ3O4alBAghEIc9@nongnu.org X-Gm-Message-State: AOJu0YyIPOsw4CROB9HkkzPSQKUTzBveIVp7ySOguAeh7Hz3YePRS9yi lrjj2VTi8mdWZWZjqowky5LJvdYOqWEN/4I+KvSHAHC3tEc4bREUeuXWJEHOZISE6SaAFiL6Dnr p5p7HDy1/ X-Received: from pfms25.prod.google.com ([2002:aa7:8299:0:b0:82c:90c5:5e0d]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2d88:b0:837:f79d:909 with SMTP id d2e1a72fcca58-8459714309fmr3497263b3a.39.1782227196286; Tue, 23 Jun 2026 08:06:36 -0700 (PDT) Date: Tue, 23 Jun 2026 15:06:01 +0000 In-Reply-To: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> Mime-Version: 1.0 References: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260623-igb-trl-v8-3-c9b1fc6c3304@google.com> Subject: [PATCH v8 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=3_KA6agcKCoEowmnqpjlttlqj.htrvjrz-ij0jqstslsz.twl@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: 1782227232335158500 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 Reviewed-by: Akihiko Odaki --- 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:28:58 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=1782227231; cv=none; d=zohomail.com; s=zohoarc; b=c2x/8qbftQa237goRtmQ3ILF4We2rlv3supgYsPL8j2BbxTPmgDST0dyTFmZJboRKhB2Tv4kH8ZaOmsckhETg8Cz3sD6UkfyrouNY6yTkfQdmXJJAeBkAH5cQNoNNiQZ9uBGr7qsjaMlizo/363cJMQLkupo1J+jUclAjAF8jjw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782227231; h=Content-Type:Content-Transfer-Encoding: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=UBRgHg7zBT9dDU9XG5F8KOgfMU/+ygbpAlA+5C2uefE=; b=m9yKvW+tkPYR2/m2V6qWjEYA8nusT21x+j1pHPOcZHKMhKH2bTNgkb6sT5tqAmlah4mCBZM7Ah9bl/73fSj3h8gLao/8N8R+dUmJKn1XE9hXE/klFVqeYIz4ZriK/8xAI7pJrJQz3YimFL30Dp52D81xx9YOHd1LDZa60X6DiOw= 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 1782227231041273.00902421474814; Tue, 23 Jun 2026 08:07:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wc2iS-0006of-I7; Tue, 23 Jun 2026 11:07:08 -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 <3_qA6agcKCoMqyopsrlnvvnsl.jvtxlt1-kl2lsuvunu1.vyn@flex--jrhilke.bounces.google.com>) id 1wc2i2-0006jZ-F3 for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:47 -0400 Received: from mail-pj1-x104a.google.com ([2607:f8b0:4864:20::104a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3_qA6agcKCoMqyopsrlnvvnsl.jvtxlt1-kl2lsuvunu1.vyn@flex--jrhilke.bounces.google.com>) id 1wc2i0-0006oy-DO for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:41 -0400 Received: by mail-pj1-x104a.google.com with SMTP id 98e67ed59e1d1-36bba9b849dso29867a91.1 for ; Tue, 23 Jun 2026 08:06:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782227199; x=1782831999; darn=nongnu.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=UBRgHg7zBT9dDU9XG5F8KOgfMU/+ygbpAlA+5C2uefE=; b=LeHvhMqVSfkJcyM806TAieISoGwOO/BCJhjOCqdPaXo6f47gKPnwJAQN7sjY8isi3h PvLs2mz7pNQAs3q5GgOCxmSEA9nbL4P9RGYAGaKzEZy6oRT0VTG+VWQP9AxbG6+z8pZf uTTurUEVSS287hMIelUGWy6wnxF1MjpxtSQZ7isJKJDFnlLfev3nUMTUL4yGfy4WOn8A iDPCL147ahKg/lV9UnZAf9SFXdGifOyWSr6iRBUVNv0ajsF2aKQVkA9Kx0FZHcAyZBbE YxNxfiYP+WAc4K3yBk9oi3ZNlaVDoMwrr/a7766UP7XTAPIePnvjAUMhR6hbGUYzN0eA L1dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782227199; x=1782831999; h=content-transfer-encoding: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=UBRgHg7zBT9dDU9XG5F8KOgfMU/+ygbpAlA+5C2uefE=; b=R3fCk90UoFXFvIOsAL7+jpvMs0jMc791WfY4GAPMKz7+e2mAu0B1cFq8ET+9mC6x4A Oe1ixxyHsLByOOVALtVN+tiSVQIjrsTfxockFcTXuyEO0Fz4M6XLEvg4adsQW+od9YPy bZiC8ZeaC9Q5MVlW3pDEI4Q7IotuF5bINw+chu2V6rqxTYv7AF0A7cNrYcKiwCSeIZc2 +4oR1uu2ZP0qbVvL9gXJC8+VzIghwmILj8Wz34DS8n6nQY2Vv8l3c0Ci/Sehb5iPh9j3 eMy6pfTdhU7+w7d6aHML3NRvGtHvgmXb4d6Sj8Z0CbgCkHMbViA1k4WH4J1mxm7hcUEx nCaw== X-Forwarded-Encrypted: i=1; AHgh+RqCyyHS8mOeI9EbN9PiH7SIAAi5I886qEW239zq5mcrC+7RK+gYWx1TAzsAtERBTFEyc7vtAKioiKOu@nongnu.org X-Gm-Message-State: AOJu0Yx2AOVfkE6OG29uuO+1169c+63WTjMggdjNryWE/iuHTpAleltE tAHD3AgXVEroPw3ZQt6Mf9gQbBcYXhWZnXVtx3661YoRhhKPhvRoPDH2Bc/hVAqHUnaWcaNOmXN EfiVPCYMe X-Received: from pjbos11.prod.google.com ([2002:a17:90b:1ccb:b0:36b:c6a2:b8bc]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:264b:b0:369:7421:b36f with SMTP id 98e67ed59e1d1-37d160e9587mr20691204a91.21.1782227198428; Tue, 23 Jun 2026 08:06:38 -0700 (PDT) Date: Tue, 23 Jun 2026 15:06:02 +0000 In-Reply-To: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> Mime-Version: 1.0 References: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260623-igb-trl-v8-4-c9b1fc6c3304@google.com> Subject: [PATCH v8 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 , "=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?=" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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::104a; envelope-from=3_qA6agcKCoMqyopsrlnvvnsl.jvtxlt1-kl2lsuvunu1.vyn@flex--jrhilke.bounces.google.com; helo=mail-pj1-x104a.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: 1782227232340158500 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 Reviewed-by: Akihiko Odaki --- 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:28:58 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=1782227267; cv=none; d=zohomail.com; s=zohoarc; b=jNfs/IsNQWLzHi1XwMpOoJgJwfwp917W+aEhh2XrXw2XNdw1CieMBpPrKDorEFbkD6Rd1DmbkAT2U46oBm55bFA5LH46tf/59u0w2lYUnsRrOFysLUBsowSMYVFRML3eLQbdQYQJ0LnEarQR1f0167IgMsZpPKEkON/2dhSXiWU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782227267; h=Content-Type:Content-Transfer-Encoding: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=oT0toD01z3dMY9p/cSubZkI67L2zw3OEmlJDwnKQ2Z8=; b=N7VCtKMRsY9ovzZd9Sk850NwMvxS028/1JWUlXYgj+ZQCjc+J4Jv+dv/yAJrbiUOF8X0sNvD8x1MWX/wja3AL0ihuKdsbhISNUSoCITaMorCiT4+zrbsZEUpp8m0Zktccr1rjRCFh1elfaiDzXfIKD8RvnOTBIVVZcwTmJ8MRPc= 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 1782227267222810.3052490061833; Tue, 23 Jun 2026 08:07:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wc2iT-0006pP-Bj; Tue, 23 Jun 2026 11:07:09 -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 <3AKE6agcKCoUs0qrutnpxxpun.lxvznv3-mn4nuwxwpw3.x0p@flex--jrhilke.bounces.google.com>) id 1wc2i6-0006l6-D9 for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:48 -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 <3AKE6agcKCoUs0qrutnpxxpun.lxvznv3-mn4nuwxwpw3.x0p@flex--jrhilke.bounces.google.com>) id 1wc2i3-0006pG-Cc for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:45 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-8426ed9f24dso776259b3a.1 for ; Tue, 23 Jun 2026 08:06:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782227201; x=1782832001; darn=nongnu.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=oT0toD01z3dMY9p/cSubZkI67L2zw3OEmlJDwnKQ2Z8=; b=mpCigSBvdLLUzxeZcYEdPx+W1HNxb61vBC7TbXLrt6nXmcfLTdgs2BP+XPA4J8GXl9 1CpqgFsBXO/ek5B7is7xdWcJOUu+WAnul/GmrIWpFEeXAqvsJUVNhbDAQVxg3xJhEw/b iqiBg8u1SJ5DBSCWShtQZYP6ZnGnFBKgE5nPqpgBRojSsOrOSJtMqFTeCtKTPtQKtidP 8IDAb3yJpdp1D24wTc91zLlwDDMYqyfHdN/MHLn8tvF66sE1HaCMKEGkMoEkacLavY29 kRhBVQu98RLvo7EebupgJl/doHyiV+EG6QRx6boLffd+7XUC2fxfA7kkiYT9ftjKuau0 thkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782227201; x=1782832001; h=content-transfer-encoding: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=oT0toD01z3dMY9p/cSubZkI67L2zw3OEmlJDwnKQ2Z8=; b=rfl+9OGLzru0inRrSfSkb9ujp8gPiCOAWFcGGZIwAAYpgUSkpikHUNk0vYivi4/QDe +1YTV05p36xGBlgWjTbbAvPNOlp2OZvC3M4b0LGr7dFIdYFLsOh4K2SJwAf4XHVsLi7j OyEtN7kX1Juy/OtnLZtzTzGE2p5oxdS1N0dYeVcghNWhQCWgdLWOKlI37pLlz1EC4DK7 SqPLvf58bLXjYs5PWziF1OIAYsxHbCJht59BgSSxscAXYFWqlwNvdxKy3Rs1fHXyZory nZ7jRbHerNqUbe0tboet6KzXtNV0B+PCYT5Kjv8REMIFsg/PzZK4+St7tJ1S/5hYEH9I bkOg== X-Forwarded-Encrypted: i=1; AFNElJ85J49cZzvRmPGVkuyU1GH9sLfZWFO7Qb8poFhAENO1JZuVFnJ0vHaPIF4YhYlMHePa9778M2Xto1lV@nongnu.org X-Gm-Message-State: AOJu0YxAuuV/lztHUzWaC+TnmSmh14aFLQ3dq2GUcz88qMW7gxtr6GXR SW9owG4dwCRrHP4Sizfzza4GinS3KYKw/85Jn9t/LZDJWaBHg1DtPb2N2pnk4gwL9Al/eDlbK8C X8pOVt08y X-Received: from pfld2.prod.google.com ([2002:a05:6a00:1982:b0:842:32f6:5738]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1494:b0:842:3838:cb03 with SMTP id d2e1a72fcca58-84591c076a9mr3968527b3a.11.1782227200360; Tue, 23 Jun 2026 08:06:40 -0700 (PDT) Date: Tue, 23 Jun 2026 15:06:03 +0000 In-Reply-To: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> Mime-Version: 1.0 References: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260623-igb-trl-v8-5-c9b1fc6c3304@google.com> Subject: [PATCH v8 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 , "=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?=" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=3AKE6agcKCoUs0qrutnpxxpun.lxvznv3-mn4nuwxwpw3.x0p@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: 1782227270193158501 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 Reviewed-by: Akihiko Odaki --- hw/net/igb_core.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 9a8ef15..4fe2fad 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -875,6 +875,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 / 2^14) / (1G / b/B / ns/s)) ns + * =3D (bytes_sent * RF / (1G / b/B * 2^14 / ns/s)) ns + */ + divisor =3D ((1000000000ULL / BITS_PER_BYTE) << 14) / + NANOSECONDS_PER_SECOND; + + return muldiv64(bytes_sent, rf, divisor); +} + static void igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) { @@ -883,12 +925,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 +951,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) { @@ -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:28:58 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=1782227256; cv=none; d=zohomail.com; s=zohoarc; b=E6r5IvyGWSRlKRN3heLD/Yi5LkpUcKfd4PngHfmhSpORETKI2dcOJqif7XV1C0bFf19gY5lOLRUGHmUHw9afydNz37FHEbfeh7WIHDgCIy/gWYs4B3X+OLQKEXTr+TGDKcxfiLzLezVtbjQdxt2oSD51hb4kSBy1Zkm1z8whJOY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782227256; 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=dZEGneTcgdZBtWX7KeLqt1Dt7Mi1muLY9GJm/eKTV0C/3SWtdtVXVBaxWv1Pr/snkZIdvm5/kQew3DH3ABxCJz6KOL7KRFEBV58RQqStOBIJsPXFn6RWRq2upANnkHIFvQVy6FJ0486ABd/zY1s2FsZ9U65gjjO44d5P6nSZnZ4= 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 1782227256508539.6159633258858; Tue, 23 Jun 2026 08:07:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wc2iU-0006r6-IM; Tue, 23 Jun 2026 11:07: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 <3AqE6agcKCocu2stwvprzzrwp.nzx1px5-op6pwyzyry5.z2r@flex--jrhilke.bounces.google.com>) id 1wc2i9-0006lJ-3W for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:52 -0400 Received: from mail-pl1-x64a.google.com ([2607:f8b0:4864:20::64a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3AqE6agcKCocu2stwvprzzrwp.nzx1px5-op6pwyzyry5.z2r@flex--jrhilke.bounces.google.com>) id 1wc2i6-0006pV-5g for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:48 -0400 Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-2c6a48fb4d5so50608935ad.0 for ; Tue, 23 Jun 2026 08:06:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782227202; x=1782832002; 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=jZ5/IPALz+ZCH5wvOHQCuC9OmTe0k6ACTOXeBGUvLyiVg+gZ4YrkKW9lZz5SMFFtRu wcXpxzA3hWBcB6AXfHxcwjV6wbKi7+tU4bsIGL7eWtmYBQGgqG0YexS0eAZUwlowVbbw Pdwdwp9SiEIKT7nppn6Yy1gZNAbaq0P5I7CmbEkLoMSpKYoboD5vHItk3NiMg4ZSkZ7K jDBNmZEi+G/PK16L+bjXa9oqVO+yH9ULqvt6OnYn/TcKR3bVOyVzrzvJHKxfKzLR4L8j FDVE9EDDBubaH6l7GUjw0SedJP24SQv8xfOQN0be7NfSFET8wGR2NZrI8TWi3D0PEBW/ b0bA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782227202; x=1782832002; 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=mjsI9Ml2H0bonNeGxaWrk0gC4k43/6fwUZadJthMNdSqLBDUG+3XiVtOAxjo/CEvpl Ro+f3E82h35R4BN61MdVqKnIc9CoQyEAPQZw3lBXNA/xJqIwLwBpplABHKGGUEQHD7GP aM7bOBwgZLbKIiReuFmIo+mifsgvrO+DFskXoU+uqZ219IHqMr7+cQInK83EdtzrZIKk O9OGuKAD9jNMi8W1pVdmD4bUr8BY1/zPXbREh+V95gG13mWiXgLzR0LmbLzvKLqBc1cg qre7khq+hQaDsF4ZX50fGz45V4LH85+vt/sw2BrBehz5xpRLEUGU+SU8mMnQHN4Si60n FGMA== X-Forwarded-Encrypted: i=1; AHgh+RrUdQdRwtWhGqE5jI4kGoLRIcSGIhVcQ73vpH0ZwwpPGPsiPz/UsmrU613wy+R1FPr81bHfd7to6WpD@nongnu.org X-Gm-Message-State: AOJu0YwIIbS301E9jl12+5LjSrRLRCTRHCY0s0JjW4/w+RyAsV+7qHyY QK3o6t9nxksU9sYrceT3+BUG/C+ow7hYlPbAW1w5uNXiY2PnroU9NM2KO+JL/Lm/lijGCjGORpy phwCQXmI2 X-Received: from pltk5.prod.google.com ([2002:a17:902:6945:b0:2bd:9b10:8067]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e88b:b0:2c6:ab74:985e with SMTP id d9443c01a7336-2c7c76e9d8fmr39349895ad.25.1782227202270; Tue, 23 Jun 2026 08:06:42 -0700 (PDT) Date: Tue, 23 Jun 2026 15:06:04 +0000 In-Reply-To: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> Mime-Version: 1.0 References: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260623-igb-trl-v8-6-c9b1fc6c3304@google.com> Subject: [PATCH v8 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::64a; envelope-from=3AqE6agcKCocu2stwvprzzrwp.nzx1px5-op6pwyzyry5.z2r@flex--jrhilke.bounces.google.com; helo=mail-pl1-x64a.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: 1782227258247158500 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 Reviewed-by: Akihiko Odaki --- 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:28:58 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=1782227256; cv=none; d=zohomail.com; s=zohoarc; b=L0Efyn/mfYNSTrW7eLgx6E6UaLUztaRgHBrEEOf2YUMMhm+hipUIF3kGsWQjKxLkOYpzJk5SSUVirMpqm0kBCG3zI2M1HpJuWSbvZsQxPjdJ1ZLeIMGRpGF7YI4wtGr5uMMpW4zwRAsYpjqKEYkdTlop6S5K/wZhu/53OH3Cnjw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782227256; 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=GANpEjrKi5E6SVLIwV6KujgkDcBuFvgpDIEqRL5F15VuB61KL8x+66871sAbGLPWQdraDRo/eDEHniaDnZ7Z38GoAmoaNYeZ6wqiiwLmlLMXpAWsBtwz9IBFeZPm5V8AiHgOgWXHzM9nXEcJ4/aKGKBUm7lZgMmVhJ+rwDreq9M= 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 1782227256505250.2576369651283; Tue, 23 Jun 2026 08:07:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wc2iW-0006ze-1k; Tue, 23 Jun 2026 11:07: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 <3A6E6agcKCogv3tuxwqs00sxq.o0y2qy6-pq7qxz0zsz6.03s@flex--jrhilke.bounces.google.com>) id 1wc2iA-0006lR-8x for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:52 -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 <3A6E6agcKCogv3tuxwqs00sxq.o0y2qy6-pq7qxz0zsz6.03s@flex--jrhilke.bounces.google.com>) id 1wc2i7-0006pg-5V for qemu-devel@nongnu.org; Tue, 23 Jun 2026 11:06:50 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-842446a3851so28324b3a.0 for ; Tue, 23 Jun 2026 08:06:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782227204; x=1782832004; 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=NwuRxNKgovWfBObm9EaS+5RnV9UW9n8ZaaimtUxffCbOj8gFkuz7+jl9eKz6s5ylpS 00+PDP1L9lRKVv2+Z287TNkv9Nr8TC+AnBL/lP+55PydrekGZ8h/spFwvGlrjOaclKkP Xx7GhA7hL7Ylen8XfggEeBvPesodyQZFcvJCbLLJTdhVaL5KceL/h01LM2UFsmilh9qk Kwzp+JTs7Vdge/JmG99rtHOLZgOYTbuSyTntTLla3bGAp+hAzuzewzjffPWKR0nSp3Ih cmwzUvCTSKMmh9TKjYFffofGOAEaRstdpvPnaAbo+rbSDEyUs981Eg796l1Vy0xbKwuW IW5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782227204; x=1782832004; 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=fnoydlHxo4ZVcMb6es63PFq2cZ719kiz8NFAGsGoLoQ9fMbpWsHGsOm2GaRRBwOlVI t8NNdLDdyhv4DRhvR07PALbHVBvgVJRW++7jC/gW6xcOueagAbXlkBFr6zwTJYiKuQ95 +nv++x9tC0O2AeA33SILdyn3O7Q/dpd/maea0aVAPwLYnz8XJrULU/2ZMPOiIETsp7wA +Hea8WPkOXxlmoSWxhEYmBHRl2x3lMabq3POkufeOBO1ui1XN2yVlfI+tv6TjQseNeWZ Nieb7+5SEKy19zLZshWiRy1SjMj7U95ZmuiGJM0/EsLpsAazrIyPHV4xu1UIH0yOAfku AzvA== X-Forwarded-Encrypted: i=1; AFNElJ8nuY6XEvN5zt0qOEBmnWDXLztKX46CGNyw/lph0RCfnG9w9ZKEVKWRw2eyLvSF1pKmMOhzIGdS3zF2@nongnu.org X-Gm-Message-State: AOJu0YxaPjQszcD8ptmWjKmAeY9Ns+5p+nij6DqN5gPk9mdYoL5eWacA 2H5usOp14kmZDh+rL7l0V12SsHf5s5VVOz79ee0nNvDdXtWefVgJ0kFhv9iw6sjwzhRcJebcMQX rkwhxOadO X-Received: from pfms4.prod.google.com ([2002:aa7:8284:0:b0:842:6fe1:8620]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4502:b0:842:2419:6c0b with SMTP id d2e1a72fcca58-845970652bdmr3983634b3a.10.1782227203976; Tue, 23 Jun 2026 08:06:43 -0700 (PDT) Date: Tue, 23 Jun 2026 15:06:05 +0000 In-Reply-To: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> Mime-Version: 1.0 References: <20260623-igb-trl-v8-0-c9b1fc6c3304@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260623-igb-trl-v8-7-c9b1fc6c3304@google.com> Subject: [PATCH v8 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=3A6E6agcKCogv3tuxwqs00sxq.o0y2qy6-pq7qxz0zsz6.03s@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: 1782227258368158500 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 Reviewed-by: Akihiko Odaki --- 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