From nobody Thu Sep 10 05:53:44 2026 X-Original-To: dev-commits-src-branches@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 4hgRgX67TRz6rQcp for ; Thu, 10 Sep 2026 05:53:44 +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 4hgRgX3RpSz4nmt for ; Thu, 10 Sep 2026 05:53:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789019624; 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=l6UNMJmfBxFlBsuuUA0vicGbSyfAl8REU4D79C05+Oc=; b=aw6IDNqlPwIuQXra6SeTbQmk9po9HQicRsXoOXU8giS3kUw4h5D9dwRds+2kQrpFj4HA2D WIxZGHdYVYKQkwMb/J83DLAjgAXx0sKeXTYW09AsLs1gtKgVzX6aM/gJVWVpIgT+YC7iqe /xZ/aPtuLQ18YYrPCKu7aJeDIa6MePflL6H2vrXQOUCKeRd99slB1VS7zI7/webVEFEHRT /P9/xdHb31B0Y3ePEi1h7ICiEk1K4gIMgtd9WgcnApZHRMyMcLgW0Mmv36c7b21ByyjQRn +aG4Dr4zUB4MvaqrAMbYDLzJe2ctlM2W7Z3Cd2g2hmqrxwTMEajAV0tgwweOLw== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1789019624; b=DRD9XlWu09HSINTI9usvlo7AnRZKs8FlgIjHznCr7g+cuoE+frKukPjiv5VMVjBghwVHPC 1ajjx2CUTwMolN5pD9zKsJbLA0Ou9SfCuSTjW7IlI6KhmE9DJPIEUrGwCYljKzmU1PMXpb txWf+9kiFAt4aVHeDYPoAoVY4wA0O+/eMMWkLQZqtx/+uegDkZNwOOlB5cU5pYt6dNqU1F 5r+EZd2Hik8y6ddmgVJvhvDhvUj+xEiYRji9G3JbJcI6rkxa2f9a15ZUBavS5euICWHNDP P5zuounwHXJGKubvt+jrDZTVxo65PQGJn3en06JCxb8WDpazqBzC/CUoFAqAAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789019624; 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=l6UNMJmfBxFlBsuuUA0vicGbSyfAl8REU4D79C05+Oc=; b=CyRzvDPMeQH+aPrB9bqOBNgw+avqG921DzxzLs0YDTLzD3GJf6bv92BlkFqZ228TQ/3u3x pHAEKLPLh0ScAmmEW3dUZzlfq8bIIB43vU5GJdXPfolybinwLK09Cde/TdSyIJFIdSIQZz L+oxuZba53ELI+uQuCx+0e9Y7ejdt+ooYPnxpDm6oE7mYtotBMnF+Vx21+ygRkOalojEVh /r39tTj1unf97s+88lmcA8gYLhnRSF7YJjSQO9WE0wwgvyDfzd5HHnyVe1+AYBR3qQQnjX ZSQFE+eY95/nY3pDHAFO4+Utpc81qLacnKCI3WIGogkuDXg7ikyseOy1f5s+Sg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hgRgX2JTzzDxV for ; Thu, 10 Sep 2026 05:53:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3d484 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 10 Sep 2026 05:53:44 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kevin Bowling Subject: git: 44f0c9d2f89f - stable/14 - acpi_pci: Cache PCI proximity domains List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@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/stable/14 X-Git-Reftype: branch X-Git-Commit: 44f0c9d2f89f1712de294c39c6e48bd6d6f388f0 Auto-Submitted: auto-generated Date: Thu, 10 Sep 2026 05:53:44 +0000 Message-Id: <6aa245e8.3d484.10687644@gitrepo.freebsd.org> The branch stable/14 has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=44f0c9d2f89f1712de294c39c6e48bd6d6f388f0 commit 44f0c9d2f89f1712de294c39c6e48bd6d6f388f0 Author: Kevin Bowling AuthorDate: 2026-08-27 06:22:56 +0000 Commit: Kevin Bowling CommitDate: 2026-09-10 05:49:26 +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 Sponsored by: BBOX.io Differential Revision: https://reviews.freebsd.org/D59207 (cherry picked from commit 5f78d024695b39208a6c92f6a96017bae53cdf2c) --- 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 4b5d809ad277..91d365eec178 100644 --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -1288,20 +1288,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); @@ -1309,13 +1308,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 a7e771322110..9a9e36848977 100644 --- a/sys/dev/acpica/acpi_pci.c +++ b/sys/dev/acpica/acpi_pci.c @@ -64,8 +64,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. */ @@ -135,6 +139,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); } @@ -220,16 +225,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)); } /* @@ -245,8 +272,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); @@ -255,7 +281,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 d35504127c9c..eece4d0cbf85 100644 --- a/sys/dev/acpica/acpivar.h +++ b/sys/dev/acpica/acpivar.h @@ -600,6 +600,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.