From nobody Thu Aug 27 22:50:43 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hWGvR6mfmz6pXTC for ; Thu, 27 Aug 2026 22:50:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hWGvR43ttz3thD for ; Thu, 27 Aug 2026 22:50:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1787871043; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=+1w4m9tciLSKaWulVTziwo2zVXP8P6VcuUZ6jKbPI7Q=; b=n4nr95CWEvOe/qps1HNgA4X493mVLQITuGRPbnliGxSTzABLU81QL8BUiYroNGeCRcDJvM +CHZWT8LdQGuIWTiEzasxptFdnf764P+BTNXvjVsgZRs4pf4gqfnyZNIMV370U90+VtomF cJGcNgmytkaaFSSaQBKLh3VHsBI8XuopGN/BzcwQAHYHQLQtgbE0Zk2iNrNlKMv8CpZ0mU sJOimw/YE5Bsxb8ErEA+sVlWWOpqN7u8V6Cy9+x7jItX5y1GZwXorvVeE2Q7STvhRjbNGj LKF9RVbBBPqVGhQaLFD2oB4iLoG7JqKYTs2ceAYOHClsaX4TSeg2SE4PSuNQLQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1787871043; a=rsa-sha256; cv=none; b=JsQlpCLSl1iwLsqDbdy03vyv7u1kf9uaIus6oDo+mLVUaY+Eb3GZ5C81CkFA/xbki9DRwR g752JiRqebbD6OB12Mez1SLK32t+jOYMzthlZa/61rXRIZ/rl14rRDyCXxi/5SUTyKusd6 Dj9Vb6ZHrAMLKxC+r82mTSkTW0oZjGgQgZjvHYemTk9lTjq0t8mqPZowb6ZRIr3Vcaqron qsrcSk49loRc6Po9YC7Ku119CWN+VfxQaDwGmoI/6UO0tjHm8r7kIUs7FxHmndgbdkVN+a twz8QTKQtJv67YIDsjkUXkVIP424SQocycmg8AAmM8Of+nXRDsuAe60hwYI95Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1787871043; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=+1w4m9tciLSKaWulVTziwo2zVXP8P6VcuUZ6jKbPI7Q=; b=ys/NCatrruZW+4ez8YpW0DUP/FptfE7HDmUCe33sUqnROIbaS1sKZC3AsHJV9NQXFOHt7w x4QmvwIkvPBw0retN++HsAxRyIgrivCPtsCuQt9t9NEt9B8EOYjZaZEEtd+JiIG5kVKLOv dwxve8Zv1uikNgOqfbeE+AHQBdcZkhhkG1LUqXd9snDehjBYGdmRJSBYIP+h7eTLgQnSE6 rM5QdEEBXF+TirxM4HOpdYEe/gWY17qij29Q+gTHF+a8VL7kBdddP///CKL4sM1r4UGgyE WzJloowTg2Xast0TuaLrZedtF+sZB08mvtqOod7PxKS7jYbXvMWHaSbV0z5xAw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hWGvR2n2Gzky4 for ; Thu, 27 Aug 2026 22:50:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1845d by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 27 Aug 2026 22:50:43 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kevin Bowling Subject: git: 5f78d024695b - main - acpi_pci: Cache PCI proximity domains List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kbowling X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5f78d024695b39208a6c92f6a96017bae53cdf2c Auto-Submitted: auto-generated Date: Thu, 27 Aug 2026 22:50:43 +0000 Message-Id: <6a90bf43.1845d.6be12881@gitrepo.freebsd.org> The branch main has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=5f78d024695b39208a6c92f6a96017bae53cdf2c commit 5f78d024695b39208a6c92f6a96017bae53cdf2c Author: Kevin Bowling AuthorDate: 2026-08-27 06:22:56 +0000 Commit: Kevin Bowling CommitDate: 2026-08-27 22:49:56 +0000 acpi_pci: Cache PCI proximity domains A PCI function's _PXM is stable for the lifetime of its device instance, but CPU and DMA locality queries may evaluate it repeatedly. SR-IOV amplifies this because every VF resolves locality through the same PF. Cache successful mappings and the stable absence of _PXM on the locality source device, and share that result between CPU and domain queries. Continue to retry generic evaluation or mapping errors rather than making a potentially transient failure permanent. Reviewed by: jhb MFC after: 2 weeks Sponsored by: BBOX.io Differential Revision: https://reviews.freebsd.org/D59207 --- sys/dev/acpica/acpi.c | 22 +++++++++++++++------- sys/dev/acpica/acpi_pci.c | 37 ++++++++++++++++++++++++++++++++----- sys/dev/acpica/acpivar.h | 3 +++ 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c index 5469df01fd35..8b897defe6ce 100644 --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -1402,20 +1402,19 @@ acpi_pxm_parse(device_t dev) } int -acpi_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize, - cpuset_t *cpuset) +acpi_get_cpus_for_domain(device_t dev, device_t child, int domain, + enum cpu_sets op, size_t setsize, cpuset_t *cpuset) { - int d, error; + int error; - d = acpi_pxm_parse(child); - if (d < 0) + if (domain < 0) return (bus_generic_get_cpus(dev, child, op, setsize, cpuset)); switch (op) { case LOCAL_CPUS: if (setsize != sizeof(cpuset_t)) return (EINVAL); - *cpuset = cpuset_domain[d]; + *cpuset = cpuset_domain[domain]; return (0); case INTR_CPUS: error = bus_generic_get_cpus(dev, child, op, setsize, cpuset); @@ -1423,13 +1422,22 @@ acpi_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize, return (error); if (setsize != sizeof(cpuset_t)) return (EINVAL); - CPU_AND(cpuset, cpuset, &cpuset_domain[d]); + CPU_AND(cpuset, cpuset, &cpuset_domain[domain]); return (0); default: return (bus_generic_get_cpus(dev, child, op, setsize, cpuset)); } } +int +acpi_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize, + cpuset_t *cpuset) +{ + + return (acpi_get_cpus_for_domain(dev, child, acpi_pxm_parse(child), op, + setsize, cpuset)); +} + static int acpi_get_domain_method(device_t dev, device_t child, int *domain) { diff --git a/sys/dev/acpica/acpi_pci.c b/sys/dev/acpica/acpi_pci.c index 8b6aeb69f593..1f04de54ac44 100644 --- a/sys/dev/acpica/acpi_pci.c +++ b/sys/dev/acpica/acpi_pci.c @@ -61,8 +61,12 @@ struct acpi_pci_devinfo { struct pci_devinfo ap_dinfo; ACPI_HANDLE ap_handle; int ap_flags; + int ap_domain; }; +/* acpi_pxm_parse() returns -2, -1, or a non-negative domain. */ +#define ACPI_PCI_DOMAIN_UNSET (-3) + ACPI_SERIAL_DECL(pci_powerstate, "ACPI PCI power methods"); /* Be sure that ACPI and PCI power states are equivalent. */ @@ -132,6 +136,7 @@ acpi_pci_alloc_devinfo(device_t dev) struct acpi_pci_devinfo *dinfo; dinfo = malloc(sizeof(*dinfo), M_DEVBUF, M_WAITOK | M_ZERO); + dinfo->ap_domain = ACPI_PCI_DOMAIN_UNSET; return (&dinfo->ap_dinfo); } @@ -217,16 +222,38 @@ acpi_pci_get_locality_device(device_t child) return (pf != NULL ? pf : child); } +/* Cache locality on its source device; all of a PF's VFs share its result. */ +static int +acpi_pci_get_locality_domain(device_t child) +{ + struct acpi_pci_devinfo *dinfo; + device_t locality; + int domain; + + locality = acpi_pci_get_locality_device(child); + dinfo = device_get_ivars(locality); + domain = dinfo->ap_domain; + if (domain == ACPI_PCI_DOMAIN_UNSET) { + domain = acpi_pxm_parse(locality); + /* Do not make a generic evaluation or mapping error permanent. */ + if (domain != -1) + dinfo->ap_domain = domain; + } + return (domain); +} + static int acpi_pci_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize, cpuset_t *cpuset) { + device_t locality; /* BUS_GET_CPUS may preserve a descendant below the PCI function. */ if (device_get_parent(child) != dev) return (acpi_get_cpus(dev, child, op, setsize, cpuset)); - child = acpi_pci_get_locality_device(child); - return (acpi_get_cpus(dev, child, op, setsize, cpuset)); + locality = acpi_pci_get_locality_device(child); + return (acpi_get_cpus_for_domain(dev, locality, + acpi_pci_get_locality_domain(locality), op, setsize, cpuset)); } /* @@ -242,8 +269,7 @@ acpi_pci_get_domain(device_t dev, device_t child, int *domain) { int d; - child = acpi_pci_get_locality_device(child); - d = acpi_pxm_parse(child); + d = acpi_pci_get_locality_domain(child); if (d >= 0) { *domain = d; return (0); @@ -252,7 +278,8 @@ acpi_pci_get_domain(device_t dev, device_t child, int *domain) return (ENOENT); /* No _PXM node; go up a level */ - return (bus_generic_get_domain(dev, child, domain)); + return (bus_generic_get_domain(dev, + acpi_pci_get_locality_device(child), domain)); } /* diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h index 27300a00b8d1..028b39637a45 100644 --- a/sys/dev/acpica/acpivar.h +++ b/sys/dev/acpica/acpivar.h @@ -603,6 +603,9 @@ void acpi_pxm_set_mem_locality(void); void acpi_pxm_set_cpu_locality(void); int acpi_pxm_get_cpu_locality(int apic_id); int acpi_pxm_parse(device_t dev); +int acpi_get_cpus_for_domain(device_t dev, device_t child, + int domain, enum cpu_sets op, size_t setsize, + cpuset_t *cpuset); /* * Map a PXM to a VM domain.