From nobody Sun Jul 26 13:28:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781301128; cv=none; d=zohomail.com; s=zohoarc; b=iLZ3dIXj3qpkl2CBXsdwGZ+3RA2Mo4T4FflCeIvOdGJsmmW/copr8borjxwXv0GIZXu0NjfnWk5u2pwCk+yFGzYJI4BA0jWGiVD5Jy7GXHPyqnUEqusJrJ0l8bpmay1XKiscY6jWYxG+ANBcZMYR2eEhfZHKbuNrgfyENU/DUQs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781301128; 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=t1e8IOkuBS5/he+neFGKbmceLimzQDRO25wGIWG4+aY=; b=ZBtp1kxfvF7x5EBUJs/nZhX64IjnrA9bn6GkZUIbXRO70TDdtnFVFtisyUXZ/GBs/SZXOZigktuPpZdK29vr7qij2+o12iWtV21eRNuq4ECCZSeK14oeQnqzCr0M2gcUJ8sopV+COOmDTHIOJ4+4uyz7wwxlz6L+ZKauFwvHy44= 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 1781301128061668.6926310518959; Fri, 12 Jun 2026 14:52:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wY9m2-00021f-JW; Fri, 12 Jun 2026 17:50:46 -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 <3MH8sagcKCjkemcdgfZbjjbgZ.XjhlZhp-YZqZgijibip.jmb@flex--jrhilke.bounces.google.com>) id 1wY9m0-00021B-MA for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:44 -0400 Received: from mail-pf1-x44a.google.com ([2607:f8b0:4864:20::44a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3MH8sagcKCjkemcdgfZbjjbgZ.XjhlZhp-YZqZgijibip.jmb@flex--jrhilke.bounces.google.com>) id 1wY9ly-0005IH-P4 for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:44 -0400 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-8422382178bso939092b3a.2 for ; Fri, 12 Jun 2026 14:50:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781301040; x=1781905840; 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=t1e8IOkuBS5/he+neFGKbmceLimzQDRO25wGIWG4+aY=; b=amLAkO1+xDy3EH6r+MEJh8Ew/Z3qLY/mE88obxsWkqYj8TWCL8bW4sjL/tixB+NZ6b Ficy7FRi29AeELiYeJRflOpHtAbGCBGeBALTemd3sC2emFQHcrUAhmb97MmZ95eaRsgU ITesvjwAOUtjwXLojOs2OPFHcuSQ8BZCEG75bPYPRK2nSiyQO/gBG7Sn29z8+VPATlnZ ZJUn8TZkGiLMS4cSK+tmWfIO49GcY3NgwNIp/K8rW29km2dGZsljcdVn5BFdTBkx3GLJ bURGdoQIwu7LP8MXuxQXkO273oEgpI7kUaSno3ff8qkh1oDW2GYQpJilewfqjta+X+bz rq5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781301040; x=1781905840; 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=t1e8IOkuBS5/he+neFGKbmceLimzQDRO25wGIWG4+aY=; b=Ckffvr8A2oPmWPsnf98ROJImpRLS4BjFS9G+fx9gi74Ur8iF6J2fwk+qtn+t/LllIX Koo2z+Y3E5WcQ0A9yT44lwQFgwnGM5pslKT6vU/TfAxkYHVQDfh3Z6ht2uwa08jVShET AMSFOEEioijE7/K280zRtdScysd5NDZuUI7RuOd0dUCg6Ce5s2UD/g679zmiVNsEvRiP GknNfD2fQ3AbFckt3BeTJuVdRZjp2GddsUCkBHbPVp85HVRVG57KTOApNYG+UKSPI+EL afWYA4B4eIFbZi0n0KfX7CSOCdZQXTVXhCENAhCxlYhFsiH3B75HuQk1IZg12Q53SmUl +n+Q== X-Forwarded-Encrypted: i=1; AFNElJ9Ljw6huvonGV5q3S9MKWp64f8IX2g5dPCoPF/hQFsYFnCodQ9bhXccKxfFIzBHTtHitfRCHGpGkrLi@nongnu.org X-Gm-Message-State: AOJu0Yy7k2OOGEyfcKjWxf7yvTSrgHvSdbVRG++LWBh/uzMq2jZrxs2b a50hcl/tscBSMwJYjEkTd07IWFCxTw9lZpOgq2zcRs4i/WbngVtKvuBxc7nKSWg9KjhUnPNKRAF pi10lWRks X-Received: from pfbho5.prod.google.com ([2002:a05:6a00:8805:b0:835:2a09:221c]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:12d2:b0:842:8985:340 with SMTP id d2e1a72fcca58-8434cf4ee62mr4965679b3a.35.1781301040293; Fri, 12 Jun 2026 14:50:40 -0700 (PDT) Date: Fri, 12 Jun 2026 21:50:12 +0000 In-Reply-To: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> Mime-Version: 1.0 References: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260612-igb-trl-v3-1-19607f9a3dde@google.com> Subject: [PATCH v3 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::44a; envelope-from=3MH8sagcKCjkemcdgfZbjjbgZ.XjhlZhp-YZqZgijibip.jmb@flex--jrhilke.bounces.google.com; helo=mail-pf1-x44a.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781301129029158500 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 | 40 ++++++++++++++++++++++++++++++++++++++++ hw/net/igb_core.h | 12 ++++++++++++ hw/net/igb_regs.h | 11 +++++++++++ 4 files changed, 64 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..31f2644 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -4282,6 +4282,35 @@ igb_autoneg_resume(IGBCore *core) } } =20 +uint64_t igb_trl_get_target_rate(const IGBTrlQueue *q) +{ + const uint64_t rf_scaled =3D q->trlrc & 0xFFFFFF; + + if (!(q->trlrc & E1000_TRLRC_RS_ENA)) { + return 0; + } + + if (rf_scaled =3D=3D 0) { + return 0; + } + + /* + * The rate factor is a fixed-point number with a 14-bit fractional pa= rt: + * Rate Factor =3D rf_scaled / 2^14 + * + * The target rate is: + * Target Rate =3D Link Rate / Rate Factor + * =3D Link Rate / (rf_scaled / 2^14) + * =3D (Link Rate * 2^14) / rf_scaled + */ + return (E1000_LINK_RATE_1GBPS << 14) / rf_scaled; +} + +static void igb_trl_timer_cb(void *opaque) +{ + /* Stub */ +} + void igb_core_pci_realize(IGBCore *core, const uint16_t *eeprom_templ, @@ -4296,6 +4325,11 @@ igb_core_pci_realize(IGBCore *core, =20 for (i =3D 0; i < IGB_NUM_QUEUES; i++) { net_tx_pkt_init(&core->tx[i].tx_pkt, E1000E_MAX_TX_FRAGS); + core->trl[i].timer =3D + timer_new_ns(QEMU_CLOCK_VIRTUAL, igb_trl_timer_cb, + &core->trl[i]); + core->trl[i].core =3D core; + core->trl[i].queue_idx =3D i; } =20 net_rx_pkt_init(&core->rx_pkt); @@ -4319,6 +4353,7 @@ igb_core_pci_uninit(IGBCore *core) =20 for (i =3D 0; i < IGB_NUM_QUEUES; i++) { net_tx_pkt_uninit(core->tx[i].tx_pkt); + timer_free(core->trl[i].timer); } =20 net_rx_pkt_uninit(core->rx_pkt); @@ -4469,6 +4504,11 @@ static void igb_reset(IGBCore *core, bool sw) =20 igb_intrmgr_reset(core); =20 + for (i =3D 0; i < IGB_NUM_QUEUES; i++) { + timer_del(core->trl[i].timer); + core->trl[i].trlrc =3D 0; + } + memset(core->phy, 0, sizeof core->phy); memcpy(core->phy, igb_phy_reg_init, sizeof igb_phy_reg_init); =20 diff --git a/hw/net/igb_core.h b/hw/net/igb_core.h index d70b54e..ec83e4f 100644 --- a/hw/net/igb_core.h +++ b/hw/net/igb_core.h @@ -63,6 +63,13 @@ typedef struct IGBIntrDelayTimer_st { IGBCore *core; } IGBIntrDelayTimer; =20 +typedef struct IGBTrlQueue_st { + QEMUTimer *timer; + IGBCore *core; + int queue_idx; + uint32_t trlrc; +} IGBTrlQueue; + struct IGBCore { uint32_t mac[E1000E_MAC_SIZE]; uint16_t phy[MAX_PHY_REG_ADDRESS + 1]; @@ -99,6 +106,9 @@ struct IGBCore { void (*owner_start_recv)(PCIDevice *d); =20 int64_t timadj; + + /* Transmit Rate Limiting */ + IGBTrlQueue trl[IGB_NUM_QUEUES]; }; =20 void @@ -143,4 +153,6 @@ igb_receive_iov(IGBCore *core, const struct iovec *iov,= int iovcnt); void igb_start_recv(IGBCore *core); =20 +uint64_t igb_trl_get_target_rate(const IGBTrlQueue *q); + #endif diff --git a/hw/net/igb_regs.h b/hw/net/igb_regs.h index 4dc4c31..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 13:28:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781301089; cv=none; d=zohomail.com; s=zohoarc; b=YfA8dGsn7Br6Bmd39M1rs11H4Ua7V76kKSZYec5rh9Syc7OOy4J0tvdccSl9GpgaKu2g8WJlcTGL/1B9NX+vYtK3MjclxjqPNxO47BCx7qMvFtfeUH2D2LsDSvQ+qvSt54tsJvyJKLfnOr/vzGaM06AahgvuVLQZYqpufXl1eeo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781301089; 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=378TvCYrv/dbLGwDHiAZNEpCCcD7o6IZyz+rEM3wMWw=; b=YIXrSfFZyz+qq9oX7kpg+/lF14cKGvQHHh74g61N92YgcY33xC2dyoPMoKB2EY6tuIFQ+5wpg/AQE1LMZ54UIK1+buDmqLcZicMGSFEjKRummO3JvGGAPSTu1SvZOnhGcFgNKIHbAyxWI5SxLOP70LH5jjenLFvZG3ziaqRXWdo= 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 1781301089444989.0380334293027; Fri, 12 Jun 2026 14:51:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wY9m4-000235-Uw; Fri, 12 Jun 2026 17:50:48 -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 <3Mn8sagcKCjsgoefihbdlldib.Zljnbjr-absbiklkdkr.lod@flex--jrhilke.bounces.google.com>) id 1wY9m2-00021g-Hp for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:46 -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 <3Mn8sagcKCjsgoefihbdlldib.Zljnbjr-absbiklkdkr.lod@flex--jrhilke.bounces.google.com>) id 1wY9m0-0005Id-VK for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:46 -0400 Received: by mail-pj1-x1049.google.com with SMTP id 98e67ed59e1d1-36d97955899so1342620a91.0 for ; Fri, 12 Jun 2026 14:50:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781301043; x=1781905843; 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=378TvCYrv/dbLGwDHiAZNEpCCcD7o6IZyz+rEM3wMWw=; b=OZm84uhNtXBf4VBwuy60giaRR1383/ZC4MTnQn/mbPvMaKJBUN53TsfYa/HgUBo037 itx6Hgrc/krbyE19jS5tAX09BpHc0Xvy1Nio7zlhX4eZioQbzki8d2ybU4xL8R057rn0 5p1VMSGvFu0ZhZ49/eepg3w2recP23ZjgW6u5bulM+djild8PCSuXPVU69h2Ae4kIWeD 4jr7ECWLjbHZXs9Niu/2Y/E11zOY5SfViPeuioJNpkb4o89MxBamThVW+AiMHOq8nJYE yY/cTF3uj+Pa+2ENXxmoyAEix4g9JbOQV+1oqCTRW0gIFyhc/BtzqC/hsF6Pri3G3tUO CFDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781301043; x=1781905843; 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=378TvCYrv/dbLGwDHiAZNEpCCcD7o6IZyz+rEM3wMWw=; b=osq6OYKVj3yzfF6LI8pNqs4lECZ3qWxo17KUc74NwPbGLn+QZVyypu24V4sLjjgSs8 bkXlMPryOEErPRG+pPOb/XIR4WbosFZSpoVjXouFrD1FqI/nqny1LXDC3G2MmH4ihjZ1 xD2qHGc38QrejAtD6iv+6mV2jzDy77TepFWA2oYHs4ZZSF9uhv9y7weCeemXlgC94t8F p6eOcMbiOEverywqusoeGhH2ULbjv8HsTsri7ikedp+e91kHNjV+N0IYEcsgB80fGDU5 8u5YbIYfUnY56GYn//fWVYnbCrxCmLglIlPMYSyw15VR+TK3p1jQfsJI5VLYxC0babcs dX2A== X-Forwarded-Encrypted: i=1; AFNElJ/4bwmepJ9TwMUyrDpS4Warg3Yfmfe1wQQgnjrGDFsYfRqqBzpjRnK/iuufQBzIFLlJE77TQRZvk1iO@nongnu.org X-Gm-Message-State: AOJu0Yw2SG+kamJHIE+mcZwMyCaq8XCIk2ce+bGVIwGUw35HBVU+pmCT 0k/HBVfMhiq2jGkHZhOp1EVZRh8UEw1jjCAcvocqv/sMtRzfDLrlicwq8V9AZoUqWbh4Gvl5/qx j+Ulcd3cW X-Received: from pgu23.prod.google.com ([2002:a63:1457:0:b0:c80:1fe6:ac57]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:2285:b0:3b4:813d:dc1 with SMTP id adf61e73a8af0-3b783fc43c8mr4999653637.31.1781301042416; Fri, 12 Jun 2026 14:50:42 -0700 (PDT) Date: Fri, 12 Jun 2026 21:50:13 +0000 In-Reply-To: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> Mime-Version: 1.0 References: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260612-igb-trl-v3-2-19607f9a3dde@google.com> Subject: [PATCH v3 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=3Mn8sagcKCjsgoefihbdlldib.Zljnbjr-absbiklkdkr.lod@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: 1781301091682158500 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..09c0150 100644 --- a/hw/net/igb.c +++ b/hw/net/igb.c @@ -563,6 +563,45 @@ static const VMStateDescription igb_vmstate_intr_timer= =3D { VMSTATE_STRUCT_ARRAY(_f, _s, _num, 0, \ igb_vmstate_intr_timer, IGBIntrDelayTimer) =20 +static bool igb_trl_needed(void *opaque) +{ + IGBState *s =3D opaque; + + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + if (igb_trl_get_target_rate(&s->core.trl[i]) > 0) { + return true; + } + } + + return false; +} + +static const VMStateDescription igb_vmstate_trl_queue =3D { + .name =3D "igb-trl-queue", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_TIMER_PTR(timer, IGBTrlQueue), + VMSTATE_UINT32(trlrc, IGBTrlQueue), + VMSTATE_END_OF_LIST() + } +}; + +#define VMSTATE_IGB_TRL_QUEUE_ARRAY(_f, _s, _num) \ + VMSTATE_STRUCT_ARRAY(_f, _s, _num, 0, \ + igb_vmstate_trl_queue, IGBTrlQueue) + +static const VMStateDescription igb_vmstate_trl_state =3D { + .name =3D "igb/trl_state", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D igb_trl_needed, + .fields =3D (const VMStateField[]) { + VMSTATE_IGB_TRL_QUEUE_ARRAY(core.trl, IGBState, IGB_NUM_QUEUES), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription igb_vmstate =3D { .name =3D "igb", .version_id =3D 1, @@ -591,6 +630,10 @@ static const VMStateDescription igb_vmstate =3D { VMSTATE_INT64(core.timadj, IGBState), =20 VMSTATE_END_OF_LIST() + }, + .subsections =3D (const VMStateDescription * const []) { + &igb_vmstate_trl_state, + NULL } }; =20 --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781301106; cv=none; d=zohomail.com; s=zohoarc; b=EZfu1GrMOkkxSeg9pcfz58FLFl/AnfFY87RrAjgSR/e7YxD167u7S0gxHqIDUO3CukOGKjGhbU28lRMrxfaBffDoHeLqc58/ljMVYt2MGU93ZI9kTX78oxGX5+Kns4R0stiUAY4ykr5I4LkGU3wFRRys7pK1hO7Gmh51/xoYO0c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781301106; 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=ntjSjI2BqxYqiuKjzx3ge/WeyMR3aXx4MfGrxwtztTo=; b=R0kQaBGsfGWYOuFnQVbffgKtVeGUNJi9ovnFQKElyu/k1uLP3tJtIBToNi8NQZHhOSw1o4WUieGOXX8mCg+GgkL2QydLXbA0x4op4iUbxUsFGCCfgUmBhwNluBBq5jmLzUAIhy0xJEz1WCX09vshyW+b4N6oRqVH7IbJ8gWVLks= 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 1781301106130411.0265175956192; Fri, 12 Jun 2026 14:51:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wY9m5-00023I-99; Fri, 12 Jun 2026 17:50:49 -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 <3M38sagcKCjwhpfgjicemmejc.amkocks-bctcjlmlels.mpe@flex--jrhilke.bounces.google.com>) id 1wY9m3-00022P-8l for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:47 -0400 Received: from mail-pf1-x44a.google.com ([2607:f8b0:4864:20::44a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3M38sagcKCjwhpfgjicemmejc.amkocks-bctcjlmlels.mpe@flex--jrhilke.bounces.google.com>) id 1wY9m1-0005Is-Jv for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:46 -0400 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-8422f987f2eso2277705b3a.3 for ; Fri, 12 Jun 2026 14:50:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781301043; x=1781905843; 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=ntjSjI2BqxYqiuKjzx3ge/WeyMR3aXx4MfGrxwtztTo=; b=uHYHIOnbKSq0ikn0NUhAY9bWzhd3+QLvOMhZiIGbTF7wAww2ELj9oxfLnyY/Wd7aQH j6dChioqCtSKetjBz5fVeGzXT+ydTJDou/ApOJ89vV009QlyAZuYqmpuBIOWefhfbH4p 09Uaz5mdBBp3W3RKjthkmGCGC7ObfwuBHP/PSBRQE/aSLO0AIVCH5+mcaG+qANDSwvMK TU4ynEA6QU76i1UeGBWKcjqFyhRgs91H/DI0qwLzdzywLjOnwkrQ/QZ1ddn/GlJKJF7z b+a/1238eDp6xD0WUTOgHSFjWjA1dZtdll0lv7KG0toJBDfdmE/Bra34+uA0D7/S52Kk qFwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781301043; x=1781905843; 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=ntjSjI2BqxYqiuKjzx3ge/WeyMR3aXx4MfGrxwtztTo=; b=cU8z07bNe9ih6Uq34tJz6B5Kmqnfqj9qu/lFZtqYUh5MYiZkzJCAhrUJHEZaZ8CPlH bzVa6tNQxTsAiislI7g/uttafnkihvoNKkmkwFYHlGR8YqFCJCxVF4E4Plqw3V5wQT+m f+a0LtQpWkYWjerBxE3RoZR+2ZsxcEtEWFmNa0I4hXTvQauudTS1yUlFJRZpOuIY8o4n i60BJaZ/mHBRS3G5sOVuraUNTK+/vzvhXlQ1L1h5l9V40ee5Vday5taJObi5jyVWlmeI kYUP7pkhPiExBT2Xf4kgQqFXokkPtfjZGkENmoPivySe8z4mJlHZ6euj5JWTMjn9UQwQ qy7Q== X-Forwarded-Encrypted: i=1; AFNElJ+s2lMOSwu6cVBQ5G30Wwxf7qymN34ZZf8bDFgxr6PYd5IqV1u/E9M+gWHnBvSvTlOV6SY0piiAX4TC@nongnu.org X-Gm-Message-State: AOJu0Yw/3XJLFUy3Nqx5sbh7YJGQDdliPkVFh1ecfwA2YBP+tAPsxW9C e4drHR6waoNdtinYDSy+pB995nN9g0vFwx4Cat1eGl5Q7oSr5CbZM+dSRisOtNWMYPaLJ+y4Y0z 1ikCm5seJ X-Received: from pfsy56.prod.google.com ([2002:a05:6a00:3b8:b0:843:49ef:6b1]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1943:b0:842:3c89:15de with SMTP id d2e1a72fcca58-8434ce48bffmr5007365b3a.25.1781301043245; Fri, 12 Jun 2026 14:50:43 -0700 (PDT) Date: Fri, 12 Jun 2026 21:50:14 +0000 In-Reply-To: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> Mime-Version: 1.0 References: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260612-igb-trl-v3-3-19607f9a3dde@google.com> Subject: [PATCH v3 3/7] igb: Implement TRL register write and configuration From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::44a; envelope-from=3M38sagcKCjwhpfgjicemmejc.amkocks-bctcjlmlels.mpe@flex--jrhilke.bounces.google.com; helo=mail-pf1-x44a.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781301107469158500 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 | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 31f2644..3eddfbe 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -2136,11 +2136,27 @@ igb_set_phy_ctrl(IGBCore *core, uint16_t val) } } =20 +static void igb_trl_disable_queue(IGBCore *core, int qidx) +{ + core->trl[qidx].trlrc =3D 0; + + timer_del(core->trl[qidx].timer); +} + +static void igb_trl_disable(IGBCore *core) +{ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + igb_trl_disable_queue(core, i); + } +} + void igb_core_set_link_status(IGBCore *core) { NetClientState *nc =3D qemu_get_queue(core->owner_nic); uint32_t old_status =3D core->mac[STATUS]; =20 + igb_trl_disable(core); + trace_e1000e_link_status_changed(nc->link_down ? false : true); =20 if (nc->link_down) { @@ -2623,6 +2639,50 @@ static void igb_set_vtivar(IGBCore *core, int index,= uint32_t val) */ } =20 +static uint32_t igb_get_trlrc(IGBCore *core, int index) +{ + int qidx =3D core->mac[TRLDQSEL]; + + return core->trl[qidx].trlrc; +} + +static void igb_set_trldqsel(IGBCore *core, int index, uint32_t val) +{ + core->mac[index] =3D val & 0xF; +} + +static void igb_set_trlrc(IGBCore *core, int index, uint32_t val) +{ + uint64_t rf_scaled; + int qidx; + + qidx =3D core->mac[TRLDQSEL]; + core->trl[qidx].trlrc =3D val; + + if (!(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; + } + return; + +disable: + igb_trl_disable_queue(core, qidx); +} + static inline void igb_autoneg_timer(void *opaque) { @@ -3678,6 +3738,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 @@ -4126,7 +4187,9 @@ static const writeops igb_macreg_writeops[] =3D { [PVTEICR6] =3D igb_set_vteicr, [PVTEICR7] =3D igb_set_vteicr, [VTIVAR ... VTIVAR + 7] =3D igb_set_vtivar, - [VTIVAR_MISC ... VTIVAR_MISC + 7] =3D igb_mac_writereg + [VTIVAR_MISC ... VTIVAR_MISC + 7] =3D igb_mac_writereg, + [TRLDQSEL] =3D igb_set_trldqsel, + [TRLRC] =3D igb_set_trlrc }; enum { IGB_NWRITEOPS =3D ARRAY_SIZE(igb_macreg_writeops) }; =20 --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781301113; cv=none; d=zohomail.com; s=zohoarc; b=IKhRYdc0ftdzfR9RAA4H7hFqGHu+jOSDBr4wWz2BUcaVHLAyz/zhrsU5YjUuUUqXGX/El9sGuU2+0kQQnhOcoZN8B/lpvn4cG0bGMvhUXaJZlmuNt0WIk3zYaVOcz7ENLfLZ2IRp5H6Cw+JoRpIhpD3SwJTHsUXCz1f7lmFdu4o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781301113; 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=DscT2u9TJqheLznAg/uVIVkF6I2gMms9Ny27onDAukk=; b=Pw6P07JzSoHOt7k0XzRmbddl1SlfSOW7Mgh3D1C9GDeeaycK/LFB2ECAUKhbQ5iQf/KlFoBd1OIjvhLwqerrEfz6sNL9UWb/0m4get/xUAcHpslmilZDHf/5bOa0FB4JDaEV2Mr+/G5jMxmhAuq+MnwyyopWBhOeYmn3YMaagpM= 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 1781301113174564.3952468663898; Fri, 12 Jun 2026 14:51:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wY9m6-00023t-JU; Fri, 12 Jun 2026 17:50:50 -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 <3NH8sagcKCj0iqghkjdfnnfkd.bnlpdlt-cdudkmnmfmt.nqf@flex--jrhilke.bounces.google.com>) id 1wY9m5-00023K-C2 for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:49 -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 <3NH8sagcKCj0iqghkjdfnnfkd.bnlpdlt-cdudkmnmfmt.nqf@flex--jrhilke.bounces.google.com>) id 1wY9m3-0005JH-Me for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:49 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-8421ffff8a3so1799998b3a.2 for ; Fri, 12 Jun 2026 14:50:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781301045; x=1781905845; 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=DscT2u9TJqheLznAg/uVIVkF6I2gMms9Ny27onDAukk=; b=IOs+rm9WV1ysIe/jVDbCVv50WsrUQ2yAjRJoJn+/1Hixya6XXgGFPGAFXC9UwDcYck GldV+RPZUOXghSXA/zWcQuKazRwJNZRny+GP9aDctoJMtsKaE38hkNHqGXPXPq/ZbDdR GU502Zm73kDnTjJLULZGQsoOoyDx4aCQkNRgFGBK6+iUZmmpy+7jZMdaMizyZx/hsG/+ HJEJy0s1uySbpsnNvVC3ZamMd8e4u+BQ0IdNjtooTWdpHSrdjhphXF3QqawKt/eJ/ft7 3Vp5Gye99J8ulN693JLGky22Ty9gyWdvZWsGuVKW7uhh16e/y6DhH0Iy9qWL/FokUw1y FDiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781301045; x=1781905845; 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=DscT2u9TJqheLznAg/uVIVkF6I2gMms9Ny27onDAukk=; b=tWhmE60SHMqcoR6E/XoAKZfJDyjgKUKMupKK0L9eFT8EWgc06eMiUNTHl1i2D2HZla 7YB2oNKB5SeIgcysz8dhJ03sGXiof7Y3aPyEcm4/gmBr5raGfqjey3hnDzqFM76AE+It ljnp3Z99onrO9KoZ48GZARSd1yi6h0sDk/Qn8Jsl83e0VYokwTzof6QzMKQkOa2z+yDj SjQJ8bRhFG1ERoKROy/bnUnF4RZ0sNR4vdEQLCBThtgHKCn6m3N/fmKcBWJD/AFUygTv 9gmaatWve1ENTQQf9HHug56T+GIvtKa29TCu9kns1HyU4tpAOFgl+WuEWP4Wev/cMJFA Tf8A== X-Forwarded-Encrypted: i=1; AFNElJ9q408fD5nNixxUyALOKcXUzptNMKZwkqQW82Puq1TIIwvt+eaqcEjnCy0g6RSb0I/N20e3c5igU+pP@nongnu.org X-Gm-Message-State: AOJu0YwBziyItW7DW+wGODrAM+xkU59OrZCdZGt+Wzahy/ZAVlnDBkrO 8Xdd73Ccs5Oxs8vGhHJz9mHh9EbCPwAyyd+5s60coxZy2NdTPBZzotubNeMhNqkxw9jUMzY+Ek5 QXQlfaYDz X-Received: from pfbhw7.prod.google.com ([2002:a05:6a00:8907:b0:842:26f2:e602]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:8d6:b0:82f:623f:e5b3 with SMTP id d2e1a72fcca58-8434ce8ada9mr5084456b3a.34.1781301044702; Fri, 12 Jun 2026 14:50:44 -0700 (PDT) Date: Fri, 12 Jun 2026 21:50:15 +0000 In-Reply-To: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> Mime-Version: 1.0 References: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260612-igb-trl-v3-4-19607f9a3dde@google.com> Subject: [PATCH v3 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::449; envelope-from=3NH8sagcKCj0iqghkjdfnnfkd.bnlpdlt-cdudkmnmfmt.nqf@flex--jrhilke.bounces.google.com; helo=mail-pf1-x449.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781301114900158500 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 3eddfbe..4670c1e 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 13:28:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781301110; cv=none; d=zohomail.com; s=zohoarc; b=adCnuO7obm/XZN+bSAsgwpAbqi7T4AoJ10MSYfoS+6slcBbqpnSBp/XN4CyJclzrHpWHm+OJvDMb/4ilazEBBCD1Rspa5am+T3dviRAfP6tEkXi+kFm7SnDWz+x7TjLv/Q6cGOvJhqErZ1H0QDpbHwD/zBMWoh9zntyQ0Iq4pGs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781301110; 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=37AAcHyUthm/V/Cnn3W8lCG2TLEalp2rg5HyJIMTxkA=; b=X8gMjHmAGeEGBaEfgUqLqzN+DO0THZM6XMQfqVolBRIDrAUhCC6ma1+FBNBXb/ZMVhOL6kbji4Jn5Auki9qWgdIvSYymm5dO01kfh99JD2FJXZ6h/mBfsZh4cI0JZIf6p+fs8xk5RPB0W5N1tu9lqaf6yyHkNQDHcAMW8eC0b1Q= 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 1781301110471923.5585248060917; Fri, 12 Jun 2026 14:51:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wY9m6-00023s-IQ; Fri, 12 Jun 2026 17:50:50 -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 <3NX8sagcKCj4owmnqpjlttlqj.htrvjrz-ij0jqstslsz.twl@flex--jrhilke.bounces.google.com>) id 1wY9m5-00023L-CZ for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:49 -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 <3NX8sagcKCj4owmnqpjlttlqj.htrvjrz-ij0jqstslsz.twl@flex--jrhilke.bounces.google.com>) id 1wY9m3-0005JW-PP for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:49 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-84235f9b91fso1123291b3a.2 for ; Fri, 12 Jun 2026 14:50:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781301046; x=1781905846; 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=37AAcHyUthm/V/Cnn3W8lCG2TLEalp2rg5HyJIMTxkA=; b=s76sgPyViDWvHPcUmrNxzd/leOKrC3oobnXbIFhJEWHPHmkw4nrv+fNsuzJZiqphZN Ed4SqxcmHaDU5V9n3vtG1rEiOAmbyvU+vOVAzs1b9UuadZCEEHK3b66vl96foB/MabqP ip2TubiNQRoXNOYFv3KHUPfQ1dsjA80slE4slCB3TXYaG3ZsRgYT8oQ6mCfnJeBbDlC8 JotEorwCD3IUGDcSYzRSx4vcV2I9b0s3R0MAn4uKoEHxlZfz39GBpI3eVNtLBoGjVnmn EBnNzfhCQy7U413GabeIUYj82rOxui30YuZZ2l62bKS1Kjs+VdIB+Keq93ra0bbe+DJy 5Yhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781301046; x=1781905846; 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=37AAcHyUthm/V/Cnn3W8lCG2TLEalp2rg5HyJIMTxkA=; b=WT4nqdoYEPATsE60nHxCAJ+rTXFwNd7aKya3wYNv44VYTUm72KX8KD/sJDKT2D2YBr CfQ42qDwaEiOnO+n56qbhhuouugjDGwqNq/+fK2wK4899hRBHpLgqfTU9gEnc1ymxoSA TznmF16ZJir/V1B2tMmTRwbgQKYPQZ2VXSh2Yzs19I89u+5ZL2tJY4PyLiHxW+Shqgcj 1qf0MV8C1KZMERui4VOwVGSvSubj+FczO4Cp3pmpWjPD3kthH2Z8qKHE3GZF6721S3mI S4rGOI0Rw0wagfiVoWIEFwQur+G3K4hY/0heHXHApkT+nLdKThorlkpcy5FM1cQKP6+h UfbQ== X-Forwarded-Encrypted: i=1; AFNElJ/aRMshstM42t9BtKq1D1uvXEo10tLxWsqnrd28VrDcnKIIL15mqyD/mIFCkjnS8rBLWE+6itbBRi5y@nongnu.org X-Gm-Message-State: AOJu0YzgM1dBgO28n5X8u5jKQir4TnNtgfD0lgd0VcNSBS3PTpQfdSxO /1smWqR2A0e+4yvKcRe0yVLfqeCQjTFLlW3jp4s4cFtCvaW3cIkKgRHn0xplT8LqP2Em+wYQ+et HMGnN+Oqd X-Received: from pfbfa25.prod.google.com ([2002:a05:6a00:2d19:b0:83f:2c4a:9b48]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1a87:b0:842:5719:455b with SMTP id d2e1a72fcca58-8434cec46e7mr5092054b3a.42.1781301045442; Fri, 12 Jun 2026 14:50:45 -0700 (PDT) Date: Fri, 12 Jun 2026 21:50:16 +0000 In-Reply-To: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> Mime-Version: 1.0 References: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260612-igb-trl-v3-5-19607f9a3dde@google.com> Subject: [PATCH v3 5/7] igb: Implement TRL throttling and timer resumption From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::449; envelope-from=3NX8sagcKCj4owmnqpjlttlqj.htrvjrz-ij0jqstslsz.twl@flex--jrhilke.bounces.google.com; helo=mail-pf1-x449.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781301111182158500 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 | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 4670c1e..c323a40 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(uint64_t target_rate, + size_t bytes_sent) +{ + uint64_t ns_per_sec =3D 1000000000ULL; + + return (uint64_t)bytes_sent * ns_per_sec / target_rate; +} + static void igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) { @@ -883,12 +891,19 @@ igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) union e1000_adv_tx_desc desc; const E1000ERingInfo *txi =3D txr->i; uint32_t eic =3D 0; + size_t bytes_sent =3D 0; + uint64_t target_rate; + uint64_t delay_ns; =20 if (!igb_tx_enabled(core, txi)) { trace_e1000e_tx_disabled(); return; } =20 + if (timer_pending(core->trl[txi->idx].timer)) { + return; + } + d =3D pcie_sriov_get_vf_at_index(core->owner, txi->idx % 8); if (!d) { d =3D core->owner; @@ -902,9 +917,19 @@ igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) trace_e1000e_tx_descr((void *)(intptr_t)desc.read.buffer_addr, desc.read.cmd_type_len, desc.wb.status); =20 - igb_process_tx_desc(core, d, txr->tx, &desc, txi->idx); + bytes_sent +=3D igb_process_tx_desc(core, d, txr->tx, &desc, txi->= idx); igb_ring_advance(core, txi, 1); eic |=3D igb_txdesc_writeback(core, base, &desc, txi); + + target_rate =3D igb_trl_get_target_rate(&core->trl[txi->idx]); + if (target_rate > 0) { + delay_ns =3D igb_trl_calculate_delay(target_rate, bytes_sent); + if (delay_ns > 0) { + timer_mod(core->trl[txi->idx].timer, + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + delay_ns= ); + break; + } + } } =20 if (eic) { @@ -2142,9 +2167,16 @@ igb_set_phy_ctrl(IGBCore *core, uint16_t val) =20 static void igb_trl_disable_queue(IGBCore *core, int qidx) { + IGB_TxRing txr; + core->trl[qidx].trlrc =3D 0; =20 - timer_del(core->trl[qidx].timer); + if (timer_pending(core->trl[qidx].timer)) { + timer_del(core->trl[qidx].timer); + /* Flush the queue of any pending packets */ + igb_tx_ring_init(core, &txr, qidx); + igb_start_xmit(core, &txr); + } } =20 static void igb_trl_disable(IGBCore *core) @@ -4375,7 +4407,13 @@ uint64_t igb_trl_get_target_rate(const IGBTrlQueue *= q) =20 static void igb_trl_timer_cb(void *opaque) { - /* Stub */ + IGBTrlQueue *trl =3D opaque; + IGBCore *core =3D trl->core; + int qidx =3D trl->queue_idx; + IGB_TxRing txr; + + igb_tx_ring_init(core, &txr, qidx); + igb_start_xmit(core, &txr); } =20 void --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781301135; cv=none; d=zohomail.com; s=zohoarc; b=n6xeUGIG8wcXku3cXD08b7IQTfTVhCjCIATarYEq1fqW/KGZuPZrktf/0eEwQdnNgYnDWCDtaXkihfPV/4dNl9DTbf/C40wQwUZk7o38o+7xbJBVDSCujjKKSuSUBfizCdThXEj+Hc1tpZ1nrO/ZR60OGbC3d++iqa8uMgB1Dcc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781301135; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vT+G6PpVv3/b6AactbiPBfLDgfqkldAmvTCmGPSl+Vg=; b=YHdkktBhwlm3XVI3q6/4f/ggIUZ2JMb1DefLda+qkNU4kLHlEXieEf/rCsIVxMEhSwpI6fzpG2d38ce0z1dBKgoLkfvJ+mtyzbJs7IOvb/3VrB/Q48DvTpqS5MimN+lbs2RF5GIkAvoj12kRGF8XGoeJsM3Di+JwX/8EiZ9WYLE= 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 1781301135410657.9700827593548; Fri, 12 Jun 2026 14:52:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wY9m8-00025V-En; Fri, 12 Jun 2026 17:50:52 -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 <3N38sagcKCkAltjknmgiqqing.eqosgow-fgxgnpqpipw.qti@flex--jrhilke.bounces.google.com>) id 1wY9m7-00024r-Gq for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:51 -0400 Received: from mail-pf1-x44a.google.com ([2607:f8b0:4864:20::44a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3N38sagcKCkAltjknmgiqqing.eqosgow-fgxgnpqpipw.qti@flex--jrhilke.bounces.google.com>) id 1wY9m5-0005K5-Up for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:51 -0400 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-84235f9b91fso1123299b3a.2 for ; Fri, 12 Jun 2026 14:50:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781301048; x=1781905848; darn=nongnu.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=vT+G6PpVv3/b6AactbiPBfLDgfqkldAmvTCmGPSl+Vg=; b=H24A0sYeozfA4fmn0ae47gV54o6E58jIH4L/Y9v4pYeuWtVOvcEAfBADEEXcHcQcrJ d/t95OAbbUqzl74qf/eIxmpyTfU2VjE4c5I7tlPW+sbE0V/jjaP1kjBiQENavZ8twud+ 6U5nx//AV32hYGHp8ivGLlSFowL5gNIySXpsz7FL48op8x4Lx2zl05cN+LZgDhPBKyzE njYpGrIrRupfdzeeduVBu1/JgV+cvz4XNZuiXb4c3r+oJzFjDoj9bwjEhPT7hkKHVO1I lK8O829QHW7IBapba+q0KylSYbnihVZqRLD0VBH0q8rmicX+fczTM6/2sEMNjzWrDSN8 oayw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781301048; x=1781905848; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vT+G6PpVv3/b6AactbiPBfLDgfqkldAmvTCmGPSl+Vg=; b=mOU3LRcnUYLGHzYWIfACHXUdmZoWYlaqvIqgJMswAapTUL2x7pNGckYiJmAhihMicm gHeU+KIMAZh5OPf9/RwgFPkp9zCX21I64nyTE0Ug7JzkrHqAa0xMcJGX5XvfY0j77CU/ +dUYF5nqKCi+RyIgE3R7nfHN+Zdnn2hy6Kx30ZR/V6kirXGFvmyy0hTkxEN/zFdzfXIr rPUvuQE++Y3yLM2InEic0xL0mTpr1ShGNtSJh3Wyy8j+NNKrHfo6fG1XJWtjhX6u+DUt V338iDkUdwnqpuEkmZaIC4U/wC81GVS84GP5bVVAPm2SLDkSfgwL/m4HIcpxFuZXBEg8 8lmg== X-Forwarded-Encrypted: i=1; AFNElJ89NOWunpMYGbKlszgdLOiqWWlGvRXWzPGqIaus9VK5GAvYpdGCCsi4l+/+YOc0A+QCJpVN2TC13icG@nongnu.org X-Gm-Message-State: AOJu0Yy9PqwP2CohipX1R7MZag3hO8znxIwIz6ovFhJ789we9gbiFonA SV0wkqCNokL6GSl2g3+7rxwuRgGmr3NibkhTww/kZNb/ZGhiVQJHDsSBj2RCzCHodgUAMoOxcwD 6mqAheuMh X-Received: from pfbk8.prod.google.com ([2002:a05:6a00:b008:b0:842:5241:cda4]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3c95:b0:842:5719:4552 with SMTP id d2e1a72fcca58-8434cefd3eamr5229573b3a.46.1781301047534; Fri, 12 Jun 2026 14:50:47 -0700 (PDT) Date: Fri, 12 Jun 2026 21:50:17 +0000 In-Reply-To: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> Mime-Version: 1.0 References: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260612-igb-trl-v3-6-19607f9a3dde@google.com> Subject: [PATCH v3 6/7] igb: Add QTest for Transmit Rate Limiter register multiplexing From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::44a; envelope-from=3N38sagcKCkAltjknmgiqqing.eqosgow-fgxgnpqpipw.qti@flex--jrhilke.bounces.google.com; helo=mail-pf1-x44a.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781301137528158500 Content-Transfer-Encoding: quoted-printable Add a unit test to verify register writes/reads to the rate limit register (TRLC) return the correct value based on which queue is currently selected in the queue selection register (TRLDQSEL). Signed-off-by: Josh Hilke --- tests/qtest/igb-test.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 51 insertions(+) diff --git a/tests/qtest/igb-test.c b/tests/qtest/igb-test.c index 3d397ea..119be6a 100644 --- a/tests/qtest/igb-test.c +++ b/tests/qtest/igb-test.c @@ -45,6 +45,20 @@ static const struct eth_header packet =3D { .h_source =3D E1000E_ADDRESS, }; =20 +/* + * Calculate TRL rate factor for a given target rate. + * + * Rate Factor =3D 1 Gbps / Target Rate. + * + * The hardware TRLRC register stores the rate factor as a fixed-point num= ber + * with 14 fractional bits. Scale 1Gbps by 2^14 before dividing to preserve + * precision in integer arithmetic. + */ +static uint32_t igb_trl_get_rate_factor(uint64_t rate_bytes_s) +{ + return (E1000_LINK_RATE_1GBPS << 14) / rate_bytes_s; +} + static void igb_send_verify(QE1000E *d, int *test_sockets, QGuestAllocator= *alloc) { union e1000_adv_tx_desc descr; @@ -191,6 +205,41 @@ static void test_igb_multiple_transfers(void *obj, voi= d *data, =20 } =20 +/* + * Verify the rate limit value register (TRLC) returns the correct value b= ased + * on which queue is selected (TRLDQSEL). + */ +static void test_igb_transmit_rate_limiter_regs(void *obj, void *data, + QGuestAllocator *alloc) +{ + QOSGraphObject *e_object =3D obj; + QE1000E_PCI *e1000e =3D obj; + QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); + QE1000E *d =3D &e1000e->e1000e; + const int qidx0 =3D 0, qidx1 =3D 1; + uint32_t val0, val1; + + if (qpci_check_buggy_msi(dev)) { + return; + } + + e1000e_macreg_write(d, E1000_TRLDQSEL, qidx0); + val0 =3D E1000_TRLRC_RS_ENA | + igb_trl_get_rate_factor(E1000_LINK_RATE_1GBPS / 1000); + e1000e_macreg_write(d, E1000_TRLRC, val0); + + e1000e_macreg_write(d, E1000_TRLDQSEL, qidx1); + val1 =3D E1000_TRLRC_RS_ENA | + igb_trl_get_rate_factor(E1000_LINK_RATE_1GBPS / 500); + e1000e_macreg_write(d, E1000_TRLRC, val1); + + e1000e_macreg_write(d, E1000_TRLDQSEL, qidx0); + g_assert_cmphex(e1000e_macreg_read(d, E1000_TRLRC), =3D=3D, val0); + + e1000e_macreg_write(d, E1000_TRLDQSEL, qidx1); + g_assert_cmphex(e1000e_macreg_read(d, E1000_TRLRC), =3D=3D, val1); +} + static void data_test_clear(void *sockets) { int *test_sockets =3D sockets; @@ -247,6 +296,8 @@ static void register_igb_test(void) qos_add_test("rx", "igb", test_igb_rx, &opts); qos_add_test("multiple_transfers", "igb", test_igb_multiple_transfers, &opts); + qos_add_test("transmit_rate_limiter_regs", "igb", + test_igb_transmit_rate_limiter_regs, &opts); #endif =20 opts.before =3D data_test_init_no_socket; --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1781301089; cv=none; d=zohomail.com; s=zohoarc; b=YA75y90lZmFvE9UyPp3Ph0ZHXNyGMlyVlCXJ7pRKUSqp1uub6IhLkcHFg4WGROfzivwGc72tqUtBRsSbyTo5mBh4CFjiKQrqqBxZSkLP4j0BbkF8VT6F8hb+TOuszly/KRpZ6WciTngTkAcNzFqtzCV60IoKhXEuIri6LlTFyrY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781301089; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=+O1dHWDOSJ55QHlZapXvR2r6qYGjNQa+WWJ3hC2i0oc=; b=ix4VOYvNW75rhTI0g68mlSxyzMBxpNcE3caBZulqMVSCWSO9XWHuWBSNBXxknQnRu0HsjgCaKeoUEQBAcwZNfJhOQDhuEIGgNNjEsbbixj0/Kq7uHb870dfDQfz42Rd/kFrceSX7ck22B65Z7Fe8EbcBa+FJ44grMaJ0ZL9gbAA= 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 1781301089460875.1142735245279; Fri, 12 Jun 2026 14:51:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wY9m9-00025t-VM; Fri, 12 Jun 2026 17:50:53 -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 <3OH8sagcKCkEmuklonhjrrjoh.frpthpx-ghyhoqrqjqx.ruj@flex--jrhilke.bounces.google.com>) id 1wY9m8-00025T-84 for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:52 -0400 Received: from mail-pf1-x449.google.com ([2607:f8b0:4864:20::449]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3OH8sagcKCkEmuklonhjrrjoh.frpthpx-ghyhoqrqjqx.ruj@flex--jrhilke.bounces.google.com>) id 1wY9m6-0005KI-83 for qemu-devel@nongnu.org; Fri, 12 Jun 2026 17:50:51 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-8425a9979e1so980530b3a.2 for ; Fri, 12 Jun 2026 14:50:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781301048; x=1781905848; darn=nongnu.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=+O1dHWDOSJ55QHlZapXvR2r6qYGjNQa+WWJ3hC2i0oc=; b=f6yrnvqUSllyaI9R5yFknNJ85T6g+49y1wVTsZhrz3xy8Y+WY6TAtE3urITR7MrTYZ ncqQoeEat/cOb54Sq9XIR3/gv3DF4CtnzM9smaOBgNS0diKivzb1VXS1wNWgZJCiHnPG ZMPSD4nzxMbWn0lSd1nInxtay7Qo444uAISzOBFJlh6atFAgV9J0UWtS8YwFjm9mjcGO ZpDWZx2/lyCDCyJAfeSAmsCAk1PYDcNUDStMZjxHidDCJvKvYNP45EHxCHSDHpeGi2rm u0ei9OLNugOXw4Gn6Hp9LYe+lrXX9as2dIpXqnSdq1ZCq+gEWMBt1R1KG8PEjLl0SkUV 8Nxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781301048; x=1781905848; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=+O1dHWDOSJ55QHlZapXvR2r6qYGjNQa+WWJ3hC2i0oc=; b=GeuTdnkB3AMEv3po83/gghdCZZvYTamYZ7MNz4Mc9nj1rc/cXiiJO5FFDG/pYKxUIP bs7/p0vzq2z+VhJLv2H60FcQHMb46g0IgfhZrHvWgV6EzQSfLISOpjFBV92LXGTKgm4O OwZ5GyharwZkCncnM+jClYWRg1dYZSt1FYnTsapEnjo0cizlxfrhmrcr0IlckrZ78nN/ pBbYUo9rFXON9lU9KP2W8zu2lM4HQ0kvfjCFwiiMzeZPKHMYHG0JnKkqd4+IRbcxKLK1 pS4DughRnK6Z+iImy+LVIfIU4KBCUfaL69n8VXCsM0wPGstAzMcoSK8fPlTOtAN4ia1u w94g== X-Forwarded-Encrypted: i=1; AFNElJ8Ni6Y4CN/OaykhTMh4LAhqreJbT0V8MwRygV2Rh/XBLOUi8ylBYQ0P96kJEzVv6/b0TJ8wUSt83/eT@nongnu.org X-Gm-Message-State: AOJu0YzOtRJNleaoJBRBtbQLOtwPd2q2/xf66MTdgW18qoj5k4CElkMO Ofe9+iJuix5n0inBSqJpLIkwtbilGDKCFcAI/6gU608NFlHYoPSTKRG+qIwZVqPatlS5OZswaNA sZmgdU5j2 X-Received: from pfog9.prod.google.com ([2002:aa7:8749:0:b0:842:84df:faf0]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1d21:b0:842:7992:bdd3 with SMTP id d2e1a72fcca58-8434ce50e94mr4705895b3a.4.1781301048319; Fri, 12 Jun 2026 14:50:48 -0700 (PDT) Date: Fri, 12 Jun 2026 21:50:18 +0000 In-Reply-To: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> Mime-Version: 1.0 References: <20260612-igb-trl-v3-0-19607f9a3dde@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260612-igb-trl-v3-7-19607f9a3dde@google.com> Subject: [PATCH v3 7/7] igb: Add QTest for Transmit Rate Limiter traffic throttling From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::449; envelope-from=3OH8sagcKCkEmuklonhjrrjoh.frpthpx-ghyhoqrqjqx.ruj@flex--jrhilke.bounces.google.com; helo=mail-pf1-x449.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781301091758158500 Content-Transfer-Encoding: quoted-printable Add a test for the IGB transmit rate limiting functionality. The test verifies that TRL is enabled by setting the appropriate registers and that data is transmitted at the appropriate rate based on chosen target rate. Signed-off-by: Josh Hilke --- tests/qtest/igb-test.c | 158 +++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 158 insertions(+) diff --git a/tests/qtest/igb-test.c b/tests/qtest/igb-test.c index 119be6a..153f5fb 100644 --- a/tests/qtest/igb-test.c +++ b/tests/qtest/igb-test.c @@ -34,9 +34,11 @@ #include "qemu/iov.h" #include "qemu/module.h" #include "qemu/bitops.h" +#include "qemu/timer.h" #include "libqos/libqos-malloc.h" #include "libqos/e1000e.h" #include "hw/net/igb_regs.h" +#include "hw/pci/pci_regs.h" =20 #ifndef _WIN32 =20 @@ -59,6 +61,58 @@ static uint32_t igb_trl_get_rate_factor(uint64_t rate_by= tes_s) return (E1000_LINK_RATE_1GBPS << 14) / rate_bytes_s; } =20 +static void igb_trl_enable(QE1000E *d, uint64_t rate_bytes_s) +{ + /* Select Queue 0 */ + e1000e_macreg_write(d, E1000_TRLDQSEL, 0); + /* Enable TRL with target rate */ + e1000e_macreg_write(d, E1000_TRLRC, + E1000_TRLRC_RS_ENA | + igb_trl_get_rate_factor(rate_bytes_s)); +} + +static void igb_trl_disable(QE1000E *d) +{ + /* Select Queue 0 */ + e1000e_macreg_write(d, E1000_TRLDQSEL, 0); + /* Disable TRL */ + e1000e_macreg_write(d, E1000_TRLRC, 0); +} + +static void igb_msix_clear_pending(QPCIDevice *dev, uint16_t entry) +{ + uint64_t vector_offset =3D + dev->msix_table_off + (entry * PCI_MSIX_ENTRY_SIZE); + uint32_t val =3D qpci_io_readl(dev, dev->msix_table_bar, + vector_offset + PCI_MSIX_ENTRY_VECTOR_CTR= L); + + /* Unmask (clears pending bit in QEMU) */ + qpci_io_writel(dev, dev->msix_table_bar, + vector_offset + PCI_MSIX_ENTRY_VECTOR_CTRL, + val & ~PCI_MSIX_ENTRY_CTRL_MASKBIT); + + /* Mask again */ + qpci_io_writel(dev, dev->msix_table_bar, + vector_offset + PCI_MSIX_ENTRY_VECTOR_CTRL, + val | PCI_MSIX_ENTRY_CTRL_MASKBIT); +} + +static void igb_read_tx_tail(QE1000E *d, void *descr) +{ + QE1000E_PCI *d_pci =3D container_of(d, QE1000E_PCI, e1000e); + uint32_t last_entry; + uint32_t tail; + uint32_t len; + + tail =3D e1000e_macreg_read(d, E1000_TDT_A(0)); + len =3D e1000e_macreg_read(d, E1000_TDLEN_A(0)) / E1000_RING_DESC_LEN; + last_entry =3D (tail + len - 1) % len; + + qtest_memread(d_pci->pci_dev.bus->qts, + d->tx_ring + last_entry * E1000_RING_DESC_LEN, descr, + E1000_RING_DESC_LEN); +} + static void igb_send_verify(QE1000E *d, int *test_sockets, QGuestAllocator= *alloc) { union e1000_adv_tx_desc descr; @@ -84,6 +138,14 @@ static void igb_send_verify(QE1000E *d, int *test_socke= ts, QGuestAllocator *allo /* Wait for TX WB interrupt */ e1000e_wait_isr(d, E1000E_TX0_MSG_ID); =20 + /* + * Read the descriptor back from guest memory again, now that WB has + * occurred. This is required because if the packet was delayed by the + * trasmit rate limiter, e1000e_tx_ring_push read it back before QEMU + * actually processed it. + */ + igb_read_tx_tail(d, &descr); + /* Check DD bit */ g_assert_cmphex(le32_to_cpu(descr.wb.status) & E1000_TXD_STAT_DD, =3D= =3D, E1000_TXD_STAT_DD); @@ -147,6 +209,29 @@ static void igb_receive_verify(QE1000E *d, int *test_s= ockets, QGuestAllocator *a guest_free(alloc, data); } =20 +/* Returns the amount of microseconds it takes to transmit a 64-byte packe= t.*/ +static uint64_t igb_send_and_measure(QE1000E *d, int *test_sockets, + QGuestAllocator *alloc) +{ + QE1000E_PCI *d_pci =3D container_of(d, QE1000E_PCI, e1000e); + QPCIDevice *pdev =3D &d_pci->pci_dev; + QTestState *qts =3D global_qtest; + uint64_t start_time, end_time; + + /* Clear any stale pending interrupt for this vector before we start */ + igb_msix_clear_pending(pdev, E1000E_TX0_MSG_ID); + + /* Clear EICR to allow new interrupts to be raised in MSI-X mode */ + e1000e_macreg_write(d, E1000_EICR, 0xFFFFFFFF); + + /* Send a test packet and measure the time it takes. */ + start_time =3D qtest_clock_step(qts, 1); + igb_send_verify(d, test_sockets, alloc); + end_time =3D qtest_clock_step(qts, 1); + + return end_time - start_time; +} + static void test_e1000e_init(void *obj, void *data, QGuestAllocator * allo= c) { /* init does nothing */ @@ -240,6 +325,77 @@ static void test_igb_transmit_rate_limiter_regs(void *= obj, void *data, g_assert_cmphex(e1000e_macreg_read(d, E1000_TRLRC), =3D=3D, val1); } =20 +/* + * Test for Transmit Rate Limiter (TRL) traffic throttling. + * + * Verifies that: + * 1. Packets are transmitted without delay when TRL is disabled. + * 2. Enabling TRL on a queue throttles subsequent transmissions. + * 3. The delay matches the expected transmission time calculated from the + * packet size and the configured target rate. + * 4. Disabling TRL restores normal (unthrottled) transmission behavior. + */ +static void test_igb_transmit_rate_limiter(void *obj, void *data, + QGuestAllocator *alloc) +{ + QOSGraphObject *e_object =3D obj; + QE1000E_PCI *e1000e =3D obj; + QPCIDevice *dev =3D e_object->get_driver(e_object, "pci-device"); + QE1000E *d =3D &e1000e->e1000e; + const uint64_t expected_baseline_elapsed =3D 10 * SCALE_US; + const uint64_t expected_max_elapsed =3D 530 * SCALE_US; + const uint64_t expected_min_elapsed =3D 500 * SCALE_US; + uint64_t elapsed; + + if (qpci_check_buggy_msi(dev)) { + return; + } + + /* Send a test packet to verify there's no rate limit. */ + elapsed =3D igb_send_and_measure(d, data, alloc); + + /* + * QEMU doesn't emulate the hardware line rate of the device, so the p= acket + * is processed instantly (requiring 0 clock steps in wait_isr, which = steps + * by 10us). Give a 10us margin for error. + */ + g_assert_cmpint(elapsed, <, expected_baseline_elapsed); + + /* + * Enable TRL and set the target rate to: + * (E1000_LINK_RATE_1GBPS / 1000) =3D 125 KB/s. + */ + igb_trl_enable(d, E1000_LINK_RATE_1GBPS / 1000); + + /* + * Send Packet 1 (no delay) + * The first packet triggers rate limiting for subsequent transmission= s. + */ + elapsed =3D igb_send_and_measure(d, data, alloc); + g_assert_cmpint(elapsed, <, expected_baseline_elapsed); + + /* Send Packet 2 (should be delayed) */ + elapsed =3D igb_send_and_measure(d, data, alloc); + /* + * Expected delay: 64 byte packet / 125 KB/s =3D 512 us. + * Since QEMU steps the clock by 10 us on each wait_isr iteration, + * the delay is rounded up to the next 10 us step, which is 520 us. + */ + g_assert_cmpint(elapsed, >=3D, expected_min_elapsed); + g_assert_cmpint(elapsed, <=3D, expected_max_elapsed); + + /* Send Packet 3 (should also be delayed) */ + elapsed =3D igb_send_and_measure(d, data, alloc); + g_assert_cmpint(elapsed, >=3D, expected_min_elapsed); + g_assert_cmpint(elapsed, <=3D, expected_max_elapsed); + + igb_trl_disable(d); + + /* Send Packet 4 (no delay since TRL is disabled) */ + elapsed =3D igb_send_and_measure(d, data, alloc); + g_assert_cmpint(elapsed, <, expected_baseline_elapsed); +} + static void data_test_clear(void *sockets) { int *test_sockets =3D sockets; @@ -298,6 +454,8 @@ static void register_igb_test(void) test_igb_multiple_transfers, &opts); qos_add_test("transmit_rate_limiter_regs", "igb", test_igb_transmit_rate_limiter_regs, &opts); + qos_add_test("transmit_rate_limiter", "igb", + test_igb_transmit_rate_limiter, &opts); #endif =20 opts.before =3D data_test_init_no_socket; --=20 2.54.0.1136.gdb2ca164c4-goog