From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781727399; cv=none; d=zohomail.com; s=zohoarc; b=Ls71oKYSham0ri+utQpTe3vZApLZ75/NznSbXJrqfUz4Wlv83RDZkOvnCyQNkEicfAQ7xonnIDfvdoz8+nroVSvk1gighNhC3tG94r06dxQEocY4GiAGKWLJqceN1L3unjZx0y8STg8OxkKyu1QOaA/hUa1snqrt3hdazG9Kem0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781727399; 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=FEvtWj3r4LW5e8S8uhN/YmsaM6S2vyKxTPj8HfvAaYg=; b=G8FhKUarDr/AC1XiUvrsYwa2kTEX7pLDCRpKBcIo6DPZtOOTRIQyy0CEWRbRBOnRZZejMoCglxWWQXOrp/gsKjL8A94W1Wju0ZEiLMK7VRHL/pSRywATxrlBbRMsaTj5RzXxcnoMiVZH/AgPZZxtPzCCEZfcDGMtHFvkfUrU20A= 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 1781727399129527.5164478372877; Wed, 17 Jun 2026 13:16:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZwgF-0002af-M4; Wed, 17 Jun 2026 16:16:11 -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 <3hQAzagcKCqoTbRSVUOQYYQVO.MYWaOWe-NOfOVXYXQXe.YbQ@flex--jrhilke.bounces.google.com>) id 1wZwgD-0002Zv-Jx for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:09 -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 <3hQAzagcKCqoTbRSVUOQYYQVO.MYWaOWe-NOfOVXYXQXe.YbQ@flex--jrhilke.bounces.google.com>) id 1wZwgB-0002ol-VY for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:09 -0400 Received: by mail-pj1-x104a.google.com with SMTP id 98e67ed59e1d1-36bbcd40642so67739a91.0 for ; Wed, 17 Jun 2026 13:16:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781727366; x=1782332166; 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=FEvtWj3r4LW5e8S8uhN/YmsaM6S2vyKxTPj8HfvAaYg=; b=Ll4YZZ1/nIDj2d2RskMr+lU0DYVMEi/rurq4XnEEpZgbGLnQZerC2bxXrf/sc3eKTN 97g9QrIc4MiFJL6wnWbP67CEPirK3ZlqciGudgA2d1cxlUiXH3ZOc4vmEOS+HRG07iIp 9kRnufoLoV+rxLYhW+GyrGLyvE+9QiUPvoruqLpfA+ZbThoGx89NND//C6RcDccn527F cUBrQ6y8Ghapa3FwCiCl89538iMmI3xRWFRIcGpoRXGvp76VbW8KzGM+saxQ+nP6XeKM wjDpq8qNHo6GN8qd7Nax25yJ+X97o0l6Qefrz/+iClLYAi7n5nsH5E33iheW3f78kZEz 8Oig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781727366; x=1782332166; 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=FEvtWj3r4LW5e8S8uhN/YmsaM6S2vyKxTPj8HfvAaYg=; b=NimRQh/1fcgADOd/41IzDw4eCfEpkXOoiuTOUeQJ/i4Iv9xJc7F68n8yAdRIWkFl/0 k8wyB1vh5MQk1cppJ4a2Kja9qs3lNmb7pt/c48jYu1JQCFPu5YMyy63WbdzAT9Rsq8iC Q03QUuLOeT2iWq7LWGv6VWjqUcNXehFm90iTD6DOyAAcQM6Obvz7jN5On/4o50Fd+KX3 C0BhlOh6FZDVr1irUigcDhgO5WHzZCxpedElynvp+v0IYxg8qzpFZjwa2y0mmsZHXB34 RZhyJ66KxSfWkCACWwJ45liATcCkNsUo8/zTbFLIP4HZDdoFpvXrIkzeyYT52PM0AQZf RgqQ== X-Forwarded-Encrypted: i=1; AFNElJ9aKzULkhLBBhw9tRF+KwRGvTrTWctcnfDqOUxfSpot6sLVyJy2SUH10uyK31PHsk4vlX+AgizavYJn@nongnu.org X-Gm-Message-State: AOJu0Yw1kng8GTYu1GPt5yP5wHz3zI/+/yUr8Gos1OS2yXWj0OBAgQN/ m/n8LooxyBKF0ZMrTx3uLPg7nlJudKY5LdQ+pZ1zO7vKjhbGZGyz9eft4Y+YqVI0SIUmnK86oGY 9Y3dZtLC8 X-Received: from pjug23.prod.google.com ([2002:a17:90a:ce97:b0:365:d4d8:94c3]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:558c:b0:36d:81b3:61a1 with SMTP id 98e67ed59e1d1-37c930d223cmr5343082a91.7.1781727365805; Wed, 17 Jun 2026 13:16:05 -0700 (PDT) Date: Wed, 17 Jun 2026 20:15:46 +0000 In-Reply-To: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> Mime-Version: 1.0 References: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260617-igb-trl-v6-1-bbdfcadb81e2@google.com> Subject: [PATCH v6 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::104a; envelope-from=3hQAzagcKCqoTbRSVUOQYYQVO.MYWaOWe-NOfOVXYXQXe.YbQ@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: 1781727401643158500 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 | 41 +++++++++++++++++++++++++++++++++++++++++ hw/net/igb_core.h | 12 ++++++++++++ hw/net/igb_regs.h | 6 ++++++ 4 files changed, 60 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..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.55.0.rc0.738.g0c8ab3ebcc-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781727418; cv=none; d=zohomail.com; s=zohoarc; b=OF4CoE60E7Ztg4brwEFS7rOHJQwOYhmkApJ/N+fnWlTKxNnY3NgUOb8WRyfCrijy4UcaBj8q3qbSdvPs8V84FBS8E8hvnNcwRXZMslrbWrl13neL0ds6/qMladm135e44igNDXXfxR76M0/oaq5mtboEYQlOkeY4EYwe1XMNsdI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781727418; 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=4N/NLcDxSLmLgmQhTUh2TcfoGa5fEXQ6KzP8wrpDFAc=; b=YwGm1DS87dnRYDPX52cD9ZoZ2t1YDoeOVGPqnXIq6gBpvuP5OKdduQINC5mNgOM8RFV3gihjuUGWHuJSN1k0vZKMdKfrAYuhFgxP0M5GLgxH+1H/V2llhRAS+5jNgsDa7XZgSZhZZyvHuw0v07pcU7wbcY7VHLIRwQZ6x3+TkDg= 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 1781727418877396.5534754508178; Wed, 17 Jun 2026 13:16:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZwgG-0002b4-2W; Wed, 17 Jun 2026 16:16: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 <3hgAzagcKCqsUcSTWVPRZZRWP.NZXbPXf-OPgPWYZYRYf.ZcR@flex--jrhilke.bounces.google.com>) id 1wZwgE-0002aD-Pg for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:10 -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 <3hgAzagcKCqsUcSTWVPRZZRWP.NZXbPXf-OPgPWYZYRYf.ZcR@flex--jrhilke.bounces.google.com>) id 1wZwgD-0002pv-7i for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:10 -0400 Received: by mail-pj1-x1049.google.com with SMTP id 98e67ed59e1d1-36bbcd40642so67743a91.0 for ; Wed, 17 Jun 2026 13:16:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781727367; x=1782332167; 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=4N/NLcDxSLmLgmQhTUh2TcfoGa5fEXQ6KzP8wrpDFAc=; b=KYsG9srAiLaoY+Ehphx/usIacPWP/zkKZS6A+TISemt4bcBPj8WDAmN+lGqC0uhxui UDgsCD3M9X1Sitib/NGGKsGEQQ10gF53MuqYR5i3rvIpvcFcI+HrfeTDq+MLiGnmHVpK Bl1RHYYeCBBDGTY5ePCvqYVnd5QK/3ULam9LOePSpJ+8fokYOU1EEp2OMI3FCL0icZP3 zUoEQuJ19qS3zqptwQj183SrQp+0uEPDnxSGwK+Ty0Fklk4OF8fggwAqj9codN1ayAsb 2LKC40xcc8R7FEA/YZd3Xk2unAl/7hLSB6dIL68tNz5IVZShUPRVXagFTdazxXvk/2X/ Y4pQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781727367; x=1782332167; 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=4N/NLcDxSLmLgmQhTUh2TcfoGa5fEXQ6KzP8wrpDFAc=; b=d62TOte7cNaBhN7SCc3598mFIkohukgWQjE31DuKtKpVbOpvoEfMZngrJy/F+qnv// dzTr8wVC1uRUv2bsrB9GcstUl7SpqdWodlTrzg+5WrTdp6sZwhcel40U/Ht/c11+oo+F HimKVdMU28cqVBNjzAsyh0Ag2l00XKLDNK6wVlwiB9+a5nishs20U0jAMXozUzOLmf3l 4WhBWT0l1cUcgfiKX/82rsaDd6tqCYiU4VjhgJAxnzPjmUi4WbCGySgS/VeHtVrxhf4c 2DZazZ9ew2MT+dVe9yD0GOU1oO9Nrt+vx/eYkM5vex0zSMujGQOP3JV1L6QLGdoEPSDA OwiQ== X-Forwarded-Encrypted: i=1; AFNElJ+3YceosXLLs13Us/bbgGOSRbVZekdqh8cnv8xkvu3H9fslqqsggQoYphpnwhmL9ygnpJEYffHxOpsf@nongnu.org X-Gm-Message-State: AOJu0YxWF2s0iKaIzIgnjagxRh344WPzzcPXzuaV7SexGBINZ3mta2a8 3iDIvFMxXaarPfFeeC5QYpD7prB6zJXO1vpSluF3Luns5Roi6EAKQ4JOtYvePyFzQWXM7nyfRuA TAvQq57or X-Received: from pjbiq16.prod.google.com ([2002:a17:90a:fb50:b0:37c:e597:c4a5]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3d4f:b0:368:b4a5:c4dd with SMTP id 98e67ed59e1d1-37c92fb817fmr5212641a91.2.1781727366962; Wed, 17 Jun 2026 13:16:06 -0700 (PDT) Date: Wed, 17 Jun 2026 20:15:47 +0000 In-Reply-To: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> Mime-Version: 1.0 References: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260617-igb-trl-v6-2-bbdfcadb81e2@google.com> Subject: [PATCH v6 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::1049; envelope-from=3hgAzagcKCqsUcSTWVPRZZRWP.NZXbPXf-OPgPWYZYRYf.ZcR@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: 1781727421246158500 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 --- 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.738.g0c8ab3ebcc-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781727448; cv=none; d=zohomail.com; s=zohoarc; b=aooX7wru+KdH4QHA1Vq9zVqBtr684ITBiqLbnUf7BFQwGautNJ6DAqlJ5/4Y9PQ7pjZaoJpE1Yjwga+ZxpXPuFd3UhM+oFqiHIL1mOVnXbH6J5dx2qmKz0N842O5UzzAqdeIYZRJPKxBR1Y6ndA/HhTSlBFAx56jZb0X8R7zkFg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781727448; 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=zr5cAgisuTTwj1uLp4YSvgrOqin2FJi9yi3VNvJGcqA=; b=Mz8GYzbUC09Q4w5JJS7yS0R9AJBhlGmYBi1TJ+2qZYJhV3dEs9vNAdelb1WKX4nQQ8mIzNhWt0dRy2s9L2uBcZw6b/3Wp/9gmmc/Br74/1NYEhM/DWyeuYuwPkrO+LT5LK/Bb8iGqrM1l2tVIxYNqyULfifCCF/6KC0LL+okXdQ= 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 1781727448840492.46663036115774; Wed, 17 Jun 2026 13:17:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZwgH-0002bg-Gd; Wed, 17 Jun 2026 16:16:13 -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 <3hwAzagcKCqwVdTUXWQSaaSXQ.OaYcQYg-PQhQXZaZSZg.adS@flex--jrhilke.bounces.google.com>) id 1wZwgF-0002ab-Eh for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:11 -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 <3hwAzagcKCqwVdTUXWQSaaSXQ.OaYcQYg-PQhQXZaZSZg.adS@flex--jrhilke.bounces.google.com>) id 1wZwgD-0002rw-Vg for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:11 -0400 Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-2c6a997c400so10592425ad.1 for ; Wed, 17 Jun 2026 13:16:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781727368; x=1782332168; 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=zr5cAgisuTTwj1uLp4YSvgrOqin2FJi9yi3VNvJGcqA=; b=XrJaAAiW1B5gKIoT7+H0U5zqHv2iRWuOTDjSFn3ja64QVjSp8zxPu6LD9xONR4jL8Q OwxwLz29e2aKZdP3JQE9JRxCYiqbF0PbaoE7HLOvWv7DdzByLQAQk8hfJnR7J/OuI9iE sp0Y8DeUuHB29kb9ukB8hqMTTReUdd8nHN4sVNHogwyAg00c9g/l4whaaEUwI1eRy2Mw ONEjKhJGSroht/LFp7aUr15e4F3FpkZln2gARIFP01hhBr4vNLmC4dvWP49BLme7N6sA 7Xap1tyIDa7Pu9fZPJ3x4t3HzByORgIhNkkBgEiT+LSZ1lOTfqsaEWE1sT3pMzyuwduF IE2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781727368; x=1782332168; 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=zr5cAgisuTTwj1uLp4YSvgrOqin2FJi9yi3VNvJGcqA=; b=VdAd+HCBYb86Rl4shI2d7Zxb56EMNiiZDBtWi7MafqKzHBB2Jc6OZMK++jvT/tBCRH Bas7+/Dl/rSpWavNZUSPIxo8dj2OoVlN6lLcAXxDHv1g7J3SkMOc1Bf4r++onIfC2d1e fjij6Ihk2gi0bMTsMFxawd+PweWyV5ffzX35Dxw2CweJAe1+bAD5clWXaPuL1nNwG9yM 32mfOHrzsjQc42kK4OM0Uz6F4Drj/C0vWU41sCI7RTucf7oKS9iOuvRXIbKOXCHNdWKg V0kaFp9pvW7/KpDMra7qtai2MHDcPkwSR9y4OiRHcdbeCxTRuIfO/3y0tdYFqQwXansf mNaw== X-Forwarded-Encrypted: i=1; AFNElJ9aDShjfMohXySIZnE54ePl1IT+te7P1A2ixN0CcSCgHfe7kudqoXTPgvDWKoyAPVm/QRNh5ridfsF6@nongnu.org X-Gm-Message-State: AOJu0YwhkymSm97QRuw4aiTt+Vf9PlNbSVlID2mHMa/Lz/5bZ5RgzMWd KQZuYyn9ktd9MCeIpsD6+tK7g/TE8NBUQhYx+8Msdd0S0OUSdt3u2N9xPLo6zUBd+XjSln6MHQ5 RL6wih47S X-Received: from plgv5.prod.google.com ([2002:a17:902:e8c5:b0:2c6:a183:90e6]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2b06:b0:2bc:e299:4b3f with SMTP id d9443c01a7336-2c6de418458mr6859965ad.10.1781727367829; Wed, 17 Jun 2026 13:16:07 -0700 (PDT) Date: Wed, 17 Jun 2026 20:15:48 +0000 In-Reply-To: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> Mime-Version: 1.0 References: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260617-igb-trl-v6-3-bbdfcadb81e2@google.com> Subject: [PATCH v6 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::64a; envelope-from=3hwAzagcKCqwVdTUXWQSaaSXQ.OaYcQYg-PQhQXZaZSZg.adS@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: 1781727451839158500 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 | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 44e8e58..65403f9 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -2145,11 +2145,20 @@ static void igb_trl_reset(IGBCore *core) } } =20 +static void igb_trl_disable(IGBTrlQueue *q) +{ + q->trlrc &=3D ~E1000_TRLRC_RS_ENA; +} + 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 + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + igb_trl_disable(&core->trl[i]); + } + trace_e1000e_link_status_changed(nc->link_down ? false : true); =20 if (nc->link_down) { @@ -2632,6 +2641,29 @@ 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; + + if (!igb_trl_enabled(&core->trl[qidx])) { + igb_trl_disable(&core->trl[qidx]); + } +} + static inline void igb_autoneg_timer(void *opaque) { @@ -3687,6 +3719,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 +4168,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.738.g0c8ab3ebcc-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781727446; cv=none; d=zohomail.com; s=zohoarc; b=M6LHUdW1f80UPnl1cMxd8kI7EBcX36mFWIkPTip016jEpgqoTkUNkzpnsDc8ubOXIKeKzpUglIZ6PFt51LHbRQLBIbCBBKuZOcrsFaVKWUmoZc7N43ASf9LT5pgQBcKm8+oy1MBbas+6jgXZQp9T1Ti+boCcEQGkn/keDzSdw9M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781727446; 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=GYlI/RPJAOu9sVPxOCzznuMsF7sHk3l3K3UNAlhhfls=; b=nwzIrpGDyRjNnqgJXHu2SSUQx+O38ONOCpfAC5ljRBNxzQc+U1J/DqugL1VL1rItVXqrqYJoRZ3itz6JcB3ltHm7W8sJWxo6pW7t1Q3/0FymHkyrEzMQTf73Pd//JvnwYT/7pl3NKI20PPj82dQiohsCKpb0hQnTiWZsJw3+52Q= 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 1781727446455378.98981598982107; Wed, 17 Jun 2026 13:17:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZwgH-0002bc-AT; Wed, 17 Jun 2026 16:16:13 -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 <3iAAzagcKCq0WeUVYXRTbbTYR.PbZdRZh-QRiRYabaTah.beT@flex--jrhilke.bounces.google.com>) id 1wZwgG-0002bF-AC for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:12 -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 <3iAAzagcKCq0WeUVYXRTbbTYR.PbZdRZh-QRiRYabaTah.beT@flex--jrhilke.bounces.google.com>) id 1wZwgE-0002u2-SW for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:12 -0400 Received: by mail-pg1-x54a.google.com with SMTP id 41be03b00d2f7-c8582b167f7so111220a12.0 for ; Wed, 17 Jun 2026 13:16:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781727369; x=1782332169; 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=GYlI/RPJAOu9sVPxOCzznuMsF7sHk3l3K3UNAlhhfls=; b=bNzbaMLuaDorgfTshGlwZYXmv5Te8MiOU1k6LT8qVn/iMJ9mTl87LlywickI9hgQl5 +2JmJz19yWjS9irqqiv9OCCLVWNg7eeDyIlxh2hFGyMjrjPL7pLGYuP4Sqk1NRlViunF 0GY7DQFg2w1SNLAqlZEtY/cFyGD8+F2zGfisViOjcpam3iaNalc6m+yH7pXM03k9c5dR Mfx7IdU7AwJdMAiuavo4e9S8OAxafYtOqNYsbEOcN+UZW5YszzuZjHKM2X+di/Ph9/1U WF0uOFIjldGMPuywSX01GuMv1JcJgsCQBa5+Wkd1Z2YeY1eptK7iqacedGdLk+hStn3G LgRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781727369; x=1782332169; 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=GYlI/RPJAOu9sVPxOCzznuMsF7sHk3l3K3UNAlhhfls=; b=lPt3UDNmSE++fSWsy6tI93D18cg0xZNiZM8iFBMUK+SIaVR6DBANm9mvmwLRCWXqKL hkN+QqfLNU5/B5PuItcp9ormtilTx4zITmq/qwuyy+lbUfZXH/6/FrAX0NgQ9P1iWU4r p8n0wU0mpZB1f6eGuA9Fw5wp83h2j0vqv1GT3fxY79Q+2lF5ts7L3JammkJPLQr7VvIm LwpeKgvDwrdfJU8e3WDv6nIc/Y4JYiMallMFy+7fLCEGwfDGeVdhki0egHXJlSwibiVT kbLi2qUa8G+AAH1Sg6e7vjEZ14OlCRj7geWSMqWre5hwjACBAIP5zhfXboUCAIPmr0b+ r+yg== X-Forwarded-Encrypted: i=1; AFNElJ9e59B5S06aET3lhBsX9N6ha35Jjp/Qa8SenlF7c2hfqpdVY6pq8cUXPzxkpmbuZAEoBE6yKjGXCuwL@nongnu.org X-Gm-Message-State: AOJu0YxohQR7yJM/lgl3rfSwn0CQ2Tvi9idnEp0iBO7TRIPnHnv1prKI qyht8NqgVaU5VdKk3yTGMZh1xIl49GBPMaFqKmGNTOR2tqd2WCmV5/viKApIcIBi5uzri1ZP1J/ aJwetgPQD X-Received: from pgac18.prod.google.com ([2002:a05:6a02:2952:b0:c85:fff:9472]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:3d02:b0:3b3:1951:489b with SMTP id adf61e73a8af0-3b8b85fc238mr6459441637.45.1781727368708; Wed, 17 Jun 2026 13:16:08 -0700 (PDT) Date: Wed, 17 Jun 2026 20:15:49 +0000 In-Reply-To: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> Mime-Version: 1.0 References: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260617-igb-trl-v6-4-bbdfcadb81e2@google.com> Subject: [PATCH v6 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::54a; envelope-from=3iAAzagcKCq0WeUVYXRTbbTYR.PbZdRZh-QRiRYabaTah.beT@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: 1781727447046158500 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 --- 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 65403f9..693353e 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.738.g0c8ab3ebcc-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781727434; cv=none; d=zohomail.com; s=zohoarc; b=BB3lltnif8CHS0QXBP8AlEN/9sXQD6ykEa/q7IAlNMFEOWwCKOYyEGBMF+eXF8IqTPVPX1kjw6XpakTF4gG5wopeI5ZGPA1kQEx0ObkvuheSGs7amOvVo0wEUKqmfNfTCHOtjZF6nBvSpHl73GdgQgH9FkuCgkc6iWISIk+eRUo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781727434; 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=STdlkBnVdrSp/ZL+J3OhI5nHWCMdZdPkLWGxtoEsjFE=; b=XeZss8D4wLH4OfRrEMgTjCoJYrBbV8bGVAdERp0Xbjw9uv0hq/GmcQZZKVe80b5SEa9bcWGL+66vLzff25B+6NGCD76W1mtiTG2R8avSsx+QTYcrW9fY2AKXLSWPD8paWLGB2DLWMB1DxJgKfNCod81IpB9U65InBiTmSm3dTok= 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 1781727434163907.645720866518; Wed, 17 Jun 2026 13:17:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZwgI-0002bu-A1; Wed, 17 Jun 2026 16:16:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3iQAzagcKCq4XfVWZYSUccUZS.QcaeSai-RSjSZbcbUbi.cfU@flex--jrhilke.bounces.google.com>) id 1wZwgH-0002ba-9f for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:13 -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 <3iQAzagcKCq4XfVWZYSUccUZS.QcaeSai-RSjSZbcbUbi.cfU@flex--jrhilke.bounces.google.com>) id 1wZwgF-0002uE-Ko for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:13 -0400 Received: by mail-pl1-x649.google.com with SMTP id d9443c01a7336-2c0c36f1cc0so4247395ad.3 for ; Wed, 17 Jun 2026 13:16:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781727370; x=1782332170; 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=STdlkBnVdrSp/ZL+J3OhI5nHWCMdZdPkLWGxtoEsjFE=; b=Ip0qV67qItiBqNu1qk3pUmcevJCL0TrbRsQ6dmZ0se129giOrzA4rRYRpxiY3Gj+w+ NE1zNCZMxchs8X4z+yVOz1stfBSlRDsEsPwoLRqP58YXBU1Keuabe2SVHvL/jyHYnyNo OdcIEXQo2RchZ/LQqRbfJDgGn2p52HYdfv5Vwe8Xws3I/Tnp/viC5u8KBF46oKp3lFV9 4dr71avlFHtqfscufNLJQRLpq4oCCUzaembjoTnHUsyTj3qu26CDETCsG1F7GwlUxcvx /sEl9Ty4Fd3HFXpYD953yXmANM8OUJQF8Y+mtzXyTH7ICnMWJ7/peHqbYuK1BkD2X3Cl IwAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781727370; x=1782332170; 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=STdlkBnVdrSp/ZL+J3OhI5nHWCMdZdPkLWGxtoEsjFE=; b=cGNslc4rmM/vYvomRyiy37tLKAJ4qFD9AUwt3pd84vTipcunSsTuRIbZ5LFK/PNWCo 1/G/whd/iz9FgS3rl5Ub01l67EkzuoK5wdkX+liGvqg+5hDUGGhxW6P2g44Thvcw20Ej eLkU7OSKybPY0libQF5VgDNf1uDidTQ1VFbfDrzNO/LA8d76ClBkxXNZvTnK+3a5lwa2 Z4QGOO7LKlNNfZeqtjTwqR4xa/bF+yqlD0htwkV98qfMUdAxI9BUsw562+EhOZBX2Is6 dFT8TdsLW+l4b84MK5bJivIGIVz3s8lZmn4mmHqdxLdzUr30qaYSgEC2DMLOHV3co+xB vrqQ== X-Forwarded-Encrypted: i=1; AFNElJ9N4kCZS/L3igOAfXfoLrns4Dhfq1C9epQ2l5yjrpzs8IXo5UU0TP9ab47yHMZK9Zi2EYs7RHio9EM/@nongnu.org X-Gm-Message-State: AOJu0YwZ9r+deP/CtVBc8Z7V2z25Jhjn/qllZ8sqMC3o6qaMiCthFaDL c3OTlYy7uZq2iALH79VNQ48IaVZzgqkI/HGxSDKWLEaifWKfK6+5Mg6nFfAtdR85uGAKRCqx0zT LwxZvPD1r X-Received: from plbmj15.prod.google.com ([2002:a17:903:2b8f:b0:2be:1727:6821]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3dc4:b0:2c2:b173:dd9 with SMTP id d9443c01a7336-2c6bc22589dmr35394295ad.25.1781727369490; Wed, 17 Jun 2026 13:16:09 -0700 (PDT) Date: Wed, 17 Jun 2026 20:15:50 +0000 In-Reply-To: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> Mime-Version: 1.0 References: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260617-igb-trl-v6-5-bbdfcadb81e2@google.com> Subject: [PATCH v6 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::649; envelope-from=3iQAzagcKCq4XfVWZYSUccUZS.QcaeSai-RSjSZbcbUbi.cfU@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: 1781727437048158500 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 | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 693353e..7d61d7d 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -97,6 +97,7 @@ igb_receive_internal(IGBCore *core, const struct iovec *i= ov, int iovcnt, static void igb_raise_interrupts(IGBCore *core, size_t index, uint32_t cau= ses); static void igb_reset(IGBCore *core, bool sw); =20 + static inline void igb_raise_legacy_irq(IGBCore *core) { @@ -875,6 +876,42 @@ 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 target_rate; + uint32_t rf_scaled; + + if (!igb_trl_enabled(q)) { + return 0; + } + + /* + * 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. + */ + rf_scaled =3D extract32(q->trlrc, 0, 24); + if (rf_scaled =3D=3D 0) { + return 0; + } + + /* + * Rate Factor =3D rf_scaled / 2^14 + * Target Rate =3D Link Rate / Rate Factor + * =3D (Link Rate * 2^14) / rf_scaled + * + * Clamp target rate to link speed. + */ + target_rate =3D MIN(E1000_LINK_RATE_1GBPS, + (E1000_LINK_RATE_1GBPS << 14) / rf_scaled); + + return muldiv64(bytes_sent, NANOSECONDS_PER_SECOND, target_rate); +} + static void igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) { @@ -883,12 +920,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 +946,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 +4380,6 @@ igb_autoneg_resume(IGBCore *core) qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } } - bool igb_trl_enabled(const IGBTrlQueue *q) { return q->trlrc & E1000_TRLRC_RS_ENA; @@ -4337,7 +4387,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.738.g0c8ab3ebcc-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781727411; cv=none; d=zohomail.com; s=zohoarc; b=c4m5kg1GaYfVurMIBDI9zvlAG7vu82Xj7QTzBadxBpmM50tEPcHPSmiBAtey1OHfO7L5PkOmg+u9+OJLK0/viCaO0MksDBo8FB3T8wk6SqJiR2udFnXdqpgOsAiNYBSdjy9/UVPgEkTjbMEda5DZ4P6gZWur8yB0Bz9BmgTHW7E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781727411; 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=9a9eSzPelabeOWxYnEkQ+qXXGoOy6MCsTLo0Dd42X2A=; b=JUZt+koM/8DexcnduVVzI033QAeSFW7YgAAJIAd1NCijjDqY5CcA04gUCm4m3L5l/terClA+91dPZIgZWDXHe7EoyzXYTCcdmBom68n5I1aSgOejsq3ALxmSSc4/vXBLkoOMRySMMV6I2H0lPtEM5RexmGD358MgwGlzOjgkGLc= 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 1781727411128732.1393364296488; Wed, 17 Jun 2026 13:16:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZwgK-0002ch-AG; Wed, 17 Jun 2026 16:16:16 -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 <3igAzagcKCq8YgWXaZTVddVaT.RdbfTbj-STkTacdcVcj.dgV@flex--jrhilke.bounces.google.com>) id 1wZwgI-0002bs-60 for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:14 -0400 Received: from mail-pg1-x549.google.com ([2607:f8b0:4864:20::549]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3igAzagcKCq8YgWXaZTVddVaT.RdbfTbj-STkTacdcVcj.dgV@flex--jrhilke.bounces.google.com>) id 1wZwgG-0002uR-I3 for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:13 -0400 Received: by mail-pg1-x549.google.com with SMTP id 41be03b00d2f7-c891ed872ddso91341a12.2 for ; Wed, 17 Jun 2026 13:16:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781727370; x=1782332170; 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=9a9eSzPelabeOWxYnEkQ+qXXGoOy6MCsTLo0Dd42X2A=; b=jU5LRcVWOWX7LXpmLMtrRCiYmOE27gqxTZwxpayH5Y7fxGgslJUU3L76Nnc/OcGdGi UIZtrGWDEQvb2iul/Iwvq9Dm03KGXTjXF6Upx19oaF3tWWAGTVEvlUG8L4Zg3hhAld2m grGT+lldty63Z1XQcuURblB2jjXG3QbPVAD8Gjc6kvRrBGHHKYvHAvbHUgn3iPdhNoSr IZn+FJjIQ1X7358Wq4grX/kcq4+fPDADtJ0QQlfEf148ILWGS6Kp38UiUL+vBas84YW6 a/qrRYmevUMWPFbRI24SVQpsL1paPaHHvLShvSsGf+A/D+JYUcnrXIzC4PV0TuZw1+s/ UIKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781727370; x=1782332170; 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=9a9eSzPelabeOWxYnEkQ+qXXGoOy6MCsTLo0Dd42X2A=; b=GzGSnXR3sgE10xc0ZEJC5BaKyVuKN0kRRtgYlmrrvOBWjfH+OtRlUOrSkM8RebHBso NIFxfbwnqdNx7jctKcrBRuEfoVmuh8NAJeWmTI5koFMho84r5bmY3qMLv88aM6dpIzOi wgYKpJrS/lKjCwBF6kbEwip5t3zINXtfc5zSKubTKwEbeK6aY7/VfdC8IkA5X6DYV+jB ZfEkdHzG2Qk3LWLq11zhqoTrf7f57gFVO5LT3tww0Uhz7brFA7d33QPIlQY7ecAOKTW4 RxyV34qE/WY6Gy/h76v7cqThQoHFwfgaP6X20lDNYSOoO3MttFf8zZpzJHv6mKSTAKg+ u34A== X-Forwarded-Encrypted: i=1; AFNElJ/T32ZU+j6duhPITXXFCJfsjwq+F9usmb8Fjl3pvF+ubiTsL8+B1FJbc6UAngLKPH/X3w6tiQktWIqX@nongnu.org X-Gm-Message-State: AOJu0YzYs8w6RZhcUaXoCaDQruOTJUa3FoCVVlsNwbxqcD/ivkPURiXV DWjgOOXRt8/3YDCujMqnQlo3+RhMvUVjFl8gPPNAEZRrnR6K9CwN1kb+7FUzlY4cxg2Q4gMzOjG GCgNPQX3k X-Received: from pgac18.prod.google.com ([2002:a05:6a02:2952:b0:c85:fff:9472]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:6da4:b0:3b7:b6d1:f111 with SMTP id adf61e73a8af0-3b8b77e80d7mr5619444637.21.1781727370258; Wed, 17 Jun 2026 13:16:10 -0700 (PDT) Date: Wed, 17 Jun 2026 20:15:51 +0000 In-Reply-To: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> Mime-Version: 1.0 References: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260617-igb-trl-v6-6-bbdfcadb81e2@google.com> Subject: [PATCH v6 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::549; envelope-from=3igAzagcKCq8YgWXaZTVddVaT.RdbfTbj-STkTacdcVcj.dgV@flex--jrhilke.bounces.google.com; helo=mail-pg1-x549.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: 1781727413618158500 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.55.0.rc0.738.g0c8ab3ebcc-goog From nobody Sun Jul 26 12:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781727398; cv=none; d=zohomail.com; s=zohoarc; b=e1ZAN6nehkA5nBY61QpxfCTLHfhxpWqnSFpzDxrGSSiTtiyIlqa6DLicKUjuZYe7caoKr2Ffv0WF+6EYU0FuoP9KLHdrcQkmohcH5CPpal92fJIx149yT8V6nfpzCWprLlUnKzg11TGOp3zXkSU7YAtZUaQI61onvfzQYF6yCLc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781727398; 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=O+WkQP8SixHS63kySEPnQ7je2M+cCjCu37LJrKKXv/s=; b=Ro6lzuZz3P8saSnMalvCYpVNqTpBvgytVrY+g5r1QvOoJuaU0jhDxvZ/eAh/jFpVXQ8CH+ZGe76rzJXl5VliBcQLV4aT8Eu1RsU8nQ5iM43Oe2A6p2RR+g9ZKLFrm99rLSh+PGRskcD8UlqJV4lZfGUXCrXYLPz82SuNEBh9gS4= 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 1781727398793243.34244367508973; Wed, 17 Jun 2026 13:16:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZwgJ-0002ce-TY; Wed, 17 Jun 2026 16:16:15 -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 <3iwAzagcKCrAZhXYbaUWeeWbU.SecgUck-TUlUbdedWdk.ehW@flex--jrhilke.bounces.google.com>) id 1wZwgJ-0002cU-4q for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:15 -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 <3iwAzagcKCrAZhXYbaUWeeWbU.SecgUck-TUlUbdedWdk.ehW@flex--jrhilke.bounces.google.com>) id 1wZwgH-0002un-61 for qemu-devel@nongnu.org; Wed, 17 Jun 2026 16:16:14 -0400 Received: by mail-pj1-x1049.google.com with SMTP id 98e67ed59e1d1-36bba9b849dso94413a91.1 for ; Wed, 17 Jun 2026 13:16:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781727371; x=1782332171; 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=O+WkQP8SixHS63kySEPnQ7je2M+cCjCu37LJrKKXv/s=; b=IfGvpJT0aj9aTPjshe2BUvmum7XaskjZgrA6fQb5aMZrWsibCOXdANkTElxepsjiN9 m0DHPOy7V4LIU+mX2xxNyazBoxMDIeN4CilkhKqL2zExkUXRGKsNYYxcWDWnSPaSJcke nurRJbtz+QXD/vxFc98XOSfhpyCsXQGY0Lku4wVSNBzgnDNMQx2hnyRvUM5AFtyfRkeA C7abj5+PdXFzBImIxNsMuuOCtljxv8BKvjJb4Ra9Iv8oXdfmT8mmce4i4N/1jb3/NrbU Ws57rrZ4G9t2fecrPQoy3p0b4J1Su4DHEYi4Jo8JJdPGmNs6aOaz9SkRN3xX+vHIKAoi I+3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781727371; x=1782332171; 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=O+WkQP8SixHS63kySEPnQ7je2M+cCjCu37LJrKKXv/s=; b=nK7im5kyu2GMFShmTNYRMFxCfN7vLeo3wVltetPTJ3owxk2BEBuLOWCDmAOol5w9SX YwjZiQIUQKNVDLAiHkY4U9gyHXxor5cYe7ojUJdqqypOxw7yCpUXbdYD6mAJyjtmKlTm I5UGEyjMCj62S3H/57vpnSSGqbatp0fH0lysTtVRhjosEyKv0E719tiPbm3+aJBRqSNU //qM19uVwHF7wnp9rc8VgRHOQobKZpIykLnzwEe5kNgJP0NWk2IuM5CavvnWE/RTUBTo 8Wc4VD3FU6yDpIEwz1YMqmBnsIWTRvT/Kyr5uY/CE1PMrWdgpDW4ZYOLhsrrOm1BpzN+ 5z1Q== X-Forwarded-Encrypted: i=1; AFNElJ8GZS3ABVDVtnBLovsy9OGjFqM/uKi1mjjjGvM7EXn4WcKpYJADd1VXndnAVx41PURg/++DEz7juxEu@nongnu.org X-Gm-Message-State: AOJu0YzYz/KceBQXyac/Hsdd2oO2Zoqo3A1Vds8kHITBzekILYrTVKti 3vnS5C8IRceyNuVTWVwlwTaG64OOv36QrbL2454ISB9Q8qXKXv4G4HdNvhJou/SYV/Tt3sUDFtM G9ZqEWkID X-Received: from pgbcq4.prod.google.com ([2002:a05:6a02:4084:b0:c86:238e:707d]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2f4c:b0:36e:2106:dedc with SMTP id 98e67ed59e1d1-37c936e43c0mr5604171a91.22.1781727371157; Wed, 17 Jun 2026 13:16:11 -0700 (PDT) Date: Wed, 17 Jun 2026 20:15:52 +0000 In-Reply-To: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> Mime-Version: 1.0 References: <20260617-igb-trl-v6-0-bbdfcadb81e2@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260617-igb-trl-v6-7-bbdfcadb81e2@google.com> Subject: [PATCH v6 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::1049; envelope-from=3iwAzagcKCrAZhXYbaUWeeWbU.SecgUck-TUlUbdedWdk.ehW@flex--jrhilke.bounces.google.com; helo=mail-pj1-x1049.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781727401784158500 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.55.0.rc0.738.g0c8ab3ebcc-goog