From nobody Thu Aug 6 15:01:40 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 4hG9Tw51sbz6nBD6 for ; Thu, 06 Aug 2026 15:01:40 +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 "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hG9Tw2HbXz3DpS for ; Thu, 06 Aug 2026 15:01:40 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786028500; 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=rBPx9JRJGSrT9/WGxsTYP2dWWtGB9s0teT8Df0Vy2uc=; b=xffFxgqGMhy8F/tbHaJb0zdQZky7kMwk21/BChVu5BSflPweoRCnfHWeF8K8EZKiKBcIiF 93IgjE8sGoeLLpIPYY6hT7Wvz0Vc1Lctikf4JXGeQTOqDXhNTTzymHH5dszGPJpKHDCPrI LogdeZvkjD9zew0Kmnrz5XDbDbaXQgj4y2Mh8eyEg8Lzms3fGvMyTNz9lbP4I/pbTLXBuc I70GJefSPPD1JV6e7HPxuHYfF0TPAQ6jDnd68Tza+5NQOP/qIwoQnn3H4W6pz5GJjPPkyR zn3XBBxVI8LDJpFegXjA51pngLVCmf1/lgJ0oTHd85q6KhXmnQK0+4Ux8HpJiA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1786028500; a=rsa-sha256; cv=none; b=vYYrXHf0mwNiG6w9O5IkY3fInqA7JxIjRSKvZBY8lSKDNS7Rph72lIn6tEJpzZZZKGmPO4 lVNzi+4aurhDmFzJ//6hbtffv03YE1ZprxeLLRbnNg77qk/g5osAIy87wTBjx4ygav1LwY i0m7yAiqOTMQ99Cvv7c8BzK1FMtiVdgjW3wjq/G+S/BUYw8nq8pLRaxpcGHJYioMvobJRL lGyX41RCKVjpBBYYAPlVCY7ysGrbngRHtA2ucjwhtmJahx7ri1XMOlCvy5ZH5ayisL2cqd 1sFfJH9N9DTVB+b7a8rKF1ZhzSKI/qtUyWGc7P1BIOBricEBgMxQt99hs6RQrw== 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=1786028500; 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=rBPx9JRJGSrT9/WGxsTYP2dWWtGB9s0teT8Df0Vy2uc=; b=Gjx1kUEWHhsSltT5yg6xjBZzazM6y+W5e7eQ8Yn5Fu7hgjQ1FcRpX4fK6/0E9tB25b33Jn 9VRF2g+GI32bPtX8mqcwISG4JsyhBRaa1T0CmV/LdWLizaY3ynN+f6Cos/XuSYjMs0GZp0 E8BMKtIbjodqUITMGmldcz4DN49410N+GXTY0gK/LI/MAjH6yCLFbFFgP/AYB6k83BaT+I 2Z348iLhhZHOHMuVIHHxeT49napFaTdvopgw8nvsGce52faLVupUCftkFhvGKvSkpY7RrL UsMp+gwC2+yUPjyK+aP49xlV/loMXJlxojQkpWtZtiKeHzMlu3cZZPZYUZ19Dg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hG9Tw0VSjz8kb for ; Thu, 06 Aug 2026 15:01:40 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 46d14 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 06 Aug 2026 15:01:40 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: c4ea6b08e24e - stable/15 - vm_phys: Add a sysctl to dump registered fictitious memory ranges 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: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: c4ea6b08e24e23302f0910b0ec3cf3fc1038143f Auto-Submitted: auto-generated Date: Thu, 06 Aug 2026 15:01:40 +0000 Message-Id: <6a74a1d4.46d14.4f2e01c2@gitrepo.freebsd.org> The branch stable/15 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=c4ea6b08e24e23302f0910b0ec3cf3fc1038143f commit c4ea6b08e24e23302f0910b0ec3cf3fc1038143f Author: Mark Johnston AuthorDate: 2026-07-19 00:29:40 +0000 Commit: Mark Johnston CommitDate: 2026-08-06 13:24:43 +0000 vm_phys: Add a sysctl to dump registered fictitious memory ranges I've wanted this a couple of times in the past. Save the memattr in the fictitious memory segment structure so that we can report it from the sysctl handler, and add conversion routines for each platform. Reviewed by: kib MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D58283 (cherry picked from commit a7e483ee146a93ac89357676fdb9af62ac58b4bc) --- sys/amd64/include/vm.h | 23 +++++++++++++++++++++++ sys/arm/include/vm.h | 19 +++++++++++++++++++ sys/arm64/include/vm.h | 25 +++++++++++++++++++++++-- sys/i386/include/vm.h | 23 +++++++++++++++++++++++ sys/powerpc/include/vm.h | 25 +++++++++++++++++++++++++ sys/riscv/include/vm.h | 17 +++++++++++++++++ sys/vm/vm_phys.c | 41 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 171 insertions(+), 2 deletions(-) diff --git a/sys/amd64/include/vm.h b/sys/amd64/include/vm.h index 2e156b1cb1be..7219f8650a9f 100644 --- a/sys/amd64/include/vm.h +++ b/sys/amd64/include/vm.h @@ -43,4 +43,27 @@ #define VM_MEMATTR_DEFAULT VM_MEMATTR_WRITE_BACK #define VM_MEMATTR_DEVICE VM_MEMATTR_UNCACHEABLE +#ifdef _KERNEL +static inline const char * +vm_memattr_name(vm_memattr_t memattr) +{ + switch (memattr) { + case VM_MEMATTR_UNCACHEABLE: + return ("uncacheable"); + case VM_MEMATTR_WRITE_COMBINING: + return ("write-combining"); + case VM_MEMATTR_WRITE_THROUGH: + return ("write-through"); + case VM_MEMATTR_WRITE_PROTECTED: + return ("write-protected"); + case VM_MEMATTR_WRITE_BACK: + return ("write-back"); + case VM_MEMATTR_WEAK_UNCACHEABLE: + return ("weak-uncacheable"); + default: + return (NULL); + } +} +#endif + #endif /* !_MACHINE_VM_H_ */ diff --git a/sys/arm/include/vm.h b/sys/arm/include/vm.h index 697b48689bd8..373f51adec82 100644 --- a/sys/arm/include/vm.h +++ b/sys/arm/include/vm.h @@ -41,6 +41,25 @@ /* Don't export aliased VM_MEMATTR to userland */ #define VM_MEMATTR_WRITE_COMBINING VM_MEMATTR_WRITE_THROUGH /* for DRM */ #define VM_MEMATTR_WRITE_BACK VM_MEMATTR_WB_WA /* for DRM */ + +static inline const char * +vm_memattr_name(vm_memattr_t memattr) +{ + switch (memattr) { + case VM_MEMATTR_WB_WA: + return ("write-back, write-allocate"); + case VM_MEMATTR_NOCACHE: + return ("uncacheable"); + case VM_MEMATTR_DEVICE: + return ("device"); + case VM_MEMATTR_SO: + return ("strongly-ordered"); + case VM_MEMATTR_WRITE_THROUGH: + return ("write-through"); + default: + return (NULL); + } +} #endif #endif /* !_MACHINE_VM_H_ */ diff --git a/sys/arm64/include/vm.h b/sys/arm64/include/vm.h index e03e615bb841..e8c8f52fda0a 100644 --- a/sys/arm64/include/vm.h +++ b/sys/arm64/include/vm.h @@ -38,11 +38,32 @@ #define VM_MEMATTR_DEVICE VM_MEMATTR_DEVICE_nGnRE #define VM_MEMATTR_DEVICE_NP VM_MEMATTR_DEVICE_nGnRnE +#define VM_MEMATTR_DEFAULT VM_MEMATTR_WRITE_BACK + #ifdef _KERNEL /* If defined vmstat will try to use both of these in a switch statement */ #define VM_MEMATTR_WRITE_COMBINING VM_MEMATTR_WRITE_THROUGH -#endif -#define VM_MEMATTR_DEFAULT VM_MEMATTR_WRITE_BACK +static inline const char * +vm_memattr_name(vm_memattr_t memattr) +{ + switch (memattr) { + case VM_MEMATTR_DEVICE_nGnRnE: + return ("device-nGnRnE"); + case VM_MEMATTR_UNCACHEABLE: + return ("uncacheable"); + case VM_MEMATTR_WRITE_BACK: + return ("write-back"); + case VM_MEMATTR_WRITE_THROUGH: + return ("write-through"); + case VM_MEMATTR_DEVICE_nGnRE: + return ("device-nGnRE"); + case VM_MEMATTR_TAGGED: + return ("tagged"); + default: + return (NULL); + } +} +#endif #endif /* !_MACHINE_VM_H_ */ diff --git a/sys/i386/include/vm.h b/sys/i386/include/vm.h index 2e156b1cb1be..7219f8650a9f 100644 --- a/sys/i386/include/vm.h +++ b/sys/i386/include/vm.h @@ -43,4 +43,27 @@ #define VM_MEMATTR_DEFAULT VM_MEMATTR_WRITE_BACK #define VM_MEMATTR_DEVICE VM_MEMATTR_UNCACHEABLE +#ifdef _KERNEL +static inline const char * +vm_memattr_name(vm_memattr_t memattr) +{ + switch (memattr) { + case VM_MEMATTR_UNCACHEABLE: + return ("uncacheable"); + case VM_MEMATTR_WRITE_COMBINING: + return ("write-combining"); + case VM_MEMATTR_WRITE_THROUGH: + return ("write-through"); + case VM_MEMATTR_WRITE_PROTECTED: + return ("write-protected"); + case VM_MEMATTR_WRITE_BACK: + return ("write-back"); + case VM_MEMATTR_WEAK_UNCACHEABLE: + return ("weak-uncacheable"); + default: + return (NULL); + } +} +#endif + #endif /* !_MACHINE_VM_H_ */ diff --git a/sys/powerpc/include/vm.h b/sys/powerpc/include/vm.h index 5c99cda51257..87d0faf44f2e 100644 --- a/sys/powerpc/include/vm.h +++ b/sys/powerpc/include/vm.h @@ -42,4 +42,29 @@ #define VM_MEMATTR_DEVICE VM_MEMATTR_DEFAULT +#ifdef _KERNEL +static inline const char * +vm_memattr_name(vm_memattr_t memattr) +{ + switch (memattr) { + case VM_MEMATTR_DEFAULT: + return ("default"); + case VM_MEMATTR_UNCACHEABLE: + return ("uncacheable"); + case VM_MEMATTR_CACHEABLE: + return ("cacheable"); + case VM_MEMATTR_WRITE_COMBINING: + return ("write-combining"); + case VM_MEMATTR_WRITE_BACK: + return ("write-back"); + case VM_MEMATTR_WRITE_THROUGH: + return ("write-through"); + case VM_MEMATTR_PREFETCHABLE: + return ("prefetchable"); + default: + return (NULL); + } +} +#endif + #endif /* !_MACHINE_VM_H_ */ diff --git a/sys/riscv/include/vm.h b/sys/riscv/include/vm.h index b6c0a7725124..66211fcc2580 100644 --- a/sys/riscv/include/vm.h +++ b/sys/riscv/include/vm.h @@ -38,4 +38,21 @@ #define VM_MEMATTR_LAST VM_MEMATTR_DEVICE #define VM_MEMATTR_TOTAL (VM_MEMATTR_LAST + 1) +#ifdef _KERNEL +static inline const char * +vm_memattr_name(vm_memattr_t memattr) +{ + switch (memattr) { + case VM_MEMATTR_PMA: + return ("write-back"); + case VM_MEMATTR_UNCACHEABLE: + return ("uncacheable"); + case VM_MEMATTR_DEVICE: + return ("device"); + default: + return (NULL); + } +} +#endif + #endif /* !_MACHINE_VM_H_ */ diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c index ba16ae551093..0aa38e0da0f0 100644 --- a/sys/vm/vm_phys.c +++ b/sys/vm/vm_phys.c @@ -108,6 +108,7 @@ struct vm_phys_fictitious_seg { vm_paddr_t start; vm_paddr_t end; vm_page_t first_page; + vm_memattr_t memattr; }; RB_GENERATE_STATIC(fict_tree, vm_phys_fictitious_seg, node, @@ -172,6 +173,12 @@ SYSCTL_OID(_vm, OID_AUTO, phys_segs, sysctl_vm_phys_segs, "A", "Phys Seg Info"); +static int sysctl_vm_phys_fictitious_segs(SYSCTL_HANDLER_ARGS); +SYSCTL_OID(_vm, OID_AUTO, phys_fictitious_segs, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, + sysctl_vm_phys_fictitious_segs, "A", + "Fictitious Phys Seg Info"); + #ifdef NUMA static int sysctl_vm_phys_locality(SYSCTL_HANDLER_ARGS); SYSCTL_OID(_vm, OID_AUTO, phys_locality, @@ -341,6 +348,39 @@ sysctl_vm_phys_segs(SYSCTL_HANDLER_ARGS) return (error); } +static int +sysctl_vm_phys_fictitious_segs(SYSCTL_HANDLER_ARGS) +{ + struct sbuf sbuf; + struct vm_phys_fictitious_seg *seg; + int error; + + error = sysctl_wire_old_buffer(req, 0); + if (error != 0) + return (error); + sbuf_new_for_sysctl(&sbuf, NULL, 128, req); + rw_rlock(&vm_phys_fictitious_reg_lock); + RB_FOREACH(seg, fict_tree, &vm_phys_fictitious_tree) { + const char *name; + char buf[8]; + + sbuf_printf(&sbuf, "\nstart: %#jx\n", + (uintmax_t)seg->start); + sbuf_printf(&sbuf, "end: %#jx\n", + (uintmax_t)seg->end); + name = vm_memattr_name(seg->memattr); + if (name == NULL) { + (void)snprintf(buf, sizeof(buf), "0x%02x", seg->memattr); + name = buf; + } + sbuf_printf(&sbuf, "attr: %s\n", name); + } + rw_runlock(&vm_phys_fictitious_reg_lock); + error = sbuf_finish(&sbuf); + sbuf_delete(&sbuf); + return (error); +} + /* * Return affinity, or -1 if there's no affinity information. */ @@ -1155,6 +1195,7 @@ alloc: seg->start = start; seg->end = end; seg->first_page = fp; + seg->memattr = memattr; rw_wlock(&vm_phys_fictitious_reg_lock); RB_INSERT(fict_tree, &vm_phys_fictitious_tree, seg);