From nobody Sun Jul 26 13:28:54 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=1781562019; cv=none; d=zohomail.com; s=zohoarc; b=EFEyfcfvsk+CVH97P/mP0UaL8flQp23OMybG3lTWnjL6OMalQo5D71h4VMBO4hppYR0BbmC1aOb3/YYS+oAWGmRSjTiVtLaykKKH3i7SZL9nO//AiIFGKqeYQj1yzc/ZGpk7g6c6gRFxN6xgEukUhppAWzhhV4NQ1g16X4iNNe4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781562019; 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=yhfF4jlqwv2iVer4SiDpKpg+RBMlVSrisJluQj4yrtw=; b=GdSrfGcbaOQV8W1I9mfXlAQISATX0SLw+a4oMRA4iogvvJILxotEKnO0/AHZckhaN/yeGwBlOA/wlRSUNV4e8fCHKzMoYysEdA6S2BUw3v/a8Hxul8MIog+uSdEkACU/4bD3dQMu6yQwmIZQ7/NbbJkjOHHWoAuIfKVPL0rSARI= 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 1781562019141180.81783846736403; Mon, 15 Jun 2026 15:20:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZFeO-0004x5-9Z; Mon, 15 Jun 2026 18:19:24 -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 <3WXowagcKCmgPXNORQKMUUMRK.IUSWKSa-JKbKRTUTMTa.UXM@flex--jrhilke.bounces.google.com>) id 1wZFeJ-0004vM-6F for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:20 -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 <3WXowagcKCmgPXNORQKMUUMRK.IUSWKSa-JKbKRTUTMTa.UXM@flex--jrhilke.bounces.google.com>) id 1wZFeE-0008ME-CW for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:18 -0400 Received: by mail-pg1-x54a.google.com with SMTP id 41be03b00d2f7-c85dc345ac8so2140102a12.1 for ; Mon, 15 Jun 2026 15:19:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781561946; x=1782166746; 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=yhfF4jlqwv2iVer4SiDpKpg+RBMlVSrisJluQj4yrtw=; b=pc7kAGVlhnrDkNLeSPnj+qAat334gnM8ru4QrDDKGJTvcj3FekZus3J1HPuHST6KIW t3j9YQifur+j1uczD80n5O/+xU/xJtJj7AVsUNR/uLBhLQ1Va1Npk1hbsKOtyr2F236r 9+EZdbUX9JDApn2ll2ulp4cJSSwZ3t9bQyyjgQAHZN5H6TYyIi5gLNAmMypsOJT1c3G5 5nrJa5wLgIknC9kv6T167RMT7lj01nYCu2FX2zeR8GmNZsa2J63srhsOBEnBsp77ZKiG lpzQfKrZZQOgapD8il+tnhXP33r1WBiRTqeaxJSgYVXtdnUd8e3ZO+MlMnJ/nHSF2u9w EYDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781561946; x=1782166746; 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=yhfF4jlqwv2iVer4SiDpKpg+RBMlVSrisJluQj4yrtw=; b=illnonz6NI8MzgIyfugnKZ8cDse3RC6JECaprpcV2frOZlplwGAdhbyfYgOVQ7Yd3/ GJ4KDjUG+goJvx5bMEQML9xjYzjkgkn+XsPP93A7t8s3e6yy3nCfRrSSuJMRGQ1mV2Na ZBby21RyfT9OTMyh4vUiGrDBtB07Js8VH5UJH82WXgG9ecavU7IgEBYMLLh6mUlSjq6W 3pWXvn8DCbRuQiOinuN1uW2Bq19ehYc6OTQFb4rokRa5LxCpDh0A6qc1pzvY3eQAj050 S+2ssRiW82JHM6VENHPbkcnscsO4XN4LMvzE76b2uXhKxVL2uxUDdKNYiL/H5We3jJ/T glJQ== X-Forwarded-Encrypted: i=1; AFNElJ9/2SgEW+AzLSD4WSVDl0MdSecYVvZBmmaXgX2mwaJq+KHSEZwkibji2/v0q548Xa4jjQBjBhMOVa2U@nongnu.org X-Gm-Message-State: AOJu0Yxac8fzClNWRhwEkqq+92WIGDSmdSpK1FgdUS9dQsgaLTGgNL66 +P0ylynF3mFVhW8Tz8LYdtNjLO2gecuUA9nrG3q7AGC8a/V/6CFSwQBWNU1zRxnzELPvSJMix5r jjZ65o81E X-Received: from pgam22.prod.google.com ([2002:a05:6a02:2b56:b0:c82:7761:9941]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:8cca:b0:39b:d937:8020 with SMTP id adf61e73a8af0-3b796445a27mr14534692637.42.1781561945942; Mon, 15 Jun 2026 15:19:05 -0700 (PDT) Date: Mon, 15 Jun 2026 22:18:03 +0000 In-Reply-To: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> Mime-Version: 1.0 References: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260615-igb-trl-v4-1-cf5739bf529f@google.com> Subject: [PATCH v4 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::54a; envelope-from=3WXowagcKCmgPXNORQKMUUMRK.IUSWKSa-JKbKRTUTMTa.UXM@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: 1781562020850158500 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 --- hw/net/igb_common.h | 1 + hw/net/igb_core.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++ hw/net/igb_core.h | 13 ++++++++++++ hw/net/igb_regs.h | 6 ++++++ 4 files changed, 79 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..c94e8d3 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -96,6 +96,7 @@ igb_receive_internal(IGBCore *core, const struct iovec *i= ov, int iovcnt, =20 static void igb_raise_interrupts(IGBCore *core, size_t index, uint32_t cau= ses); static void igb_reset(IGBCore *core, bool sw); +static uint32_t igb_trl_get_scaled_rate_factor(uint32_t trlrc); =20 static inline void igb_raise_legacy_irq(IGBCore *core) @@ -4282,6 +4283,53 @@ igb_autoneg_resume(IGBCore *core) } } =20 +static uint32_t igb_trl_get_scaled_rate_factor(uint32_t trlrc) +{ + /* + * The TRLRC register stores the Rate Factor in 10.14 fixed-point form= at: + * - Bits 13:0: Fractional part + * - Bits 23:14: Integer part + * + * Combined, the lower 24 bits of the register (23:0) represent the + * concatenated 24-bit scaled Rate Factor directly. + */ + return trlrc & 0xFFFFFF; +} + +bool igb_trl_enabled(uint32_t trlrc) +{ + return trlrc & E1000_TRLRC_RS_ENA; +} + +uint64_t igb_trl_get_target_rate(const IGBTrlQueue *q) +{ + const uint64_t rf_scaled =3D igb_trl_get_scaled_rate_factor(q->trlrc); + + if (!igb_trl_enabled(q->trlrc)) { + return 0; + } + + if (rf_scaled =3D=3D 0) { + return 0; + } + + /* + * The rate factor is a fixed-point number with a 14-bit fractional pa= rt: + * Rate Factor =3D rf_scaled / 2^14 + * + * The target rate is: + * Target Rate =3D Link Rate / Rate Factor + * =3D Link Rate / (rf_scaled / 2^14) + * =3D (Link Rate * 2^14) / rf_scaled + */ + return (E1000_LINK_RATE_1GBPS << 14) / rf_scaled; +} + +static void igb_trl_timer_cb(void *opaque) +{ + /* Stub */ +} + void igb_core_pci_realize(IGBCore *core, const uint16_t *eeprom_templ, @@ -4296,6 +4344,11 @@ igb_core_pci_realize(IGBCore *core, =20 for (i =3D 0; i < IGB_NUM_QUEUES; i++) { net_tx_pkt_init(&core->tx[i].tx_pkt, E1000E_MAX_TX_FRAGS); + core->trl[i].timer =3D + timer_new_ns(QEMU_CLOCK_VIRTUAL, igb_trl_timer_cb, + &core->trl[i]); + core->trl[i].core =3D core; + core->trl[i].queue_idx =3D i; } =20 net_rx_pkt_init(&core->rx_pkt); @@ -4319,6 +4372,7 @@ igb_core_pci_uninit(IGBCore *core) =20 for (i =3D 0; i < IGB_NUM_QUEUES; i++) { net_tx_pkt_uninit(core->tx[i].tx_pkt); + timer_free(core->trl[i].timer); } =20 net_rx_pkt_uninit(core->rx_pkt); @@ -4469,6 +4523,11 @@ static void igb_reset(IGBCore *core, bool sw) =20 igb_intrmgr_reset(core); =20 + for (i =3D 0; i < IGB_NUM_QUEUES; i++) { + timer_del(core->trl[i].timer); + core->trl[i].trlrc =3D 0; + } + 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..f3d50bc 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; + int queue_idx; + 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,7 @@ igb_receive_iov(IGBCore *core, const struct iovec *iov,= int iovcnt); void igb_start_recv(IGBCore *core); =20 +bool igb_trl_enabled(uint32_t trlrc); +uint64_t igb_trl_get_target_rate(const IGBTrlQueue *q); + #endif diff --git a/hw/net/igb_regs.h b/hw/net/igb_regs.h index 4dc4c31..9ef628b 100644 --- a/hw/net/igb_regs.h +++ b/hw/net/igb_regs.h @@ -718,4 +718,10 @@ 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) +#define E1000_LINK_RATE_1GBPS (1000000000ULL / BITS_PER_BYTE) + #endif --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 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=1781562033; cv=none; d=zohomail.com; s=zohoarc; b=CYs1X7LQSwqaHI6ytP8uI8v7DMViwJlMkPm+RCRUvr4B+jDEelrGxvNyEB5n63TyIvJ83xj5ttTknz9J8uaNj+KGiZO53tLXiy4w7SqceBnMS0+0ZbViKYEUFurRx6O/Zf0dWOO375+Nh9FbBxyKl4vyqzpJp3b+U9yId+kiskg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781562033; 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=pkJTE/KxfHicCR5p5+MPe5Kjlan0NoBf7pJvty3cI6Y=; b=ZLpwrgeDtmrSoo/crT5OHZ3Ai5EdkbFk7N1A3Bail8z6phGldUXQgsRpXsKGk/WIN3GtppHT7nVftrsqhr/0aanh9p4t0mdxoIomZP1K0b8mmTbGx6eZTHVvk6VrQVOD60EiP0b48zhtxkUDnTxeBDvEbRG0i1yn2xbru13GvkA= 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 1781562033766797.2410269052306; Mon, 15 Jun 2026 15:20:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZFeS-00050r-Io; Mon, 15 Jun 2026 18:19:28 -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 <3WnowagcKCmkQYOPSRLNVVNSL.JVTXLTb-KLcLSUVUNUb.VYN@flex--jrhilke.bounces.google.com>) id 1wZFeI-0004vH-Ty for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:20 -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 <3WnowagcKCmkQYOPSRLNVVNSL.JVTXLTb-KLcLSUVUNUb.VYN@flex--jrhilke.bounces.google.com>) id 1wZFeE-0008MR-CZ for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:17 -0400 Received: by mail-pj1-x104a.google.com with SMTP id 98e67ed59e1d1-36bd4146cb2so4191898a91.1 for ; Mon, 15 Jun 2026 15:19:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781561947; x=1782166747; 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=pkJTE/KxfHicCR5p5+MPe5Kjlan0NoBf7pJvty3cI6Y=; b=dOGj61Mu6adKPVUQgv6XdH1+WHwd5CE+IiEzj3gxiUYC+y3L9rg3cxvQmj5T0dE5op rLGd1WsoEUqHz7f4HZQcI6qR+XkAdhyI+sodFDksMd5lmNTo+sTEai5PR6VCiUvYUFzX rAu6J89lp1n2vdg4xEW2A7OWPsRd+21ur/gfjvKt+/W8vhK96mHhKxDt5d6CsngKUhca 9ZE1QeIVBkHBavkA5r7IwrOpQD1W9T5z/jk3xNcTClntW3Muzo10EqXWp8S06qnJDlcM p5317KZBnsQZrnvjuKBSVTOlsu9Hq+EzL5uyD+8K0m5JGmBVERmOvNySYIZm3cTkcxjx 5x9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781561947; x=1782166747; 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=pkJTE/KxfHicCR5p5+MPe5Kjlan0NoBf7pJvty3cI6Y=; b=fbd2e35eKBYZh6daHvZtyVFYZzeelA+P0iKwqGwUOPA1WUTIuqM9kGg3wBLKMAzT7U EC43tfJDR4BxdO/EyKbifYYibvdlP6ovzrWai5H6jbquhBAvaZd4WwrblBHBSM7lFcc9 4Lhvrri1BF5aKCeCgGVKjJ3qAKdmXFOYDxLmO95SHERqusm2XbVgmIi/s/ImdiYoOG+D g2JCJo1BJLJSPTPp3ovfv0e3BU0N0S7nRwEl6nDjRog8R9ldAtVwzckVfTJZQROVkSzY spT7/NsfVlcjY1N4RKC20DHe0lDHg4xjHar32o8wRwusbRZwGpa+G4VWVbilIzkyhD6+ zZKA== X-Forwarded-Encrypted: i=1; AFNElJ8J6uTAnjEHsCeGTAGmDVWKkRWcFlfG0GHWpjutR2CCBgc9uB2uHg6DtyHuH7U23bmqM+/DuVkFHK//@nongnu.org X-Gm-Message-State: AOJu0YwBR+/vynMtodUhxa9D2DXtkhzdeds8O4eV2Le8oWnZKpSzJF7/ FNudtPSUzDvofyjRDJKci6Y6ZDTwMAe0M8VhFV+/QhDYbq2E6PLd71WdQkKwWH12GQjhIdbu5QA xOrxxIqWz X-Received: from pjtk1.prod.google.com ([2002:a17:90a:c501:b0:369:4f69:1042]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2d08:b0:369:9469:aeba with SMTP id 98e67ed59e1d1-37c5234211bmr846714a91.1.1781561946801; Mon, 15 Jun 2026 15:19:06 -0700 (PDT) Date: Mon, 15 Jun 2026 22:18:04 +0000 In-Reply-To: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> Mime-Version: 1.0 References: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260615-igb-trl-v4-2-cf5739bf529f@google.com> Subject: [PATCH v4 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::104a; envelope-from=3WnowagcKCmkQYOPSRLNVVNSL.JVTXLTb-KLcLSUVUNUb.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: 1781562034852158500 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..04c48f1 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 (igb_trl_enabled(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.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 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=1781562029; cv=none; d=zohomail.com; s=zohoarc; b=IveqrEzhPbDb/OrNs+e8onOdpOsRHmTLw3+RwjiO7gcYB9lUaMWja+5f8QxJi3VvQQcimkji2Al62WKnkSq5qt4QOtDYRcJg5kgG0Zo2m9Gnf2o1Rz67pDfKa6CabbUOCE9TEPLMUVnFH5Tl4NIiLA2oqdeW77VaQH+ZHCgj/7w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781562029; 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=c+Ut7VXMVVKOm7Ds5xHh28zb95dDYWMajWTQ/Qfkv1w=; b=Dp0C0e9FxxAtgEPzQEpyYcpG6O1Hw83SAK2DVSBryvRCDpD23oCBCR5/2hbBa2cWo+5C7JTjnoxzqJFYRe90Dt0ZeocFKqqY3RiFC7+WkhJaH9sfZlf1rnOb27xu+ruPhbQUOU29TYbKu9WpPciAL1K8a0Wt1DlK6fxJgFANkrs= 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 1781562029112430.4727291112174; Mon, 15 Jun 2026 15:20:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZFeS-00050B-2c; Mon, 15 Jun 2026 18:19:28 -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 <3XXowagcKCmwTbRSVUOQYYQVO.MYWaOWe-NOfOVXYXQXe.YbQ@flex--jrhilke.bounces.google.com>) id 1wZFeK-0004vr-GM for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:22 -0400 Received: from mail-pl1-x649.google.com ([2607:f8b0:4864:20::649]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3XXowagcKCmwTbRSVUOQYYQVO.MYWaOWe-NOfOVXYXQXe.YbQ@flex--jrhilke.bounces.google.com>) id 1wZFeI-0008Mp-9d for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:20 -0400 Received: by mail-pl1-x649.google.com with SMTP id d9443c01a7336-2c0b1bb53a8so24154195ad.0 for ; Mon, 15 Jun 2026 15:19:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781561950; x=1782166750; 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=c+Ut7VXMVVKOm7Ds5xHh28zb95dDYWMajWTQ/Qfkv1w=; b=jmtqNu8nHIxhTVUgHFSqErS5WjuJ2mupUYMBIkbvH4lbmi0qUDnODaRIHrjaSvd5jS dqN9bitckhZRNsbwZWQNQznRjdW/s7/9U8+cLLv0rqOleHKo1fnU9AdNoktmDlRzb7oY 6hOQR17HO1Pe/tqPgJ/RJ3wfsNbpyyrmzCEy4XKVCclGqxD4DS4O9U5Zl6qZmlJeTSg4 sqkCDidA5KyVQXIdzu9OOdLX8Gtq5D1LQ5A8/CwYNtpOQ8ZkC1h/1k13I7NOzF0eUsAL PSQodzldOw+jzyC/gQfzCAGWMuPBGQ3LjBFFxEIlDUt90GT+IkQ/cD4ejfyjJIeGqV1I /CSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781561950; x=1782166750; 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=c+Ut7VXMVVKOm7Ds5xHh28zb95dDYWMajWTQ/Qfkv1w=; b=AyRbYR+CaoBm3hNh6pjRMvHRZx4vwOtRslStMC8cm6F8+p/dWqTYJBVojFYhoqMe9s wGdRAH7RsekRpYJ/6yZXK/SwZl8C4RoGcR0pMDB503UEbeMwbF39451Zcm4ZnBknHPPt CwI26ND1RMiPgmAATkfvVeRWsUnBLOEHkimW4ePltOP9PLmCiYe8RYAyoaaKTSlQQ9WL XJvr2oPmDCLMco12ZoIp+melFnHXuZ6xwZRkouQCqg9KT9i8A5W/e8ptyaYFXeLYa+/r HkfYxQpjfNr4plGPKEbxT+IbB4bOqXqmE+ZQFn2S/pANSGaZd2+MtlH2s/pXDAl88qln S6kw== X-Forwarded-Encrypted: i=1; AFNElJ81fnC7r6ErDw6kdSjwp52xKzvKTIX5li79UwZRnhVmefNIwP28AU3uY63GWCTbbDDdZcpcp8uQp+Ae@nongnu.org X-Gm-Message-State: AOJu0Yys4pHz8hXaglN+2mo7r4lak5HQETGt6Y6gRuWj20kaYz/2Nrbm BUiGze7ofLz6h/qUqjY/oIlsbp9RaNcLhA2ApdUd5FP0ViA0fHHH6yE6zIKn/aRn6PX3uh/+y3H CmSHtXoWr X-Received: from plbkk6.prod.google.com ([2002:a17:903:706:b0:2b0:46bd:4fe5]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3885:b0:2bd:9b0e:b43a with SMTP id d9443c01a7336-2c699a91247mr10884615ad.7.1781561949482; Mon, 15 Jun 2026 15:19:09 -0700 (PDT) Date: Mon, 15 Jun 2026 22:18:05 +0000 In-Reply-To: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> Mime-Version: 1.0 References: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260615-igb-trl-v4-3-cf5739bf529f@google.com> Subject: [PATCH v4 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::649; envelope-from=3XXowagcKCmwTbRSVUOQYYQVO.MYWaOWe-NOfOVXYXQXe.YbQ@flex--jrhilke.bounces.google.com; helo=mail-pl1-x649.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: 1781562031430158500 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 | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index c94e8d3..dea8136 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -2137,11 +2137,27 @@ igb_set_phy_ctrl(IGBCore *core, uint16_t val) } } =20 +static void igb_trl_disable_queue(IGBCore *core, int qidx) +{ + core->trl[qidx].trlrc =3D 0; + + timer_del(core->trl[qidx].timer); +} + +static void igb_trl_disable(IGBCore *core) +{ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + igb_trl_disable_queue(core, i); + } +} + 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 + igb_trl_disable(core); + trace_e1000e_link_status_changed(nc->link_down ? false : true); =20 if (nc->link_down) { @@ -2624,6 +2640,42 @@ static void igb_set_vtivar(IGBCore *core, int index,= uint32_t val) */ } =20 +static uint32_t igb_get_trlrc(IGBCore *core, int index) +{ + int 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 val & 0xF; +} + +static void igb_set_trlrc(IGBCore *core, int index, uint32_t val) +{ + uint64_t rf_scaled; + int qidx; + + qidx =3D core->mac[TRLDQSEL]; + core->trl[qidx].trlrc =3D val; + + if (!igb_trl_enabled(val)) { + goto disable; + } + + rf_scaled =3D igb_trl_get_scaled_rate_factor(val); + + /* Zero is not a valid rate factor, treat as disabled */ + if (rf_scaled =3D=3D 0) { + goto disable; + } + return; + +disable: + igb_trl_disable_queue(core, qidx); +} + static inline void igb_autoneg_timer(void *opaque) { @@ -3679,6 +3731,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 @@ -4127,7 +4180,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.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 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=1781561980; cv=none; d=zohomail.com; s=zohoarc; b=dEwyRASbSV3I1GqTYrbjMF6OgcKrkaFTI+1qwvMPPjg3tu6FebnDUSZInkbLYGopL/kTuxVO3Nc4T1u6MuVwwkxsOUMyygFEz9wVBOCvRCaF7iJUv06SIdigIWD3JDVrnGh3JvBVu2lfrYuOzP41wuIb+zhQXosNtRsTMfY6tx8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781561980; 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=eOKAi0jvceWVaBXIW4WG1tFWvFk5cjTpiZMy09F5ILY=; b=itqYCQtzt/WMaVFJHPjouXtGdmdnFgrO6cdL3ATaFP/ROLN2+E5NpZZyT3gdPKk5PmNQD5ThelTwq90+6ddrHFM9ML05j/j7Wr65AJqsveXJAwdxYQRpPI+L6GM3VD1wxHfzrZFKyzkIA8IoNTgbiV0DoNlVXNHfrUhcQGhKK1k= 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 178156198058335.078340919764514; Mon, 15 Jun 2026 15:19:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZFeO-0004zj-W3; Mon, 15 Jun 2026 18:19:25 -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 <3X3owagcKCm4VdTUXWQSaaSXQ.OaYcQYg-PQhQXZaZSZg.adS@flex--jrhilke.bounces.google.com>) id 1wZFeK-0004vu-KD for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:22 -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 <3X3owagcKCm4VdTUXWQSaaSXQ.OaYcQYg-PQhQXZaZSZg.adS@flex--jrhilke.bounces.google.com>) id 1wZFeI-0008ND-9b for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:20 -0400 Received: by mail-pj1-x1049.google.com with SMTP id 98e67ed59e1d1-36d98b74447so3092867a91.2 for ; Mon, 15 Jun 2026 15:19:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781561951; x=1782166751; 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=eOKAi0jvceWVaBXIW4WG1tFWvFk5cjTpiZMy09F5ILY=; b=uSV9Io2+SaAT+We5gU+AwldX4KyM/+yCMjBPTpLnvEFuJHs/P49dUqigyr++mxOxVv lr6qLVl9fyYPUwxmRQtKFMZ0mw37dUk5cGBIlXSls43ilz0uw5PSdnQSxoPiqjPNW5us 5F/x4djTSfNWj02qVs/qvZ0ER1TYDq3iq4MnbiZdbzDm83foBojPKA5t+iwC68+xnGdO kID4/OvpDKuYhGEEOP0gzMtGT4LhQSGKEo6bvdu9Af9DGU+NSVPP9Ysz4PQtqJAhjx1w 8iv8R+X5ru9Q31yMbrSO2LJJ7NKyryVF6ZAGbQHyCgzpNfMjo9nThOnChZgvhTe6A/Y/ l3xA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781561951; x=1782166751; 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=eOKAi0jvceWVaBXIW4WG1tFWvFk5cjTpiZMy09F5ILY=; b=C8sK5ZcjGzHsC1Mf/foxuR++1boXEmi5j0tMdSE9d/RrrYGgYIVqiRckf9MBOghtwW 9QlnFQRgKPQvS1kpzNDZOg0siG2T+s6CjlelYLMYsqYlu+OKgB+8S5H1/MCW/DPdrUfo 7xwBUi4PfHPdwQffkShKKTZpuOGXc9+/I5DWXcLDG20xsFHkuAwqYvddS1o7ZP97txTa ql7MY2Oge7mbce2BDdFqEhSqCYW/62YB96WosOlK/OVLeJVdn1Fv0klvhClXyMQpR1Kn WxjzWglAGlbPfW98GIeEUxSa+vNVptS6PYxbD+AmkHZgF3dWRSOcWSxL7e3vGkA/HNOh 70Jw== X-Forwarded-Encrypted: i=1; AFNElJ/RiA8LZ+tVJElSH3+IaXBybvgji1FdkJGnCoiA1AV4RHNa15XMOZDZMOAafzae0bhHVOiR48I+FBX+@nongnu.org X-Gm-Message-State: AOJu0Yyfclw//oMC1S3P7zxr3CrGHaDFk6GJ9ZJ+jImXva5rUo0othPa ocGvgfyxbcDHR3Pee9mJ4+Ahq5XPOdZnl9pDXcWVDsf3P9dKjO8VfYdYmPr8JTyjYcjEgpvEKDA wiFKZA2KH X-Received: from pjl5.prod.google.com ([2002:a17:90b:2f85:b0:368:bb57:bcb7]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:38d2:b0:36e:2106:dedc with SMTP id 98e67ed59e1d1-37c52923dbdmr930176a91.22.1781561951194; Mon, 15 Jun 2026 15:19:11 -0700 (PDT) Date: Mon, 15 Jun 2026 22:18:06 +0000 In-Reply-To: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> Mime-Version: 1.0 References: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260615-igb-trl-v4-4-cf5739bf529f@google.com> Subject: [PATCH v4 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::1049; envelope-from=3X3owagcKCm4VdTUXWQSaaSXQ.OaYcQYg-PQhQXZaZSZg.adS@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: 1781561983208158500 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 dea8136..fac4c44 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -600,7 +600,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, @@ -633,10 +633,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 */ @@ -655,11 +655,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) && @@ -676,7 +678,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.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 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=1781561984; cv=none; d=zohomail.com; s=zohoarc; b=bnWZRBS5HpLp79IwyWTyDxz2WpLJQkvOCFq9Z9OvfmRL7WNGo9jQHfD1ctexhrFhLRm4LJQHzeky62jdQpcSlfz+s88BtGxUp61b/6lr+/7CXzEaJbdR8e2lnINhdoLHIZNBaWPQSnb9YLlpg41mVKYPy4/L8T1NFahPOs4kP3k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781561984; 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=x6v58NaQN72zsguJx34RQhgS6oikfMI+z+7mN01OJh8=; b=hFIWJtVqzE/k8uRWkNMNofHEw0G9u81Ej3+pBDHUudisM6JgvWxvBSQLpOVUDJITIIhfx2c+jtB6IskAIwZJd7RzJAQEww5E2/OtfTLswpGJ0NBpZ/edZfTF+WpY7/eZnu3k98iJpuYeXUkkRj7pkuPBqDug0CiVWIC3+rPFRu8= 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 1781561984357411.2338741227135; Mon, 15 Jun 2026 15:19:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZFeW-00053K-Cv; Mon, 15 Jun 2026 18:19:32 -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 <3YHowagcKCm8WeUVYXRTbbTYR.PbZdRZh-QRiRYabaTah.beT@flex--jrhilke.bounces.google.com>) id 1wZFeK-0004vs-GY for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:22 -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 <3YHowagcKCm8WeUVYXRTbbTYR.PbZdRZh-QRiRYabaTah.beT@flex--jrhilke.bounces.google.com>) id 1wZFeI-0008NM-9e for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:20 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-842cb4c62f9so3056600b3a.0 for ; Mon, 15 Jun 2026 15:19:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781561953; x=1782166753; 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=x6v58NaQN72zsguJx34RQhgS6oikfMI+z+7mN01OJh8=; b=um5ferIkAppvQieL6D9rlT7WO6yU2DS57mYfZATqk6IXNaNFtd0/i7aA6GxYOygnAZ I5aLFC6vGezjXU1PLXhyYPNdcwwIew1RbHo0nqyr8klQImh7wUfoOSL5lyGxsgbkdMUi ss3WODeYVHMH5a494AmiC4hNBOG6zuk4JGKHYAtucidlpnQKIMbz3CrGoe02daWSNUsw NYo/HKLbPpH0vT4dYOdiY2HeXXw+mcTmFIiFD5C/K13GNS2OCKqigXoOMMxrQLtIvF2B dUB5Q/QLk+Oauf80w4PLrLmhB9puUOcnSeSoMHnAP+xASasVHpHxR6f0+KsQjODBo15D HC6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781561953; x=1782166753; 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=x6v58NaQN72zsguJx34RQhgS6oikfMI+z+7mN01OJh8=; b=TPQUmuN9H4KVOJDgac3nCaIJnq9bgeJdWWjMYdTngibKC85a7quEmtrHC/yJPXkeoH j8m6q8D0ELnSphlvOF2p2hoELbDze1wRXDGkUweKpWj5k7zT/wDj9PopL1e+bittbdYq oFQU0Zx8bwAA6Abi6nYMLAOgy+JoWBVNFsXDqVaFw1ZhX3YxQUtbXxgtVjDKMJMiNdAg AckRF8pYttXzoEbs2vl3y6jVr/4raLCrhpGQGA4P4kIrRU0ZQ3p7mI8PhOwX2IvtIbzO 7nfP4lNfrCeUIb94COQiJVSs5EB1CYqjCmb4NsCAL7TzP3tSodvJ4NTgleToZH+xIj8Y bVPw== X-Forwarded-Encrypted: i=1; AFNElJ+xU+BsqGQgaj3s+JFhpKrGrXfQPx2vuv8x8YvGWWgYa0Cm56DaDq7eJeLL3SpZfuTlKP9skTT9tGUW@nongnu.org X-Gm-Message-State: AOJu0YyIZEIfc/Xh90apB2sjlMXA5aHD3yjCMmSVf2Hkgb0KFF1o4qR5 J/eWhnjhMq78QcGDcMft7zTImBaaR0GZ3GEV0ipqlUOKxJMgXu3mPKV4hBX5c59oKNpI7hgI0nK 46FV0DqyS X-Received: from pfblr42.prod.google.com ([2002:a05:6a00:73aa:b0:842:8522:9ada]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4c86:b0:842:3804:590d with SMTP id d2e1a72fcca58-84513e0d9f9mr1008216b3a.7.1781561952776; Mon, 15 Jun 2026 15:19:12 -0700 (PDT) Date: Mon, 15 Jun 2026 22:18:07 +0000 In-Reply-To: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> Mime-Version: 1.0 References: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260615-igb-trl-v4-5-cf5739bf529f@google.com> Subject: [PATCH v4 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::449; envelope-from=3YHowagcKCm8WeUVYXRTbbTYR.PbZdRZh-QRiRYabaTah.beT@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: 1781561984568158500 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 --- hw/net/igb_core.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index fac4c44..17eeba4 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -876,6 +876,12 @@ 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(uint64_t target_rate, + size_t bytes_sent) +{ + return (uint64_t)bytes_sent * NANOSECONDS_PER_SECOND / target_rate; +} + static void igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) { @@ -884,12 +890,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 target_rate; + uint64_t delay_ns; =20 if (!igb_tx_enabled(core, txi)) { trace_e1000e_tx_disabled(); return; } =20 + if (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; @@ -903,9 +916,19 @@ 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); + + target_rate =3D igb_trl_get_target_rate(&core->trl[txi->idx]); + if (target_rate > 0) { + delay_ns =3D igb_trl_calculate_delay(target_rate, bytes_sent); + if (delay_ns > 0) { + timer_mod(core->trl[txi->idx].timer, + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + delay_ns= ); + break; + } + } } =20 if (eic) { @@ -2143,9 +2166,16 @@ igb_set_phy_ctrl(IGBCore *core, uint16_t val) =20 static void igb_trl_disable_queue(IGBCore *core, int qidx) { + IGB_TxRing txr; + core->trl[qidx].trlrc =3D 0; =20 - timer_del(core->trl[qidx].timer); + if (timer_pending(core->trl[qidx].timer)) { + timer_del(core->trl[qidx].timer); + /* Flush the queue of any pending packets */ + igb_tx_ring_init(core, &txr, qidx); + igb_start_xmit(core, &txr); + } } =20 static void igb_trl_disable(IGBCore *core) @@ -4386,7 +4416,13 @@ uint64_t igb_trl_get_target_rate(const IGBTrlQueue *= q) =20 static void igb_trl_timer_cb(void *opaque) { - /* Stub */ + IGBTrlQueue *trl =3D opaque; + IGBCore *core =3D trl->core; + int qidx =3D trl->queue_idx; + IGB_TxRing txr; + + igb_tx_ring_init(core, &txr, qidx); + igb_start_xmit(core, &txr); } =20 void --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 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=1781562030; cv=none; d=zohomail.com; s=zohoarc; b=QTrvSAON9A2Aq7aEFytHikT2gMJNeUsYa+lSJBincNJ5TcuF99KpK8q4Y5NcynNkL1XstJpb1hck97HeJUtsEUv6ccaqXgq7P8pswTW/5EPx1eKXg4ZHZUNvXMx4TGeiaOPpCAxmBTRiSmnXsBx69gP6c+k/3F90/ZdtlHM8NFg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781562030; 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=vT+G6PpVv3/b6AactbiPBfLDgfqkldAmvTCmGPSl+Vg=; b=kZq2+0DQgAT1/0HV+FUFxRJnXU9w2n8ljjD+yGfJ/bqGl8fDtJhauFDC57DOeTmPTvGmDikDUCIiKhSaE0kQFoMKmQC799+e/lxIod8VFraP2CdbFDpo90IROv856Q/dBIB9JEuOHVAROunsaLVpbxM9z+UUDuqQnnxbw4TyVBc= 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 1781562030259203.59245999535779; Mon, 15 Jun 2026 15:20:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZFeS-00050A-29; Mon, 15 Jun 2026 18:19:28 -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 <3YXowagcKCnAXfVWZYSUccUZS.QcaeSai-RSjSZbcbUbi.cfU@flex--jrhilke.bounces.google.com>) id 1wZFeL-0004vv-S7 for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:22 -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 <3YXowagcKCnAXfVWZYSUccUZS.QcaeSai-RSjSZbcbUbi.cfU@flex--jrhilke.bounces.google.com>) id 1wZFeK-0008NQ-6m for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:21 -0400 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-8422ca754d8so2879810b3a.1 for ; Mon, 15 Jun 2026 15:19:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781561954; x=1782166754; 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=vT+G6PpVv3/b6AactbiPBfLDgfqkldAmvTCmGPSl+Vg=; b=Q6f0d98xfnbeVQqRkZV87X0yv6efrDu5jKQjo1X1yafVq9Sjqbaur8/3+x7K1IIjKG iMcqTna7RzQJLYkYcnDiaZWD1+K0NWuHQJ1jWW8Gxue0N2aX9tdR47IR2LprrUGFJaEr Jyx/op7GCJ3bbXx+GNzYlFYJx/tXbRDiGkuVb4iboVEzEVYp/yg13r2UNdORvv3Hvc+o EhK82StKHpeNZQG+RQBpa58P8xtft725ts7L0t0M0CLttoNh6G7rHnwX/zRrOJz5yMbQ yhJapDsv1262pF0yQ4Ese7DroOSKdc4gEc9BTP0XkwyeQPQyfLPdB8pTH/c5ME/dTR/I QpNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781561954; x=1782166754; 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=vT+G6PpVv3/b6AactbiPBfLDgfqkldAmvTCmGPSl+Vg=; b=IJkje1yqUL8Udvy+4ukCchXmJwk9RF3mS150GXEqCczCz3CfKVUbWnWTpZYR7eU7Lz j5R5P8QkxmoJsgbLR6eHsHKtcEbV9wGsHEK1BaUh0SHGm+HpBu27LnHXGTEnOHqq7MsO W6XLaHQCsHMJ9BLJh7inNAQRUytRlqp4+Wzz2spiRVp+keCl8sUZ/8z6eqzddMQ78xw0 tcWM5Xv6eAsTNY+3dKFBsh35lnMn+xiK/9PlMxkskpn/hCeaqonxXRYFeu7kiwdd0n7M fcmrhR/7honYYqV3uKqAaCQGQn7QfXMujLg6YT2UHuxn6rPXuVBC3TCjSysm89AonS0K Jf5g== X-Forwarded-Encrypted: i=1; AFNElJ+J+zfMQXzLT78NA8mW3qvMp7LQO38hbzpoMStcm+8SIPn5ZwYidMi3oDCGK8IzYxsHdUkJzBuNCImB@nongnu.org X-Gm-Message-State: AOJu0YyCe3xRNzBi443eUd5RjoO1nqbg444fhw7lhcJDyV593AlEYlmn klB+6ZeCVUoTjosFbKSsmvJfWKocFHaXxyUIFDzqdJ2CiBqblv6uJnU5CmYn6D8IYdAql5JQrzV O8dKMOruW X-Received: from pfbk13.prod.google.com ([2002:a05:6a00:b00d:b0:842:5f66:324]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:aa7:88d2:0:b0:835:4291:6975 with SMTP id d2e1a72fcca58-845155ca464mr666050b3a.39.1781561953580; Mon, 15 Jun 2026 15:19:13 -0700 (PDT) Date: Mon, 15 Jun 2026 22:18:08 +0000 In-Reply-To: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> Mime-Version: 1.0 References: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260615-igb-trl-v4-6-cf5739bf529f@google.com> Subject: [PATCH v4 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::44a; envelope-from=3YXowagcKCnAXfVWZYSUccUZS.QcaeSai-RSjSZbcbUbi.cfU@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: 1781562031427158500 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..119be6a 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 (E1000_LINK_RATE_1GBPS << 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(E1000_LINK_RATE_1GBPS / 1000); + 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(E1000_LINK_RATE_1GBPS / 500); + 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.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 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=1781561980; cv=none; d=zohomail.com; s=zohoarc; b=ORnQlZjh1kdYXlBRDxWqDfKTg4T2m6o7fxsBvmmtqK0eH0/jt2Yebq9I2G0XFgJ9UfQHbl/BfjHSSmfNLyDHJ9GyufWREinK2XbBCtv0bh3rjcG/OpG5IBE0+h/Pcthe/4e7LCEslUZ0DtRlBWf7PYN3VBKMiWnSGG5lU1czZcc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781561980; 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=+O1dHWDOSJ55QHlZapXvR2r6qYGjNQa+WWJ3hC2i0oc=; b=KQPcrlBkPgGL6fJ9dqeoIxamrseB0eZ6BdeGrukyyDGqpo6x91F9ZONX9hbltCU331EfOgHaV6jijkoIshx2VLnvEz6/Dv2YpC0BRsdRCluH3BfDfNspQwhTIJaa81+y7MqyxjZQMowL8ewK/2c/BnZwi6Dmdnc6PoUg/NaB4fQ= 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 1781561980811959.8957411521477; Mon, 15 Jun 2026 15:19:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZFeX-00058I-De; Mon, 15 Jun 2026 18:19:33 -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 <3Y3owagcKCnIZhXYbaUWeeWbU.SecgUck-TUlUbdedWdk.ehW@flex--jrhilke.bounces.google.com>) id 1wZFeM-0004vy-6t for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:22 -0400 Received: from mail-pl1-x649.google.com ([2607:f8b0:4864:20::649]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3Y3owagcKCnIZhXYbaUWeeWbU.SecgUck-TUlUbdedWdk.ehW@flex--jrhilke.bounces.google.com>) id 1wZFeK-0008O0-6b for qemu-devel@nongnu.org; Mon, 15 Jun 2026 18:19:21 -0400 Received: by mail-pl1-x649.google.com with SMTP id d9443c01a7336-2bfdd99f6b7so61349585ad.0 for ; Mon, 15 Jun 2026 15:19:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781561956; x=1782166756; 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=+O1dHWDOSJ55QHlZapXvR2r6qYGjNQa+WWJ3hC2i0oc=; b=DAKE+WH/3nGuK5ImvCCMohy+LaYk0UnaTZEOq6wR2yHiNAd0I51udb9BrQna/ZhwNl EaneaOVSjJZu524c3kbgqFOiH847xS+6mmEUKC2502EFpoFAuxbxpc8+/nOHe0QWWXKK s59WXQUvmkFS6T+sqgU1ttSmM8tM/R7Zxc6i/o1guXfagoI3C6f4jBwc1eN7ASWFxF9K jN1POeqP2DbELsLMTAjfN9C0R1L/99wp22oBegJBveYSv9kSDJC6Y0zVSH2Xr0BJCVq1 yhmUcCw8mLAdgi2nP1DFmGD+RpI+Hc/egZ5BDSwtpm7zpi2vZ72Bl3POTyEcwUi3+93f uwZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781561956; x=1782166756; 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=+O1dHWDOSJ55QHlZapXvR2r6qYGjNQa+WWJ3hC2i0oc=; b=Qn/+nUPe5gbQ+/X7joDBuvG+FBk1Qbw0sjrjx6CKsMN4G0hg7VBG9Pj0hj/3ueUnZ3 R+EAEsJByycQd3UC7rIBezR+pf5c7uUKEJp8NcGVIbL4XW0TRaTNO7UB+299t0UTF3nJ Th8BTPm7MjET8fjSZIwbrNLEvFnOphlWxwLetCafPlKjFFqoKjyKRzF3I0VaQ7rHty8K Yw2mYgeWTiKockiWyPUjS83+7N/X57Y2AlV0EwjA20ZCj6tdXZUkYzHD+snGCv7MoXfS tcCpTTCx7D4GkfEMYQqSadn0Oe09A67FRWAghZXA8gxnUwowFtZ1zQZxz8uviTPjxsFh v+Tg== X-Forwarded-Encrypted: i=1; AFNElJ+7eOEPEC7116RL+4U2yE25icmZrHpAQxOD5NCZSqKUBB1f10c2UijNpDhClMFMvWGg7dM2oKk2r3E3@nongnu.org X-Gm-Message-State: AOJu0Yw0clYvPMS0Vsny93mmj8g7PvxWn4SbGIiFVCpqM8v+r1xCcWj+ UQh5yJxfOFb0eXhqXLrsGeGUAq+DeZ4pYxyLW7uyHyTz/qKvLID671Xl2n0RYduJc0vXxH6qVnh D79D1B7/F X-Received: from plbkp11.prod.google.com ([2002:a17:903:280b:b0:2bd:2c14:7974]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:41c2:b0:2c3:5683:9acb with SMTP id d9443c01a7336-2c69a1c6ea9mr9736345ad.32.1781561955585; Mon, 15 Jun 2026 15:19:15 -0700 (PDT) Date: Mon, 15 Jun 2026 22:18:09 +0000 In-Reply-To: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> Mime-Version: 1.0 References: <20260615-igb-trl-v4-0-cf5739bf529f@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260615-igb-trl-v4-7-cf5739bf529f@google.com> Subject: [PATCH v4 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::649; envelope-from=3Y3owagcKCnIZhXYbaUWeeWbU.SecgUck-TUlUbdedWdk.ehW@flex--jrhilke.bounces.google.com; helo=mail-pl1-x649.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: 1781561983315158500 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 | 158 +++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 158 insertions(+) diff --git a/tests/qtest/igb-test.c b/tests/qtest/igb-test.c index 119be6a..153f5fb 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 (E1000_LINK_RATE_1GBPS << 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 | PCI_MSIX_ENTRY_CTRL_MASKBIT); +} + +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,77 @@ 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: + * (E1000_LINK_RATE_1GBPS / 1000) =3D 125 KB/s. + */ + igb_trl_enable(d, E1000_LINK_RATE_1GBPS / 1000); + + /* + * 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 +454,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.54.0.1136.gdb2ca164c4-goog