From nobody Sun Jul 26 13:28:51 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=1781649399; cv=none; d=zohomail.com; s=zohoarc; b=F90aCJkiTM2QfVYIbWG36yl/DAjiJ6jG8rAMAvE9z1HOAGakrEwWXaEDbBI/R0YV1ndbqg3a1O43Dy2MXJL138LQWVHX80luh3bytA24SlP1EWZg0DiDqEwFWKUod2qpItuCuDjE+O12oiaGVA7RUNYHVXD6SM9MmTzDzPlYQtY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781649399; 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=0beJyqhORfF60SSJk15HRpGqXesdH476LNhHV8pskaM=; b=LJrI/u3ZYbNt/m8pImF6VvoWD/LVeeEupXaDCeYCqhlasDpDd7pSj623kIQvLTBySXT4uxA0udjf0eJzM/jqcFJuyZAKqzelqyvnoK8EozWIdA7W0uIugB++IyrPxLyMXrG9gyso5E4ZF8GCbLWOavB00tXwXxvK9UiHamvyGC0= 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 1781649399808318.9197431650301; Tue, 16 Jun 2026 15:36:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZcO9-0007Mu-8d; Tue, 16 Jun 2026 18:36:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3088xagcKCpI5D347602AA270.yA8C08G-z0H079A929G.AD2@flex--jrhilke.bounces.google.com>) id 1wZcO7-0007M2-6L for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:07 -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 <3088xagcKCpI5D347602AA270.yA8C08G-z0H079A929G.AD2@flex--jrhilke.bounces.google.com>) id 1wZcO5-0001c5-EB for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:06 -0400 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-842688fa7b8so255296b3a.0 for ; Tue, 16 Jun 2026 15:36:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781649363; x=1782254163; 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=0beJyqhORfF60SSJk15HRpGqXesdH476LNhHV8pskaM=; b=wCyWVtd6jpResQn2qKfkz6QayFPa7AIISVRoAzhkNrxmub3A7PNyvz4NsE8JeyTa9p df5AtlEb1oN3NLfrDHGvjPwIoB/PzJCmOTPXxDJRwr8s1HtX2s/MQRoWauxiKH5OEdYE WCVQQkm0G+/3PnTmUn/wdr57khc6WYSCsuDyHrFhzNL/vJfuZvkmkvg+SiZhO7DU8XWB 0zmW4CKp5V1xfqwn54H6RsQUsbxKGVNJEJc9oO9hAb61Z+On4fzzQ4nzKnMw00/gSrMU nIuc2DXadcW1WJ9c1vhffak7Mqin71nKoG8DEnrgUBMQ9+BzJ5ypmRbtaRFtM1/H3aat /7tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781649363; x=1782254163; 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=0beJyqhORfF60SSJk15HRpGqXesdH476LNhHV8pskaM=; b=i35z1RSNDz8JJHUDukdLfAmvLjvbLYX3NA8NOTUNeBDnO6KGgemWCs1UErSqomegOb 4I36vftCRD37Pg4lsS4U8arhEtf5TmTzET3feEsLoFQPsKGC1t1Pa5cGPPO/KGF5W9ff QuMoPzyDRcaHEl3xUOw1Glk9su+jn1BTPmOtHdBApb3OnOUz/EyyDKdS7Sy0nlAz65ld sqeXvL5UHaC9gJfzbL221PuBBs1qNxO/PqRDakwob3nA1PfpGDBbHWuhLPSTQBqWOwUa Nh9FfSFTe3i1aZxo/I+PMXMS16JB4Vo1TRYi4m5RD0t1BvfZbC7yeB5/iYaKH3B0P8/S 0kxw== X-Forwarded-Encrypted: i=1; AFNElJ8blyQP6aMV7dELCmHdzUQCtES8GlbHGPAqUshIsMxLl3ZOk/LrJjUdrXRg0rY6pX5AQZNOOSEyUoV2@nongnu.org X-Gm-Message-State: AOJu0YwojKxhsqFp+VgmxnJE2dtaOLM4naEOH2FrC51/okgdI4NNMOtL yOETblt4DuqYlqmZPI05pts6X/MCoN1b1Gkw1YdpcVfBNCjfM98wBxFLiFgg6r1R3fTFd796nZq 3kqCvT4gR X-Received: from pgdj1.prod.google.com ([2002:a05:6a02:5201:b0:c79:8b64:4c6f]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:4046:b0:3b4:a0c0:6cb7 with SMTP id adf61e73a8af0-3b8dc840511mr457662637.11.1781649363295; Tue, 16 Jun 2026 15:36:03 -0700 (PDT) Date: Tue, 16 Jun 2026 22:35:28 +0000 In-Reply-To: <20260616-igb-trl-v5-0-1183e3635e06@google.com> Mime-Version: 1.0 References: <20260616-igb-trl-v5-0-1183e3635e06@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260616-igb-trl-v5-1-1183e3635e06@google.com> Subject: [PATCH v5 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=3088xagcKCpI5D347602AA270.yA8C08G-z0H079A929G.AD2@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: 1781649401632158500 Content-Transfer-Encoding: quoted-printable Introduce register offsets and bitmask constants for the Transmit Rate Limiter (TRL). Add the IGBTrlQueue structure and corresponding fields to IGBCore to track TRL state (timers, throttling status, and target rates) per queue. Initialize and free these timers during the device realize/uninit lifecycle, and reset them on device reset. Signed-off-by: Josh Hilke --- hw/net/igb_common.h | 1 + hw/net/igb_core.c | 41 +++++++++++++++++++++++++++++++++++++++++ hw/net/igb_core.h | 12 ++++++++++++ hw/net/igb_regs.h | 6 ++++++ 4 files changed, 60 insertions(+) diff --git a/hw/net/igb_common.h b/hw/net/igb_common.h index b316a5b..8c0a0cf 100644 --- a/hw/net/igb_common.h +++ b/hw/net/igb_common.h @@ -148,6 +148,7 @@ enum { defreg(MTA_A), =20 defreg(VTIVAR), defreg(VTIVAR_MISC), + defreg(TRLDQSEL), defreg(TRLRC), }; =20 uint64_t igb_mmio_read(void *opaque, hwaddr addr, unsigned size); diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 45d8fd7..44e8e58 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -2136,6 +2136,15 @@ igb_set_phy_ctrl(IGBCore *core, uint16_t val) } } =20 + +static void igb_trl_reset(IGBCore *core) +{ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + core->trl[i].trlrc =3D 0; + timer_del(core->trl[i].timer); + } +} + void igb_core_set_link_status(IGBCore *core) { NetClientState *nc =3D qemu_get_queue(core->owner_nic); @@ -4282,6 +4291,33 @@ igb_autoneg_resume(IGBCore *core) } } =20 +bool igb_trl_enabled(const IGBTrlQueue *q) +{ + return q->trlrc & E1000_TRLRC_RS_ENA; +} + +static void igb_trl_timer_cb(void *opaque) +{ + /* Stub */ +} + +static void igb_trl_init(IGBCore *core) +{ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + IGBTrlQueue *q =3D &core->trl[i]; + q->timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, igb_trl_timer_cb, q); + q->core =3D core; + q->qidx =3D i; + } +} + +static void igb_trl_uninit(IGBCore *core) +{ + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + timer_free(core->trl[i].timer); + } +} + void igb_core_pci_realize(IGBCore *core, const uint16_t *eeprom_templ, @@ -4297,6 +4333,7 @@ igb_core_pci_realize(IGBCore *core, for (i =3D 0; i < IGB_NUM_QUEUES; i++) { net_tx_pkt_init(&core->tx[i].tx_pkt, E1000E_MAX_TX_FRAGS); } + igb_trl_init(core); =20 net_rx_pkt_init(&core->rx_pkt); =20 @@ -4321,6 +4358,8 @@ igb_core_pci_uninit(IGBCore *core) net_tx_pkt_uninit(core->tx[i].tx_pkt); } =20 + igb_trl_uninit(core); + net_rx_pkt_uninit(core->rx_pkt); } =20 @@ -4469,6 +4508,8 @@ static void igb_reset(IGBCore *core, bool sw) =20 igb_intrmgr_reset(core); =20 + igb_trl_reset(core); + memset(core->phy, 0, sizeof core->phy); memcpy(core->phy, igb_phy_reg_init, sizeof igb_phy_reg_init); =20 diff --git a/hw/net/igb_core.h b/hw/net/igb_core.h index d70b54e..d80cfaa 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; + unsigned int qidx; + uint32_t trlrc; +} IGBTrlQueue; + struct IGBCore { uint32_t mac[E1000E_MAC_SIZE]; uint16_t phy[MAX_PHY_REG_ADDRESS + 1]; @@ -99,6 +106,9 @@ struct IGBCore { void (*owner_start_recv)(PCIDevice *d); =20 int64_t timadj; + + /* Transmit Rate Limiting */ + IGBTrlQueue trl[IGB_NUM_QUEUES]; }; =20 void @@ -143,4 +153,6 @@ igb_receive_iov(IGBCore *core, const struct iovec *iov,= int iovcnt); void igb_start_recv(IGBCore *core); =20 +bool igb_trl_enabled(const IGBTrlQueue *q); + #endif diff --git a/hw/net/igb_regs.h b/hw/net/igb_regs.h index 4dc4c31..9ef628b 100644 --- a/hw/net/igb_regs.h +++ b/hw/net/igb_regs.h @@ -718,4 +718,10 @@ static inline uint8_t igb_ivar_entry_tx(uint8_t i) return i < 8 ? i * 4 + 1 : (i - 8) * 4 + 3; } =20 +/* Transmit Rate Limiting */ +#define E1000_TRLDQSEL 0x03604 +#define E1000_TRLRC 0x036B0 +#define E1000_TRLRC_RS_ENA BIT(31) +#define E1000_LINK_RATE_1GBPS (1000000000ULL / BITS_PER_BYTE) + #endif --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:51 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=1781649385; cv=none; d=zohomail.com; s=zohoarc; b=JUeTOWG3ggCWxQa83JKDjgtTt+4IZmNcTgosraoFmKwsFGe1kWOknLsVzxW87aPLYIgbuIEIkOz52jb51/Y5hRBu5lZVmQAH7aO7nTbh2FFYzq93YUWnLC5APBOMRABK2FBE5aFA+JIdJk5pR07msW7jDWhoGlticcylffTLZTQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781649385; 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=Uig/xRQ/8j7fiTHq08E30tu2sZHsBpLElMXuG3JygLg=; b=mZ27TKxR884f/BSEewbCP1N6CjuXRp+ChIpTcZB+8o/M6n/9DtO1q0vT/091WZ4UpKOqSBBqjEs0AQ0Tro7GwfY0UzkZesacRGx3SZWKEJOJIwU84MdQRJiblYVnc92Ceyx9EIXNxlIlLu2vyk2+HnWY6PBPLx2liyxa7mqLsS0= 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 1781649385612439.5626390720905; Tue, 16 Jun 2026 15:36:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZcO9-0007N8-QB; Tue, 16 Jun 2026 18:36:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <31M8xagcKCpM6E458713BB381.zB9D19H-01I18ABA3AH.BE3@flex--jrhilke.bounces.google.com>) id 1wZcO8-0007Mg-FQ for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:08 -0400 Received: from mail-pl1-x64a.google.com ([2607:f8b0:4864:20::64a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <31M8xagcKCpM6E458713BB381.zB9D19H-01I18ABA3AH.BE3@flex--jrhilke.bounces.google.com>) id 1wZcO6-0001cU-QW for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:08 -0400 Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-2c6a9bbcc53so7708445ad.2 for ; Tue, 16 Jun 2026 15:36:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781649364; x=1782254164; 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=Uig/xRQ/8j7fiTHq08E30tu2sZHsBpLElMXuG3JygLg=; b=eT80CK7q2BKZ82LSaRjPwkPR4lFFPi7jflP6RIh283USaKKvZSn8aT3WLMEAe66aZz rAwt1BxTibK8c5oY9quqx26NlTrHAQHfXucSuV0ShUfOumhv2mnTK28AU1u1zR3ZVh76 oGzFFYw9JfZ2nhgULYrMywm9xX1UTzjB9oTLI1kfG9Y/RcijSLYSQZVw7qijApj8YlT3 yYloelitwcOr6XzfqozI6f8egtdYoo+ig9t32dC4njNvyjFyG52bpb14Sul0RxrXqLYQ GfVN2IsmZwSauelMRabUf9KdlsHaS8UlK4Rx/eShn9TK4CIga+xa2Y80wDDYjYeER+aU tWWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781649364; x=1782254164; 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=Uig/xRQ/8j7fiTHq08E30tu2sZHsBpLElMXuG3JygLg=; b=GqRTmO9PLr55f4lFLt5isUwsS4F61aHDAVfqezsNqRI/LKdVYEFqnE7/WLX2xac+Wb 9dgow7tQqTX2cCHVNNunPU2/UlRQs9CUCIfMLOu6dT6kq4wxNlrFJXq8GNhSnfDM+PVu 05nKwsATfWG1wQIxTI4WbJOT/xlXPjEoUimMVXrzcx2TQYrSuIu1nQVsl1HxTWgnRY7A 27vpPCKELvrqjM8JNt7Uf7N5KDE8CiXq+vYaThtUh1vMnvEqCz5Nlx0JkrViYQ2xWWo5 EBc4Ilnb3fRfSDz5LA7SdmVJlqD/kumLLjJRIz4Le3ULOeLMfDxdZjFsPhyEJ1vSeJNx eUuQ== X-Forwarded-Encrypted: i=1; AFNElJ9AKGD92NAlxtuoiOAMzz20mukvqb6+S+RS+2tYuSP8/qZTorvPdDTrVXZODF3r6OWe01b6DkBasB8C@nongnu.org X-Gm-Message-State: AOJu0YySFhp6gQjjOrylnlKsueh+LOCiojxWQpH7E8+s8ixV63Ls9jG6 X6zzNRZhSczqsLjWKn150ezgCgmNd17V/32Kd9hTY9kPxFg172AX7Kr8Hwtm4TR5WRpkn1r8HAP 46kSrtAbq X-Received: from plpn21.prod.google.com ([2002:a17:902:9695:b0:2c0:d4b7:5d29]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f546:b0:2c1:566b:f907 with SMTP id d9443c01a7336-2c6bc223d48mr8707035ad.20.1781649364097; Tue, 16 Jun 2026 15:36:04 -0700 (PDT) Date: Tue, 16 Jun 2026 22:35:29 +0000 In-Reply-To: <20260616-igb-trl-v5-0-1183e3635e06@google.com> Mime-Version: 1.0 References: <20260616-igb-trl-v5-0-1183e3635e06@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260616-igb-trl-v5-2-1183e3635e06@google.com> Subject: [PATCH v5 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::64a; envelope-from=31M8xagcKCpM6E458713BB381.zB9D19H-01I18ABA3AH.BE3@flex--jrhilke.bounces.google.com; helo=mail-pl1-x64a.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781649386950158500 Content-Transfer-Encoding: quoted-printable Add VMState representation for the Transmit Rate Limiter (TRL) state to support migration. This includes the TRL timers and target rates per queue. Signed-off-by: Josh Hilke --- hw/net/igb.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/hw/net/igb.c b/hw/net/igb.c index c076807..773da26 100644 --- a/hw/net/igb.c +++ b/hw/net/igb.c @@ -563,6 +563,45 @@ static const VMStateDescription igb_vmstate_intr_timer= =3D { VMSTATE_STRUCT_ARRAY(_f, _s, _num, 0, \ igb_vmstate_intr_timer, IGBIntrDelayTimer) =20 +static bool igb_trl_needed(void *opaque) +{ + IGBState *s =3D opaque; + + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + if (s->core.trl[i].trlrc) { + return true; + } + } + + return false; +} + +static const VMStateDescription igb_vmstate_trl_queue =3D { + .name =3D "igb-trl-queue", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_TIMER_PTR(timer, IGBTrlQueue), + VMSTATE_UINT32(trlrc, IGBTrlQueue), + VMSTATE_END_OF_LIST() + } +}; + +#define VMSTATE_IGB_TRL_QUEUE_ARRAY(_f, _s, _num) \ + VMSTATE_STRUCT_ARRAY(_f, _s, _num, 0, \ + igb_vmstate_trl_queue, IGBTrlQueue) + +static const VMStateDescription igb_vmstate_trl_state =3D { + .name =3D "igb/trl_state", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D igb_trl_needed, + .fields =3D (const VMStateField[]) { + VMSTATE_IGB_TRL_QUEUE_ARRAY(core.trl, IGBState, IGB_NUM_QUEUES), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription igb_vmstate =3D { .name =3D "igb", .version_id =3D 1, @@ -591,6 +630,10 @@ static const VMStateDescription igb_vmstate =3D { VMSTATE_INT64(core.timadj, IGBState), =20 VMSTATE_END_OF_LIST() + }, + .subsections =3D (const VMStateDescription * const []) { + &igb_vmstate_trl_state, + NULL } }; =20 --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:51 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=1781649449; cv=none; d=zohomail.com; s=zohoarc; b=ZrcOJl0a4W36kGOF5BpT9rjeHjKjC7wx7HjxdUvzk4SMkibL75Sy9mGewuArWX3IX4aqfv4ij/CYa4NpLz4/LsDEgKw32XzZS1F14EuaO5BXq4G+ln6dufFQGVVfK3KOszSAaPURiWtiATEyhJ22Y0uqUZcEZL3NJ1dBCwIS7DE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781649449; 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=xxGWVuKk5mGVqI71iHwXumugKQPkymM1Pn0ftLDkvAk=; b=AMN712bmzKZpcehwSl+MrLd9WAIoEuT85lx5UDy4pke36M1B/LW3icr32kErO32Pj27gmtCGGSKK2FCH3SibJhk2T6h8mdUIwmqXh/YyNKJ0wt47VuGrlFmCm21goz8Ldlwu2yvc6agrC/DS7Nl28L4G5BZ7/yXkcTzPTj9FTYM= 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 1781649449100910.4536842938052; Tue, 16 Jun 2026 15:37:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZcOD-0007OG-HR; Tue, 16 Jun 2026 18:36:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <31M8xagcKCpM6E458713BB381.zB9D19H-01I18ABA3AH.BE3@flex--jrhilke.bounces.google.com>) id 1wZcOA-0007ND-CD for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:10 -0400 Received: from mail-pj1-x1049.google.com ([2607:f8b0:4864:20::1049]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <31M8xagcKCpM6E458713BB381.zB9D19H-01I18ABA3AH.BE3@flex--jrhilke.bounces.google.com>) id 1wZcO7-0001ce-Ap for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:08 -0400 Received: by mail-pj1-x1049.google.com with SMTP id 98e67ed59e1d1-37c89e480easo465135a91.3 for ; Tue, 16 Jun 2026 15:36:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781649365; x=1782254165; 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=xxGWVuKk5mGVqI71iHwXumugKQPkymM1Pn0ftLDkvAk=; b=wmbzyh8qBFM57VLDzmihRBFGFXCbZVesAF8SPQRPgtwTTnbcNMbn+y6ozpk9yzqZ6q AWfixD3L39P6KjDd6KokvpMLRHVSs4nCZ4ay4vTBB4KZylU4ncjncRIzBF9oiAnde5hC 9N7vFHIOvQZEztx+kXT37y1L5RrwU5vjxgGWdb7tJ9/D9FPd82MHLNxWdIq0EgKpD2C2 CmxsEWN1cRGTPUQvX1oauGkHY/180alGTz3CwnTggeznJ1R6pJQ6kv0zZ71W+CXd4LBJ 79GpuJ5plgP0+qyirAlvMzNx/0rIxJFoYbaDNn9JLnxXz05i2carFnVSRiaXYXtrQAYe E1DQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781649365; x=1782254165; 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=xxGWVuKk5mGVqI71iHwXumugKQPkymM1Pn0ftLDkvAk=; b=UDI279iKdsOP7AY2nEBMcqM0+IOyTBZizjSeSg0l4LfIhPkQAPoqEv2KrudJZM9Gyw dFry82EVngPN/VgnvsrZmeqoZK8waxFZ3bgQzK1wldOk3La+HwcUCmwAbNli/880tIRV EX4uVRlr8s5HF8LacjkYspUIHX5H1VlNjzhsKwzJNZwy5vKIM8wQEtzhs7DYvQ5BRbLc jGghKx15mBJPLoMZgoGutcVsowwlQFaBZfRDRQrju99JEr+LzAdaGgrhDJcf6YcReV59 b/lUzgvrifcIEZWGUWoiK2/75LMgjiQq3S1X+P+bNF1w62bUYwje7EiPHnJaQ4NmeDRr mykw== X-Forwarded-Encrypted: i=1; AFNElJ8mjrQDxs74oTLHS/cmwwgkZpDMe5029eqHtSS1dDASFTAvWGR4s1v268W2/j2syEQHBmCWSjDGy0Os@nongnu.org X-Gm-Message-State: AOJu0Yzw7xS2JqM0aUVVrzxPtdwAk7pznW4AXb3g+Wy97O6ILbQV7GmV lOFiB2Brx5u3Svj8SxIapk8mAty/ddgm9sJ0ZM9IbdNTcA1ghVSyNC33rn75mR3aNUDvhF5g5eo 1BBUA7Yl8 X-Received: from pgbl26.prod.google.com ([2002:a63:571a:0:b0:c85:a528:228f]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:47:b0:36d:bc0d:f789 with SMTP id 98e67ed59e1d1-37c937144f8mr1360518a91.22.1781649364866; Tue, 16 Jun 2026 15:36:04 -0700 (PDT) Date: Tue, 16 Jun 2026 22:35:30 +0000 In-Reply-To: <20260616-igb-trl-v5-0-1183e3635e06@google.com> Mime-Version: 1.0 References: <20260616-igb-trl-v5-0-1183e3635e06@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260616-igb-trl-v5-3-1183e3635e06@google.com> Subject: [PATCH v5 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::1049; envelope-from=31M8xagcKCpM6E458713BB381.zB9D19H-01I18ABA3AH.BE3@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: 1781649449537158500 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 | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index 44e8e58..fb31e37 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -2145,11 +2145,21 @@ static void igb_trl_reset(IGBCore *core) } } =20 +static void igb_trl_disable(IGBTrlQueue *q) +{ + q->trlrc &=3D ~E1000_TRLRC_RS_ENA; + timer_del(q->timer); +} + void igb_core_set_link_status(IGBCore *core) { NetClientState *nc =3D qemu_get_queue(core->owner_nic); uint32_t old_status =3D core->mac[STATUS]; =20 + for (int i =3D 0; i < IGB_NUM_QUEUES; i++) { + igb_trl_disable(&core->trl[i]); + } + trace_e1000e_link_status_changed(nc->link_down ? false : true); =20 if (nc->link_down) { @@ -2632,6 +2642,29 @@ static void igb_set_vtivar(IGBCore *core, int index,= uint32_t val) */ } =20 +static uint32_t igb_get_trlrc(IGBCore *core, int index) +{ + const unsigned 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 extract32(val, 0, 4); +} + +static void igb_set_trlrc(IGBCore *core, int index, uint32_t val) +{ + const unsigned int qidx =3D core->mac[TRLDQSEL]; + + core->trl[qidx].trlrc =3D val; + + if (!igb_trl_enabled(&core->trl[qidx])) { + igb_trl_disable(&core->trl[qidx]); + } +} + static inline void igb_autoneg_timer(void *opaque) { @@ -3687,6 +3720,7 @@ static const readops igb_macreg_readops[] =3D { [RQDPC15] =3D igb_mac_read_clr4, [VTIVAR ... VTIVAR + 7] =3D igb_mac_readreg, [VTIVAR_MISC ... VTIVAR_MISC + 7] =3D igb_mac_readreg, + [TRLRC] =3D igb_get_trlrc, }; enum { IGB_NREADOPS =3D ARRAY_SIZE(igb_macreg_readops) }; =20 @@ -4135,7 +4169,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:51 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=1781649451; cv=none; d=zohomail.com; s=zohoarc; b=fd9r6vsFQjLAdaZXtUGsIwpSEDd4PSaIpitbpADZZ8Qea02daPMoFz9EPFBXoOyhoyUBl4/Aj7ryDubKkTep4l4Arfa6EWpLZcxhGOnUlqz3ZjqwqAjtEtuDUJIFTq54vcOqog0M4ZEpQEbCeez6hTyDGyrp3GqFWVASxX2yZNk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781649451; 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=i8sboYZs+AgO+kK/lrxvBnKXQH9QR1x6gV2ECBQVB50=; b=XbeNmN03m+ngYozqr/EEmtWRl6b9vvy/1C0sMJoBsoIGDxif9FuxhhYOY9dB4US/THG56CPwGTybFEtBxqJ6Zqyxc5VEAM3Jpvu6GrVb5O234PmE2EqLT4TkpM81qeejRDjtHIlYt2j7TlDz1383Go/MthNZLdtSJy9fPrmEcRk= 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 1781649451563666.7550964375125; Tue, 16 Jun 2026 15:37:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZcOD-0007OD-C9; Tue, 16 Jun 2026 18:36:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <31c8xagcKCpQ7F569824CC492.0CAE2AI-12J29BCB4BI.CF4@flex--jrhilke.bounces.google.com>) id 1wZcOA-0007NE-CB for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:10 -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 <31c8xagcKCpQ7F569824CC492.0CAE2AI-12J29BCB4BI.CF4@flex--jrhilke.bounces.google.com>) id 1wZcO7-0001cn-Q1 for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:09 -0400 Received: by mail-pg1-x549.google.com with SMTP id 41be03b00d2f7-c8611b27631so168391a12.0 for ; Tue, 16 Jun 2026 15:36:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781649366; x=1782254166; 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=i8sboYZs+AgO+kK/lrxvBnKXQH9QR1x6gV2ECBQVB50=; b=IyRhGQUKUAEkBGeId5fj9yloMGe6twIN9JKLXOGpFYainZNuJZ9U6V9xc45cwOK3ax i1QH3NmNt4+YK2kpV0cPyhZn3oYh0wWJ6YkP5PuPujpXjxzw5/z8NUKOliLZcwpBRhyx HwumyhIXaNtRCHfjAX+Cma6RZPbiH/F4TFJXleq6hmsjAR9Nd+J0CaVWY1fiG+lqoNCT UPq9wsiN9U5+m3TEOJaEoSVazOE4mmu6btLWZ+REK0NpYgvFG7/GZCBB7JPquzvhgk9r 1RF+DKE5fre9vXx9U6GkMwxtBEgg9JCCA9mBkqxMTU8gf8ISufeJ9XydgeO5vtHVxnG9 OHRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781649366; x=1782254166; 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=i8sboYZs+AgO+kK/lrxvBnKXQH9QR1x6gV2ECBQVB50=; b=kaOebNc9HPnkPiNPl3M4N4wquopBnSq3Fu4hJY3c3omBgo3IS01Ckjz3UxmyLqFq6S 7oNZbA/eiMMDcP9N4Z7/3cntgxVCxNoncrBVKUsqoUu3hKgqBeIGL9ITKMrH95eXnwrV F+ipSt9+XkupwvfjrkHNucZvhzZ0X5P/onBlFujQtNaaqNmTossTqcxMlg34yQYvO8vY w3l7odHBlAPCoI6hTZTR/KZzRSStEEbF8pF2kBLU/KoVWIRYnIDm6FsfD1LXgqdhr2sV 7aCi+6hE3W+rwquGsJ0UCS+RQEt3Z8pQHryDUPZc6TfzbtDJrkDMDhWzf47gQY3dumie jxNQ== X-Forwarded-Encrypted: i=1; AFNElJ8sTrFo+MyoVdCXa6BQhAu4yEHXj5u0AMFpldqTdly5jlF4CW1KmWYCyAFYwifni9zeNkMO77FztQ9o@nongnu.org X-Gm-Message-State: AOJu0YzScfNumLkjPIXHsfa4WJ8hCJcd2rn/QNU1R+9TCTnoN+BSrj/D 4hx58sQ+pU7W9KBYJhz1vRN+s0+rc81kpE8LCNNlFLHYdCmTZ7073ubJmk0r8ztfTMG/ucqGoOy mH7bLlW08 X-Received: from pld5.prod.google.com ([2002:a17:903:3545:b0:2c2:dcfe:8f73]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f549:b0:2c6:b3dc:b838 with SMTP id d9443c01a7336-2c6bd11dc47mr4061275ad.18.1781649365657; Tue, 16 Jun 2026 15:36:05 -0700 (PDT) Date: Tue, 16 Jun 2026 22:35:31 +0000 In-Reply-To: <20260616-igb-trl-v5-0-1183e3635e06@google.com> Mime-Version: 1.0 References: <20260616-igb-trl-v5-0-1183e3635e06@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260616-igb-trl-v5-4-1183e3635e06@google.com> Subject: [PATCH v5 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::549; envelope-from=31c8xagcKCpQ7F569824CC492.0CAE2AI-12J29BCB4BI.CF4@flex--jrhilke.bounces.google.com; helo=mail-pg1-x549.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781649453303158500 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 fb31e37..b7f880e 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -599,7 +599,7 @@ igb_on_tx_done_update_stats(IGBCore *core, struct NetTx= Pkt *tx_pkt, int qn) } } =20 -static void +static size_t igb_process_tx_desc(IGBCore *core, PCIDevice *dev, struct igb_tx *tx, @@ -632,10 +632,10 @@ igb_process_tx_desc(IGBCore *core, tx->ctx[idx].seqnum_seed =3D le32_to_cpu(tx_ctx_desc->seqnum_s= eed); tx->ctx[idx].type_tucmd_mlhl =3D le32_to_cpu(tx_ctx_desc->type= _tucmd_mlhl); tx->ctx[idx].mss_l4len_idx =3D le32_to_cpu(tx_ctx_desc->mss_l4= len_idx); - return; + return 0; } else { /* unknown descriptor type */ - return; + return 0; } } else { /* legacy descriptor */ @@ -654,11 +654,13 @@ igb_process_tx_desc(IGBCore *core, } =20 if (cmd_type_len & E1000_TXD_CMD_EOP) { + size_t total_len =3D 0; if (!tx->skip_cp && net_tx_pkt_parse(tx->tx_pkt)) { idx =3D (tx->first_olinfo_status >> 4) & 1; igb_tx_insert_vlan(core, queue_index, tx, tx->ctx[idx].vlan_macip_lens >> IGB_TX_FLAGS_VLAN_SHIFT, !!(tx->first_cmd_type_len & E1000_TXD_CMD_VLE)); + total_len =3D net_tx_pkt_get_total_len(tx->tx_pkt); =20 if ((tx->first_cmd_type_len & E1000_ADVTXD_MAC_TSTAMP) && (core->mac[TSYNCTXCTL] & E1000_TSYNCTXCTL_ENABLED) && @@ -675,7 +677,9 @@ igb_process_tx_desc(IGBCore *core, tx->first =3D true; tx->skip_cp =3D false; net_tx_pkt_reset(tx->tx_pkt, net_tx_pkt_unmap_frag_pci, dev); + return total_len; } + return 0; } =20 static uint32_t igb_tx_wb_eic(IGBCore *core, int queue_idx) --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:51 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=1781649467; cv=none; d=zohomail.com; s=zohoarc; b=CTLpGbqFL+yo50CGOX/feetu+F0rc2969j22FRkGpe9XF9ogAp+7aErIgT+JRkM+Dk1fbaE3TlitnLA49ks5Wao+dJeXAiwS9LsYp9kQj7edmo2Re2/5pQorkI+GiwzCkU5Z/ZOTaMeTBk+BaPOE4YIx16hNR1y3TpTC2m0Hsp0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781649467; 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=PsAgANYNyUBwQx2gOQDlGSUWKb9RLynfIzMCyqMvy4Q=; b=gbC7qb8hAg7H3nj//fX7Y366lxxb/fkUmI1jumS1T99ceKsT76Y/9YUuT/aUqQZDfJTyDwFP0E+i8bb/d7SPTAFYEnyn4UAqGYXziUoWDenBCptrCOWeL4khhu5F0rkJeroSM7A4kgTR7bOL5jwcZPx9OkiCq0jhSSNLGojfFFY= 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 1781649467379963.9305785438208; Tue, 16 Jun 2026 15:37:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZcOE-0007OH-1d; Tue, 16 Jun 2026 18:36:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <31s8xagcKCpU8G67A935DD5A3.1DBF3BJ-23K3ACDC5CJ.DG5@flex--jrhilke.bounces.google.com>) id 1wZcOC-0007Nj-Cv for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:12 -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 <31s8xagcKCpU8G67A935DD5A3.1DBF3BJ-23K3ACDC5CJ.DG5@flex--jrhilke.bounces.google.com>) id 1wZcOA-0001d4-7J for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:11 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-8423f24dcedso6143841b3a.1 for ; Tue, 16 Jun 2026 15:36:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781649367; x=1782254167; 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=PsAgANYNyUBwQx2gOQDlGSUWKb9RLynfIzMCyqMvy4Q=; b=VD1sEXwSOLQa+zkhCWzV1WGifAmyTAe3QI4wqBOZN59I8+ALl4h6ZK93VyX+fHIjcH ncZbMBqxkbDA7gdoN4Bt8RGr2pipAttn0LPWk9Z7BmboDeNm8NP4Eah/A+6IG/P3Nh+m 0QalevOo5aqvISWLH+qZhKASEKsLmIe5EUNgWvM8gm6l6TNOIm6sujbzDMt0M0sjV7hh FRK9naq68dFNnUoUP45Lok1nnJu9FnhfC2COw66eZAYX5fUKORgJngrpEcPIk32Kzbl8 V6KG5eTJAAyvYkIyHGKWxunqvqw3N3QmX+6bIFNqUSEhdyfPgoitfEfLE1zz7EL64REo eRwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781649367; x=1782254167; 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=PsAgANYNyUBwQx2gOQDlGSUWKb9RLynfIzMCyqMvy4Q=; b=TOymIDvXRIiAv4TTNa3MyW2KVzXbfsdwqLaa+8yprcDsocEV9KprpxO3SUJayW4GwB H562pcGcueS+dbVVdRXGYmGZW9j8QEgjxtOQhnMPFmRPcq+PfP/tTTRxuIAWS4qS98uo eYhR+n/dIkB6LtYsleMrJq6qCXKyj75+hp9Nh+oAbBy/s41YkR0Z9k5CbvfyPxGkvwqW JQHDougRklFXrMgkh7+OPcsAC8I3nkXXP4bllSd8FcKN4ldqhqjPSMovMbGpBvr1ztfp oCOpSnC2XoHjwnZCwnrEdHfJg/Npb41hg0ilIR8UDCn84qTHO3d7EwieoK10VJsveozT YtoA== X-Forwarded-Encrypted: i=1; AFNElJ/pr7vAxYI6Sh2M3rSLZ+yVnSszLVN09ZWIMzh7vOgPJkZkTlb0Bc9cSUtM2FTC9rr+Rii3K5zIc075@nongnu.org X-Gm-Message-State: AOJu0YyushYA/+2OLany9NIj3lOkVE4ZH9YHTWPx5tuMDXTDuW+6jycQ SJRX/lyVT+sWX7Ck5EL4Hbyz+02XJiWMygM7gyznbAoa7OO1wtZdcj2+IvY99qsgeBU0HWSHvVF s2OPgujdY X-Received: from pfbha13.prod.google.com ([2002:a05:6a00:850d:b0:83e:e011:246b]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2e0d:b0:841:dc8d:8066 with SMTP id d2e1a72fcca58-845245ba4eamr963529b3a.39.1781649366472; Tue, 16 Jun 2026 15:36:06 -0700 (PDT) Date: Tue, 16 Jun 2026 22:35:32 +0000 In-Reply-To: <20260616-igb-trl-v5-0-1183e3635e06@google.com> Mime-Version: 1.0 References: <20260616-igb-trl-v5-0-1183e3635e06@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260616-igb-trl-v5-5-1183e3635e06@google.com> Subject: [PATCH v5 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=31s8xagcKCpU8G67A935DD5A3.1DBF3BJ-23K3ACDC5CJ.DG5@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: 1781649469424158500 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 | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index b7f880e..7f14564 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -96,6 +96,8 @@ igb_receive_internal(IGBCore *core, const struct iovec *i= ov, int iovcnt, =20 static void igb_raise_interrupts(IGBCore *core, size_t index, uint32_t cau= ses); static void igb_reset(IGBCore *core, bool sw); +static uint64_t igb_trl_get_target_rate(const IGBTrlQueue *q); + =20 static inline void igb_raise_legacy_irq(IGBCore *core) @@ -875,6 +877,16 @@ 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 low, high; + + mulu64(&low, &high, bytes_sent, NANOSECONDS_PER_SECOND); + divu128(&low, &high, target_rate); + return low; +} + static void igb_start_xmit(IGBCore *core, const IGB_TxRing *txr) { @@ -883,12 +895,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 +921,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) { @@ -4330,15 +4359,55 @@ igb_autoneg_resume(IGBCore *core) qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); } } +static uint32_t igb_trl_get_scaled_rate_factor(uint32_t trlrc) +{ + /* + * The TRLRC register stores the Rate Factor in 10.14 fixed-point form= at: + * - Bits 13:0: Fractional part + * - Bits 23:14: Integer part + * + * Combined, the lower 24 bits of the register (23:0) represent the + * concatenated 24-bit scaled Rate Factor directly. + */ + return extract32(trlrc, 0, 24); +} =20 bool igb_trl_enabled(const IGBTrlQueue *q) { return q->trlrc & E1000_TRLRC_RS_ENA; } =20 +static uint64_t igb_trl_get_target_rate(const IGBTrlQueue *q) +{ + const uint32_t rf_scaled =3D igb_trl_get_scaled_rate_factor(q->trlrc); + + if (!igb_trl_enabled(q)) { + 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 */ + IGBTrlQueue *trl =3D opaque; + IGB_TxRing txr; + + igb_tx_ring_init(trl->core, &txr, trl->qidx); + igb_start_xmit(trl->core, &txr); } =20 static void igb_trl_init(IGBCore *core) --=20 2.54.0.1136.gdb2ca164c4-goog From nobody Sun Jul 26 13:28:51 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=1781649392; cv=none; d=zohomail.com; s=zohoarc; b=C+V+neEpzK+aRVLBPok3/tfCKm4x7XIcQorSgeIfPecxGqsAP9Ght5vnen8BY9JDjE6mA3TlCHs5S1r35QaT6r6h0a68apKM1Yx91oZ3/hqtVC2IFlA+LXEXHVhngpGMh1ZI0VRiqCZRYe8Z2IWAIG2uVH3ITkoiDOeCPM+RWLc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781649392; 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=m7jO2PV3+E8NEx3FpwuhfG3jgS8fDA3kXHmk1cLru/i1A933ivnb1WIbFzxs9kliS7E2oxr8rBQd/tGzvwewnz+fn3FyAXKPzysbWWQpaW716+6tpyqcgJrTSw+lYCqkCf5KJY6kcI3Tt0FSw4CFhudgrKv6D5WdbSWnKTf73so= 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 1781649392227454.8197635797551; Tue, 16 Jun 2026 15:36:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZcOG-0007Om-G7; Tue, 16 Jun 2026 18:36:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3188xagcKCpY9H78BA46EE6B4.2ECG4CK-34L4BDED6DK.EH6@flex--jrhilke.bounces.google.com>) id 1wZcOE-0007Ob-76 for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:14 -0400 Received: from mail-pg1-x549.google.com ([2607:f8b0:4864:20::549]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3188xagcKCpY9H78BA46EE6B4.2ECG4CK-34L4BDED6DK.EH6@flex--jrhilke.bounces.google.com>) id 1wZcOA-0001dF-Ql for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:13 -0400 Received: by mail-pg1-x549.google.com with SMTP id 41be03b00d2f7-c858e0cbca3so2761508a12.2 for ; Tue, 16 Jun 2026 15:36:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781649367; x=1782254167; 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=G/G6/2JZ05T0djuorAbxIwo8R+thkMIVQR/vkPny8lCZhw8rKWq214WcNQ+6FbGfxr zlctb6y2tAwy2QmIDhdbxDRPeOZT7TEUcEHCWx5RKCDjEYdKSJWeui6EHpi2nSNEPn7T d0ZD2F8OiKqjn+5YcVK6lRIvn3GRPdbH9/bYDeMbGn5mI5sHRSg339oiJXyH3eKqYlu2 JjaI+w/VN/nRpI27kdeayY9L3C/IVqAeQ792GtaBDQyCTvYDAZ3HRVC6QvGenl7HriUI RDIYuuEB7EU3n60ZGuqmY1ckK8XfZkeqzBgY8/MdNwRQIX2l/xL+KifW0LpmSTcd+k53 mh3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781649367; x=1782254167; 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=HXPn37epA0dBC5qfNUcoEMMoV1MQcJdVUgiByAf0OCsZdnWkLgzWzTBZwEyzb4PayF W0doJHQKsnKHjyf8LnIEbfzl0XtynwWJBF3GI+VxQp4Hqur1KjOpZbcmS3d/xfZ4HQo/ z/xTf1LjknVAMeXWKVxqVVZL81dFE7QAAly7mikgeJGDEMxu01hOY2vD73neRhqzeyQX Y50fvP4oxqeM8ZyGUr2LXno069EwZwoBNoQBt7ee9SE4WFwRxrHpSlXP5AQGbrGPWao0 jW4R4NAXFK/TM24b1ZpijyHF6l7fAC0AV+XUwC6iF5aEsQ8fWtrx7/chFzE8X4ZF1YTm GfOQ== X-Forwarded-Encrypted: i=1; AFNElJ/fC1FSwb0tcAHbMa3B4y/cteFr1E/HABY6E3KclnWJnnBswT2r+ngjNS0hEg8kmZFhIaF9rjhFzPSU@nongnu.org X-Gm-Message-State: AOJu0YxP1jfpmAzyhhsB447G6sQpaiS5x8nG2W8QWOUWM5iyQcor7inD 3zQJG1MwoVoGT4Sqo6L2ixjenAEgaBA6YY1KG2c2YfgrBUtiJcjaBdgcUgz7UzgOI//p957hQQy 5g+pt5toP X-Received: from pgve17.prod.google.com ([2002:a65:6491:0:b0:c09:15e9:db4e]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:734e:b0:398:6ea8:21f7 with SMTP id adf61e73a8af0-3b8b624bb73mr1436313637.15.1781649367228; Tue, 16 Jun 2026 15:36:07 -0700 (PDT) Date: Tue, 16 Jun 2026 22:35:33 +0000 In-Reply-To: <20260616-igb-trl-v5-0-1183e3635e06@google.com> Mime-Version: 1.0 References: <20260616-igb-trl-v5-0-1183e3635e06@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260616-igb-trl-v5-6-1183e3635e06@google.com> Subject: [PATCH v5 6/7] igb: Add QTest for Transmit Rate Limiter register multiplexing From: Josh Hilke To: Akihiko Odaki , qemu-devel@nongnu.org Cc: Josh Hilke , Sriram Yagnaraman , Jason Wang , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , David Matlack , Alex Williamson Content-Type: text/plain; charset="utf-8" Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::549; envelope-from=3188xagcKCpY9H78BA46EE6B4.2ECG4CK-34L4BDED6DK.EH6@flex--jrhilke.bounces.google.com; helo=mail-pg1-x549.google.com X-Spam_score_int: -95 X-Spam_score: -9.6 X-Spam_bar: --------- X-Spam_report: (-9.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_DKIM_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1781649393610158500 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:51 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=1781649421; cv=none; d=zohomail.com; s=zohoarc; b=Pc5YkZo9i7YJcSMCacxo8jXkZQ++6y7M0GcJ3oNq6+FZhlHdXs1l8x5l23QnsrZnIFVPvVbhF+9s7YSB4y54/a7MVRGaT2ljkewbuzENzKPhy8iWTqVpe1LRB7oNQ5CrTTgVJli6YRzu5EA6LtlvWAl9zTXpLdtKSbFdTmpHNYc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781649421; 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=GG5joh7Zf7V9t7yR02Js4ZE8fBqd9T4x+boNHIxuMX3chLLPrKs2dm6b4/prp49f90JPyTWZu9yi6fYMWyCYsAZc5h6i33GER/Xz3HclmNvNdRvy7kwBXK5qznkoGTSbZhYMgw//0DZT4Lk+uxc9D4ENPLGRJPXvL1500W0JcZk= 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 1781649421650382.9318578785759; Tue, 16 Jun 2026 15:37:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wZcOJ-0007Pb-6f; Tue, 16 Jun 2026 18:36:19 -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 <32M8xagcKCpcAI89CB57FF7C5.3FDH5DL-45M5CEFE7EL.FI7@flex--jrhilke.bounces.google.com>) id 1wZcOG-0007Ol-1k for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:16 -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 <32M8xagcKCpcAI89CB57FF7C5.3FDH5DL-45M5CEFE7EL.FI7@flex--jrhilke.bounces.google.com>) id 1wZcOC-0001db-4d for qemu-devel@nongnu.org; Tue, 16 Jun 2026 18:36:14 -0400 Received: by mail-pf1-x449.google.com with SMTP id d2e1a72fcca58-842208d5b0eso3988802b3a.3 for ; Tue, 16 Jun 2026 15:36:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781649368; x=1782254168; 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=B5OPkCE2dLoT3oo5DK1SP/pSAt9QZeqTrrlm8sxI9b+Mf9zXCehXnehQlre2Cl+s0z uJlKausOLIjkKk24uCQ6x3Nl9yomzIxqLzYLQOwAmADzupkkfGJkcIyQXqKobdPEZVpc HMcYxqVUqq9h0Ww+Z8tWTpf/zjmBKzgKIhj8RAU99HL14E7pr9cwRdZ27aTgE++Wzqhq ECNGoF0tGXiNjbGyrIDuwi4zL/PThqFrNYEUs8k03leMP68xqOAOJBpbPb91zTjWRrgJ BLuBFYMN0ghlbDWdNaRemjc7IhQcAIt3gD/SAxIiJf+iz8k8q2GrWxMKi5Ms6JstpPxn KJeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781649368; x=1782254168; 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=gKK4xCSr68MAaHsdbU8KVLSzKNxnilORinAyLPIjbefwzsy0vN/j8bE5lL6RBVf8lN 3TN3ky9eCgnZjODjCCVn4rSgBO3LS+zs5ouBpOxAawOcvlqn89sogacMewB4bwyBqeFl DaE3yKkQNWoocMM7jVOoN4+07tWqiHk7ixIWkljJ3HZ6TnaAkNk661Ha523qgMQHGNME c7naEup+0EJ2PKQ0/GzhXMz7fE0xw/Yv/jzHvzfkHpujinwHVaEtfq9+AZ5Fa7v2XW+I 0Nis0ny8ZcmkeQs1B8DqZtItIqkbfYZ12lADdyvw4z3Ic1PQcifzQGEsvINjfCGBgiGX aJnQ== X-Forwarded-Encrypted: i=1; AFNElJ+q2AL0ofAsbD8gYYrmeoW67AaCKnAFeFjIgyFnycRUws1wYbjKx2oUQb+k8ztT1XOtlqBkuQ4hzHJj@nongnu.org X-Gm-Message-State: AOJu0YyjbMS9xZpRVqgPThijxzhdxxLQYEAwLRyJ5KkhLXBnnX18/E9d xFjIrvdni3l346OIBTfIe5UARva28Z5537+iqADRi9N5VL1Yv5UG6z0Zu59GtDPvnapLbw+MfkO ZYJWYt2w5 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:4218:b0:842:7992:bdc5 with SMTP id d2e1a72fcca58-845247b84b3mr964431b3a.41.1781649368008; Tue, 16 Jun 2026 15:36:08 -0700 (PDT) Date: Tue, 16 Jun 2026 22:35:34 +0000 In-Reply-To: <20260616-igb-trl-v5-0-1183e3635e06@google.com> Mime-Version: 1.0 References: <20260616-igb-trl-v5-0-1183e3635e06@google.com> X-Mailer: b4 0.14.3 Message-ID: <20260616-igb-trl-v5-7-1183e3635e06@google.com> Subject: [PATCH v5 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=32M8xagcKCpcAI89CB57FF7C5.3FDH5DL-45M5CEFE7EL.FI7@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: 1781649424198158500 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