From nobody Sun Jul 26 14:10: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=1781152124; cv=none; d=zohomail.com; s=zohoarc; b=InTKzJxFopaa1WWwapTVGxZGF7rRvCi1/Gi4dwc1OHIAc0eP9s4/5T6ff7wNgSDKY5eRmA6JiC3mBvUun6bgZ8PHpGXzy28koNjT5sm0KttshzMji9/YtoPZU34sEOY7Faht4JZP+tCImMgCz8QMP5KdmU189wUB7n8+6wOYsYM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781152124; 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=IGrhZUbWDNxRNr/VmBkxGwYqAwdJjbdMEgKZGMTEtzo=; b=aF2m53jra5MWAbqsffIiQN2PKHK4xHpzzUtyU7XZGEsX1wAypyr8LQY5M6fU0NF+SW90t616dYwd/HIkLY1F8ijQhLSfZAcW+yOvjZm6zcDWuh6kY0krQAnvlCZpyKZAiNXwCfeiC9Cd91BhpLzL0GusY7FdDzR4zXaEDRlwuaU= 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 1781152124067400.5973519963395; Wed, 10 Jun 2026 21:28:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXX1j-0001Y9-R3; Thu, 11 Jun 2026 00:28:23 -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 <32B0qagcKChU4C2365z19916z.x97Bz7F-yzGz689818F.9C1@flex--jrhilke.bounces.google.com>) id 1wXVC1-0002pF-BM for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:30:53 -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 <32B0qagcKChU4C2365z19916z.x97Bz7F-yzGz689818F.9C1@flex--jrhilke.bounces.google.com>) id 1wXVBz-0005JK-OM for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:30:53 -0400 Received: by mail-pg1-x54a.google.com with SMTP id 41be03b00d2f7-c85dcdbe502so4879999a12.2 for ; Wed, 10 Jun 2026 19:30:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781145049; x=1781749849; 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=IGrhZUbWDNxRNr/VmBkxGwYqAwdJjbdMEgKZGMTEtzo=; b=tcVmpiinfsGW6ElM4YKoraFmdKCBg7jJLAdnIEtivSISsKeXQCidHUGu5B+Y44cnqB 7cf3igQsX/i4agy5fvs7QG8GfMi41pyHrS3CF6wUAy6nKbrofhBjC0NcVCnwt8MiVjeO 89FYJPAh5Sq57fjbVPe64FrhBoV8nddB6ibpuX/67CBInftUc4sI9BGUF1nlg/2NgyJp svlzOKwOvDvDInGB16s2Y1tP8uvArXFs/4Lcm/8mjnOBKrXwZS0LKzKjdFQG6HGMjB0s j5ckToVS7KnInbQ+Q9AMGhUok7BxE4nwaI0VQuHxHEvo74iYvECe+ZgCi6AxdRQXHgjP CHUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781145049; x=1781749849; 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=IGrhZUbWDNxRNr/VmBkxGwYqAwdJjbdMEgKZGMTEtzo=; b=cIR6aUTRqg46OA8h7iXRHimvYpK0EntuEsNGQIaR4kq8eHzMQDCNclAC0cTTT2cd12 bGCRRVKJRLADqGokZc6PzDZYCCMf0QjXjzATv3AploIRD49Ptms3CxLRdFhIjCO2X2db 9JSGNHAH2aldwABxgimXCRu5G1DfjjPcA5kfgHTwQiQaQ6Yt+/g1zOIg8vYX6Ly7SJoQ oiwfeT9F7kRPgsYAKqjEL5VPtEtZFGlipH3j+QY39tch0/yIvNpviUcW/9L8oJ8Wh4Eg M4cuhn/GAKyFMsjB2s8rgQ5/QcBx5CodzeKCRf0m4UNP4L3SGnAFXHss5yL+VvVIBxnZ KRYw== X-Gm-Message-State: AOJu0Yy6vk7HuA5Ka8aq2+7NoIfkqQqDpBXQO4J4DmcuS5JQam2+Gt8Z 16QrQBS2WdzqkYeFIhrAJQBuIIJnMsdoJGxnvf8/fzwm47Vqb9Fr/3oELnIXiii1rHEVUmdpdkz FSrVV/anTW/3IU098+XhdT8+lDvH3hWRcThme3B62rjtE8gxwXH8eC6Bx2EGYOVo6zkdlk3bgoJ u4IWEkDkwvI6XSJS+nqMqvPGoz+fC2sndVAEIKQNk= X-Received: from pfve14.prod.google.com ([2002:a05:6a00:1a8e:b0:839:372f:479c]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:181c:b0:82a:7893:e14b with SMTP id d2e1a72fcca58-84336aa0581mr788738b3a.38.1781145048278; Wed, 10 Jun 2026 19:30:48 -0700 (PDT) Date: Thu, 11 Jun 2026 02:30:24 +0000 In-Reply-To: <20260611023028.102071-1-jrhilke@google.com> Mime-Version: 1.0 References: <20260611023028.102071-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog Message-ID: <20260611023028.102071-2-jrhilke@google.com> Subject: [PATCH 1/5] igb: Define TRL registers and core state From: Josh Hilke To: qemu-devel@nongnu.org, Akihiko Odaki Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson 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=32B0qagcKChU4C2365z19916z.x97Bz7F-yzGz689818F.9C1@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-Mailman-Approved-At: Thu, 11 Jun 2026 00:28:21 -0400 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: 1781152126256158500 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce register offsets and bitmask constants for the Transmit Rate Limiter (TRL). Add the IGBTrlTimer 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 | 17 +++++++++++++++++ hw/net/igb_core.h | 11 +++++++++++ hw/net/igb_regs.h | 11 +++++++++++ 4 files changed, 40 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..64f21c1 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -4282,6 +4282,11 @@ igb_autoneg_resume(IGBCore *core) } } =20 +static void igb_trl_timer_cb(void *opaque) +{ + /* Stub */ +} + void igb_core_pci_realize(IGBCore *core, const uint16_t *eeprom_templ, @@ -4296,6 +4301,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_timer[i].timer =3D + timer_new_ns(QEMU_CLOCK_VIRTUAL, igb_trl_timer_cb, + &core->trl_timer[i]); + core->trl_timer[i].core =3D core; + core->trl_timer[i].queue_idx =3D i; } =20 net_rx_pkt_init(&core->rx_pkt); @@ -4319,6 +4329,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_timer[i].timer); } =20 net_rx_pkt_uninit(core->rx_pkt); @@ -4469,6 +4480,12 @@ 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_timer[i].timer); + core->trl_throttled[i] =3D false; + core->trl_target_rate[i] =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..ffd45ed 100644 --- a/hw/net/igb_core.h +++ b/hw/net/igb_core.h @@ -63,6 +63,12 @@ typedef struct IGBIntrDelayTimer_st { IGBCore *core; } IGBIntrDelayTimer; =20 +typedef struct IGBTrlTimer_st { + QEMUTimer *timer; + IGBCore *core; + int queue_idx; +} IGBTrlTimer; + struct IGBCore { uint32_t mac[E1000E_MAC_SIZE]; uint16_t phy[MAX_PHY_REG_ADDRESS + 1]; @@ -99,6 +105,11 @@ struct IGBCore { void (*owner_start_recv)(PCIDevice *d); =20 int64_t timadj; + + /* Transmit Rate Limiting */ + IGBTrlTimer trl_timer[IGB_NUM_QUEUES]; + bool trl_throttled[IGB_NUM_QUEUES]; + uint64_t trl_target_rate[IGB_NUM_QUEUES]; /* in bytes per second */ }; =20 void diff --git a/hw/net/igb_regs.h b/hw/net/igb_regs.h index 4dc4c31..f7895ef 100644 --- a/hw/net/igb_regs.h +++ b/hw/net/igb_regs.h @@ -718,4 +718,15 @@ 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_TRLRC_RF_DEC_MASK 0x3FFF +#define E1000_TRLRC_RF_INT_MASK 0x3FF + +/* 1 Gbps link rate in bytes per second (1,000,000,000 bits/s / 8) */ +#define E1000_LINK_RATE_1GBPS 125000000ULL + #endif --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 14:10: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=1781152119; cv=none; d=zohomail.com; s=zohoarc; b=OFiTTicQ2EAPLxikZnFKXC4hxnVrHO3jJC0AcjK5YiTx2LL4jl+ehJy6uThRE0op8h/mjogPBNR6iAH5Gg3kYbzRx3BkSDa/2WSPw0yK2ZTye66hoJbLiblVhC+g1aYlvd0TD0SFxrWXNDYPohlTdq8uJ2taA4bAzmTdfwDgitc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781152119; 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=oQQf8N0xWDI7K2CKUjtEwRPQUQC6/7gubuy68bn+B1Q=; b=jQxtcVZ0JZidk3Yykny0730hBdSiodyNB9+SkyEuXHB/TnBaQN6GIafAL6h8zM1Lhx5PTYqSn6/zm7Y28KvA2bDj5GmKnmHUmDpwyISsBjuRf016aAtr3j5s39Q179X6S50EJSy/yK5/zZWBsvjrX/6/Lr89jQx0nDAwws0YYZE= 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 1781152119105891.9229211457697; Wed, 10 Jun 2026 21:28:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXX1l-0001Yn-7t; Thu, 11 Jun 2026 00:28: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 <32h0qagcKChc6E458713BB381.zB9D19H-01I18ABA3AH.BE3@flex--jrhilke.bounces.google.com>) id 1wXVC2-0002pN-7x for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:30:54 -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 <32h0qagcKChc6E458713BB381.zB9D19H-01I18ABA3AH.BE3@flex--jrhilke.bounces.google.com>) id 1wXVC0-0005JR-NG for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:30:53 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-842211d6e48so8389687b3a.0 for ; Wed, 10 Jun 2026 19:30:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781145051; x=1781749851; 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=oQQf8N0xWDI7K2CKUjtEwRPQUQC6/7gubuy68bn+B1Q=; b=se7T2RGyLsiUh9K3QmdVWpLf2XjFoz7flx635JUxvChNTU+UHEv6696/c57VtJv2c5 sTbdeziFkxVVLDj5tM8IRxpCPnmvfZIBU3DWAf7rGhHIf7aJlDiqGTLYJtJ7P0vG1Enw lr87Wbn4oyNouTE1awqrQuXMh25RXnpOfpGQwLc1efZMs7x4XQZNVL270ymPvMNsbdfk vUZ7jxBLOu/iZyS8+ZSkimUgQG/6Q4rmrHuHG/bGUkeH80vrdWiHL3oJobHmKnhdVZtv 6MNVASlk6dsAYZChX+9vqiFXcE35sK1oeA8ZHN55f+hxIPS7dbv59X1JfqrynvkPxxsE /0zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781145051; x=1781749851; 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=oQQf8N0xWDI7K2CKUjtEwRPQUQC6/7gubuy68bn+B1Q=; b=Qx9UR0mTum/edPnLk1aWHI+YsnXE2Jat7qEcajL0Vc/O/eQj/x6nZlsvLsiHfHWgUe gCjQMDiSn62Uek8+pAJNZU4iYbrh9AVUcTunmmxIskTTLebeeEZmXUpwTs6VG5wZ9kCU HIosIIuKF1TN7qvwOwDIi2SaFH+S129p4c7d9TtVRBrxa4NmwAeWFqBL9jjfx8vNqc7v 9sZ+7UDX9dHUNm2bJKpapDXWg2WPzS3kjlJWcycvTQ3nxeepFyThhThJiQG0YMrLELFq F1ESVGPvaaJaj5K/0c0f+utH0VG3TssE81MJHt0tpmS4N3jDg1jm/BIuTR4RSXJeGWc4 J+lw== X-Gm-Message-State: AOJu0YzkjXZNv3Itc5WkmpdYbeYdoyCCejsGjkmq+W2oARTxtVFGK1nY VMiUEAyjG3OFrIXpIKjwA+VOuxyJ5daZ08ixbkGoLQomA41eZ9la8jCqZaRvoiIuJ5lhqiwmSiF NszfgqibtfhQ6OsnkUWcivbRktDtBys5cMhpwA8fbLaesybnWEOWHuJgcpjxjwxAEnMDIb/JYCO uaNvZd04CRa8xL295jc7RTyu2Ah1KeDAczRtpVVLM= X-Received: from pfiu15.prod.google.com ([2002:a05:6a00:124f:b0:842:3a6c:99f5]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:8d82:b0:83e:f75d:828d with SMTP id d2e1a72fcca58-84336909a34mr847354b3a.16.1781145050627; Wed, 10 Jun 2026 19:30:50 -0700 (PDT) Date: Thu, 11 Jun 2026 02:30:25 +0000 In-Reply-To: <20260611023028.102071-1-jrhilke@google.com> Mime-Version: 1.0 References: <20260611023028.102071-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog Message-ID: <20260611023028.102071-3-jrhilke@google.com> Subject: [PATCH 2/5] igb: Implement TRL register write and configuration From: Josh Hilke To: qemu-devel@nongnu.org, Akihiko Odaki Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson 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=32h0qagcKChc6E458713BB381.zB9D19H-01I18ABA3AH.BE3@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-Mailman-Approved-At: Thu, 11 Jun 2026 00:28:23 -0400 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: 1781152121228154100 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 | 72 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 64f21c1..3bb4649 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -2136,11 +2136,31 @@ igb_set_phy_ctrl(IGBCore *core, uint16_t val) } } =20 +static void igb_trl_disable_queue(IGBCore *core, int qidx) +{ + core->trl_target_rate[qidx] =3D 0; + + if (core->trl_throttled[qidx]) { + timer_del(core->trl_timer[qidx].timer); + core->trl_throttled[qidx] =3D false; + } +} + +static void igb_trl_disable(IGBCore *core) +{ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + igb_trl_disable_queue(core, i); + } + core->mac[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 + igb_trl_disable(core); + trace_e1000e_link_status_changed(nc->link_down ? false : true); =20 if (nc->link_down) { @@ -2623,6 +2643,54 @@ static void igb_set_vtivar(IGBCore *core, int index,= uint32_t val) */ } =20 +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; + + core->mac[index] =3D val; + + qidx =3D core->mac[TRLDQSEL]; + + if (!(val & E1000_TRLRC_RS_ENA)) { + goto disable; + } + + /* + * 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 val & 0xFFFFFF; + + /* Zero is not a valid rate factor, treat as disabled */ + if (rf_scaled =3D=3D 0) { + goto disable; + } + /* + * 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 + */ + core->trl_target_rate[qidx] =3D (E1000_LINK_RATE_1GBPS << 14) / rf_sca= led; + return; + +disable: + igb_trl_disable_queue(core, qidx); +} + static inline void igb_autoneg_timer(void *opaque) { @@ -4126,7 +4194,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 14:10: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=1781152144; cv=none; d=zohomail.com; s=zohoarc; b=UgxjvHwni4zjkzY5gwOX5hXAUgvgL0BPIJkn/M1dYly0/rA0vBXwW3ZavRNOgij5wTZAp2rEZ8KN2luT55n7cTcPG4OAVZVT4+38cd92ClbXgy9EAtoHTNifGsuA7dooCLbxdfJg2loHlqax/K4vb+F10cUtpdOq9jD2tx1QFMA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781152144; 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=ma924iyC011nf7ybJLZ1S9bbLOL/NtLR70XgfBI0bQY=; b=HXtLZAebw22EIjTzetMcd67XxKtjk6+gWKKqHZkI/Jl4ZYkWZdf7P2YkYiKHS6RA7n4uUaJUjNnOvWD77XzMHbvz1PSssHh6CV3XbkVhUZPt/3YHftNWLn06L4E3aDjg2yPMmtOVNp+rbHa3gtUxN5zmaGMdCOuC+Zte8zAmY6g= 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 1781152144213161.80568420714667; Wed, 10 Jun 2026 21:29:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXX1m-0001ZD-9r; Thu, 11 Jun 2026 00:28:26 -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 <33R0qagcKCho9H78BA46EE6B4.2ECG4CK-34L4BDED6DK.EH6@flex--jrhilke.bounces.google.com>) id 1wXVC5-0002pp-9z for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:30:57 -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 <33R0qagcKCho9H78BA46EE6B4.2ECG4CK-34L4BDED6DK.EH6@flex--jrhilke.bounces.google.com>) id 1wXVC3-0005Jj-Sz for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:30:57 -0400 Received: by mail-pg1-x54a.google.com with SMTP id 41be03b00d2f7-c8584e80bfcso3268513a12.3 for ; Wed, 10 Jun 2026 19:30:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781145053; x=1781749853; 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=ma924iyC011nf7ybJLZ1S9bbLOL/NtLR70XgfBI0bQY=; b=h/Q8frplXmPFzEQc/a9OS8vel5HcxBg9pAJqxIHL+mUXsSj2Qvg4yZ9MvR+122oGJr y8epVM5WhKoipV4cyqdotNJ0MwFbRH4dHH64W7VNr/31ZZyzxpC5PweiUKeuhX8AtEqu DQupy7RxYhvpJKuujR8n32hah6HdLI3i2H/h0Rlwx/MbY78ksTY7lyMalxYJK6SDJeF0 jqgGQ0z4tSP96+3w+JyuFyWjV5JjDH9xnAFhpSspZ2Tf9riE51SkpcZK/INbCvwtpLte dlFLRBRi7xGY3GGSfwEGPk6LXtSxGrhfLBwdjpkb+oTqZQOm11c1i1Jh6eTuP3hgQFXc imkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781145053; x=1781749853; 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=ma924iyC011nf7ybJLZ1S9bbLOL/NtLR70XgfBI0bQY=; b=fqEkElSk6YnaEHWMcGiUtrH6GXC8+guxYi77aGkLwU+js2DEzD2G/8uDUqxbTT1b7D IxisKqkbZVzVZcDZ6d5Ube1h+hWWc6leXMvdqjBaCHBm40Cfd1YBX2AB1Nh5ZmnFjbmJ urf7VgnaaXpzma8VGhL4tprtGC+mDbo2v9wOWhy4QjFbgRk+8YvHfhOd8w6Po0GhTlC+ v8hr7nd2kb8Z+TfEeeWm0Wp+PDhsJJeFn8g4bjSelYLs2LSdhGKXB43aFr7VP8ffGFc1 ObTB4dVSw1QtPlI4XM5g629rzqMDvpTEyT/JxIn/ezkmWtQYL37vr0XXGRJktt0O1bQI vw5A== X-Gm-Message-State: AOJu0YxkFlOuIZG4wfNaHV69acteGC3B4eLMMjVW5uKCmA+bFwnByr0k hynMjmUHAVc5dBM9GIIsM8A9jS2TzvO0i2o/u9xuEC7tCxdaMuM1tkdH8Li1eQYZTDFX932dMND sgaw5sgwVUdgAfvDbFkgWMQcTDSSbMbxQnJ1ATUEE/O6bmMNQCWXFV7Hg6m3OsdMCepXYh8VXIt BQt+5grNk+dOC6/vRvDVQvL0voqd2DVmsD01IloNc= X-Received: from pgac18.prod.google.com ([2002:a05:6a02:2952:b0:c79:8315:4734]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:c887:b0:3b4:9124:ae14 with SMTP id adf61e73a8af0-3b5e31e23c8mr693363637.11.1781145053107; Wed, 10 Jun 2026 19:30:53 -0700 (PDT) Date: Thu, 11 Jun 2026 02:30:26 +0000 In-Reply-To: <20260611023028.102071-1-jrhilke@google.com> Mime-Version: 1.0 References: <20260611023028.102071-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog Message-ID: <20260611023028.102071-4-jrhilke@google.com> Subject: [PATCH 3/5] igb: Refactor TX path to return processed byte count From: Josh Hilke To: qemu-devel@nongnu.org, Akihiko Odaki Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson 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=33R0qagcKCho9H78BA46EE6B4.2ECG4CK-34L4BDED6DK.EH6@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-Mailman-Approved-At: Thu, 11 Jun 2026 00:28:24 -0400 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: 1781152145534154100 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 3bb4649..9ed0e78 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,7 +654,9 @@ 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)) { + total_len =3D net_tx_pkt_get_total_len(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, @@ -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.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 14:10: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=1781152110; cv=none; d=zohomail.com; s=zohoarc; b=CmCCWZ44t5VD2V43ZJHWYBpfsHbAR6gT9kyDHvDVJm4DRPXnaIKxqCGU9zwpNZL7YwYxf3pxeSLb6JoiMlbhGKFf10OkDi0HDyBzyRepmjm5cmQKs39hEa27a2fFRu7cmmSpN3Xv5u6MeT1WNjaNQnx9JLLhMOFEvZYR3tu3pFc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781152110; 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=DupDPf3zjnimHKk0qNnF/Yif/Q4lejob3y1l9qRuulE=; b=jQTuKUZYyLfgaZBnOSt8aKCI6UCO2JCh5xH+08NOJwYNMbrl2pFyo5QLFS7Hmz1iNdCNIwrPYzbbw91QYoPcegkkrYi7Y+nyLs4xA1+31xyLWKpOSUcfWg4cBBP7dgTHJ5kVcl0VRz/H2Tey5m563sjmDNIcubrT3pHelneCrA4= 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 1781152110541768.6867943683259; Wed, 10 Jun 2026 21:28:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXX1m-0001ZF-K0; Thu, 11 Jun 2026 00:28:26 -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 <33x0qagcKChwBJ9ADC68GG8D6.4GEI6EM-56N6DFGF8FM.GJ8@flex--jrhilke.bounces.google.com>) id 1wXVC7-0002py-Kb for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:30:59 -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 <33x0qagcKChwBJ9ADC68GG8D6.4GEI6EM-56N6DFGF8FM.GJ8@flex--jrhilke.bounces.google.com>) id 1wXVC6-0005Kf-4t for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:30:59 -0400 Received: by mail-pg1-x549.google.com with SMTP id 41be03b00d2f7-c8604fbe71eso9643955a12.3 for ; Wed, 10 Jun 2026 19:30:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781145056; x=1781749856; 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=DupDPf3zjnimHKk0qNnF/Yif/Q4lejob3y1l9qRuulE=; b=WNPk5PONAej11leaHAC7yf8lUzOI3thryqLDfqIUJ10qwVxZz0bKtCfDffAUMvoSm5 RMeylxu5ZwGm0dNGD8ib2PY/j/u3bnq33qliulpQblEbZMVQFcfBZaqVlukWr/PZedWe GNdw+gXGqdtAGRJCYfHjeQh5NFtVSxluy5K0lRoz55ZO5r7txny60ZvxtJ2z6X5wEVjP rgGVqH1NcYPoyipObnN0HgnHGoSerrwyelQJ9C2o6lQd8NJ62hEyzP2KhBgd9qmSy2Tu /Hiep7wZT8gu1/lA6rSGDEDElJ8rAGLg9lCtbTcT16Ul5iD4J6uPEuEgrxee/nPd7TKz xt3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781145056; x=1781749856; 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=DupDPf3zjnimHKk0qNnF/Yif/Q4lejob3y1l9qRuulE=; b=pFDATXLj75d/HGnSS6PRBSXILEnt0CwVwkCo4vABr1OMiRgk+z67mVBc8G2CJuJbCi 1GNUNvGe+R/WF/hLTpgjSh3/GTEieVzB76VQ/S/PQU6ribS8/8kbGHebPQB+DmGcoHRR bt283QsxePIurHSEqWoDurfBP67yrqzfr7F0KywXf43IWx4+EqRHZIjZ63q0ctsis8E/ zsr2ftaVuqYz/yBrCqW5SfwA+C4Uokjj657Kw35VCYBx7HPifcCW/QaxAmJk08T1gTa/ ucYSz582N0USB/xvCy4DWbI/MuCAMsChP6SfP5pv9UtwAf3UZChaHkDEKjIMOX2IIxFG VWtA== X-Gm-Message-State: AOJu0Yw85cRltaR235fTLCP44I7VXrb2LJOUkskYbfQN4P3pJeDeowOf CZ/mk7bikbELdVkXIDH2NdwGQsMDhWqiB/3veiTK+poH2dORDnTHcFbpUPwQUC6BppfpetZtDeR jOUJXzX1+Bi574MUc+0Q0M4hkVRTCJxLuGIAmOoqT9A7R9y5vVaWu34/IgoppGh/O0HysWAe8Bv L0Nb9M0je7Xb6GJ6QxgwMZMGakkK2KHwxtdXwOmgQ= X-Received: from pgww20.prod.google.com ([2002:a05:6a02:2c94:b0:c86:21eb:a0c2]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:cc8e:b0:3a0:b781:4c78 with SMTP id adf61e73a8af0-3b5e31003f1mr708011637.15.1781145055663; Wed, 10 Jun 2026 19:30:55 -0700 (PDT) Date: Thu, 11 Jun 2026 02:30:27 +0000 In-Reply-To: <20260611023028.102071-1-jrhilke@google.com> Mime-Version: 1.0 References: <20260611023028.102071-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog Message-ID: <20260611023028.102071-5-jrhilke@google.com> Subject: [PATCH 4/5] igb: Implement TRL throttling and timer resumption From: Josh Hilke To: qemu-devel@nongnu.org, Akihiko Odaki Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson 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=33x0qagcKChwBJ9ADC68GG8D6.4GEI6EM-56N6DFGF8FM.GJ8@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-Mailman-Approved-At: Thu, 11 Jun 2026 00:28:25 -0400 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: 1781152112158158500 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 9ed0e78..b8c0500 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -875,6 +875,14 @@ 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(IGBCore *core, int qidx, + size_t bytes_sent) +{ + uint64_t ns_per_sec =3D 1000000000ULL; + + return (uint64_t)bytes_sent * ns_per_sec / core->trl_target_rate[qidx]; +} + static void igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) { @@ -883,17 +891,23 @@ 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; =20 if (!igb_tx_enabled(core, txi)) { trace_e1000e_tx_disabled(); return; } =20 + if (core->trl_throttled[txi->idx]) { + return; + } + d =3D pcie_sriov_get_vf_at_index(core->owner, txi->idx % 8); if (!d) { d =3D core->owner; } =20 + bytes_sent =3D 0; while (!igb_ring_empty(core, txi)) { base =3D igb_ring_head_descr(core, txi); =20 @@ -902,9 +916,20 @@ 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); + + if (core->trl_target_rate[txi->idx] > 0) { + uint64_t delay_ns =3D + igb_trl_calculate_delay(core, txi->idx, bytes_sent); + if (delay_ns > 0) { + core->trl_throttled[txi->idx] =3D true; + timer_mod(core->trl_timer[txi->idx].timer, + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + delay_ns= ); + break; + } + } } =20 if (eic) { @@ -4358,7 +4383,15 @@ igb_autoneg_resume(IGBCore *core) =20 static void igb_trl_timer_cb(void *opaque) { - /* Stub */ + IGBTrlTimer *trl_timer =3D opaque; + IGBCore *core =3D trl_timer->core; + int qidx =3D trl_timer->queue_idx; + IGB_TxRing txr; + + core->trl_throttled[qidx] =3D false; + + 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 14:10: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=1781152155; cv=none; d=zohomail.com; s=zohoarc; b=nKJmI38SWxCwDecGTIAxs0/t/816Tw6CPnjDqHu8h4+EoKMXIZ7lz8EOrGzu7axrV0MKpItiHUTVU8xdinItvwe/f0F2Sbnq9gA8R96EEbbKNSagej2NWfmYh8ZyVJBs5M/zw7HKLDFUvwuG/+sBAtph7PATMdOBDT+Spko3VUI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781152155; 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=Z4qjoXzecE+TOdb9MfCHqKKXXC0yCju3mQ6QjTn82IU=; b=cx4FtzFL5vipXXSuB2hKoNr0x0KxphoR39sGL+VtILoxftkTX2eDqQwPrCCNPcv2tog4V9scVbv87Ss7KD434KLonVIqBMXy3Kx3NbqqGcKhdyTqvPjciOSLvh1aHhR7njCG/MFchiVe7kDWavlf3c6ZE+yKVP8adSeumXPSttE= 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 1781152155124854.1414969718652; Wed, 10 Jun 2026 21:29:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXX1n-0001ZZ-QO; Thu, 11 Jun 2026 00:28:27 -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 <34h0qagcKCh8EMCDGF9BJJBG9.7JHL9HP-89Q9GIJIBIP.JMB@flex--jrhilke.bounces.google.com>) id 1wXVCA-0002qe-1u for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:31:02 -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 <34h0qagcKCh8EMCDGF9BJJBG9.7JHL9HP-89Q9GIJIBIP.JMB@flex--jrhilke.bounces.google.com>) id 1wXVC8-0005Kr-6a for qemu-devel@nongnu.org; Wed, 10 Jun 2026 22:31:01 -0400 Received: by mail-pl1-x649.google.com with SMTP id d9443c01a7336-2beff6b6e74so74812695ad.1 for ; Wed, 10 Jun 2026 19:30:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781145058; x=1781749858; 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=Z4qjoXzecE+TOdb9MfCHqKKXXC0yCju3mQ6QjTn82IU=; b=TIbpAMUAorlWn71x9LLuPY0BDKmE+QGgR+/QlsQW5jegohzpWwmn9HB9xdc5QVzaiK OUaRIZD6WbxUV8rt7dvF+skz5MW3scunsVBq4Cg/SEagKUq09c30BfPP5oH97LhVJ4+0 9kf8O67yyrspXo74RpURCBau+kdr2U8EVAf9kDIPUvzLDsi/zf2TrfS/VxMUZEDC9U/6 EmkNV7r+iU2rKa0nQ+x4gczQnP7zQ9CsPVWPGJ7ETts+5TowlUWtkZbK4rqoC9XreaCB zP7F0f7Jk8FE0Lc8DSX5ox4avrwt/jy5WFF5Egea+9VWjaW/cmRq1NBG0FhZpXgaJV1d e5gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781145058; x=1781749858; 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=Z4qjoXzecE+TOdb9MfCHqKKXXC0yCju3mQ6QjTn82IU=; b=BNyo/wOWKMG/9ITKpgAqZNITVzfRSaqaXMcswxq5WhfO3x7kmz6xeVeZKkxMUqCAto WD/BwszGqVSxql6e5QncVKU7r5qN+k0CA7nzsQ0a/zCiUKR5d75Ft8QTcj8lyKpAod2V pTcFR7d5gbzEFIm/GxRvF5NrZO0nAjNniPbETHRK/y4BglSXi7Fch0wOBsheEBlZV/qb +e8t3+BrJkmxDeqQeifJIK7IcH4YUe2CwAhXDjViaQro+v341kdL7VmLN782FDdmK8KU eD1tCL8Ai9r49KznqRlf8ixkJ/YpZp0kalbZ1MZFfW/4gIgqwf56y+RKlQnCHY5/vwHk 37Uw== X-Gm-Message-State: AOJu0YycWcRg1rY37Ff6gyWlSI/olw1SDGQRnCFZrfoItDUMBkVk5iEr WSC5cQm4oHxVz+v021PWU8NDA3qqMz/Zr1Su56+3R0/58ewQIeB0idOTtejviExyRytYDz2oCf5 5oVlFRiG5GbdicMNGMDLScrXeAwcK+AH3x66P/okORDHLBA1vesJh+qUOBYeMYw2i21Mx4IKnr/ xBpvClBdBkNISIX8wE6o8SgEyhk4cuhc0b3RGfj5o= X-Received: from plbna16.prod.google.com ([2002:a17:903:1590:b0:2c2:d846:55e6]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:90c:b0:2bf:dd8b:7cd with SMTP id d9443c01a7336-2c2f10165e3mr8168255ad.10.1781145058071; Wed, 10 Jun 2026 19:30:58 -0700 (PDT) Date: Thu, 11 Jun 2026 02:30:28 +0000 In-Reply-To: <20260611023028.102071-1-jrhilke@google.com> Mime-Version: 1.0 References: <20260611023028.102071-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog Message-ID: <20260611023028.102071-6-jrhilke@google.com> Subject: [PATCH 5/5] igb: Add a test for Transmit Rate Limiter From: Josh Hilke To: qemu-devel@nongnu.org, Akihiko Odaki Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson 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=34h0qagcKCh8EMCDGF9BJJBG9.7JHL9HP-89Q9GIJIBIP.JMB@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-Mailman-Approved-At: Thu, 11 Jun 2026 00:28:26 -0400 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: 1781152157335154100 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 | 161 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) diff --git a/tests/qtest/igb-test.c b/tests/qtest/igb-test.c index 3d397ea..9c93abf 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 @@ -45,6 +47,71 @@ 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_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_byte= s_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_CTRL= ); + + /* 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; @@ -70,6 +137,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); @@ -133,6 +208,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 */ @@ -191,6 +289,67 @@ static void test_igb_multiple_transfers(void *obj, voi= d *data, =20 } =20 +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; @@ -247,6 +406,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", "igb", + test_igb_transmit_rate_limiter, &opts); #endif =20 opts.before =3D data_test_init_no_socket; --=20 2.54.0.1136.gdb2ca164c4-goog