Re: git: a7e483ee146a - main - vm_phys: Add a sysctl to dump registered fictitious memory ranges
Date: Sun, 19 Jul 2026 09:48:09 UTC
Am Tage des Herren Sun, 19 Jul 2026 00:37:19 +0000
Mark Johnston <markj@FreeBSD.org> schrieb:
> The branch main has been updated by markj:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=a7e483ee146a93ac89357676fdb9af62ac58b4bc
>
> commit a7e483ee146a93ac89357676fdb9af62ac58b4bc
> Author: Mark Johnston <markj@FreeBSD.org>
> AuthorDate: 2026-07-19 00:29:40 +0000
> Commit: Mark Johnston <markj@FreeBSD.org>
> CommitDate: 2026-07-19 00:29:40 +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
> ---
> 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 4d9f2860f654..87a1839b7dac 100644
> --- a/sys/arm64/include/vm.h
> +++ b/sys/arm64/include/vm.h
> @@ -39,11 +39,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 1737020436c6..975754264fee 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);
>
After upgrading sources with this commit, both GPU ports
graphics/drm-66-kmod
graphics/drm-612-kmod
fail with undeclared indentifier NULL as shown below:
[...]
--- drm_client.o ---
In file included from
/usr/obj/usr/src/amd64.amd64/sys/THOR/usr/ports/graphics/drm-612-kmod/work/drm-kmod-drm_v6.12.85_2/drivers/gpu/drm/drm_client.c:6:
In file included from /usr/src/sys/compat/linuxkpi/common/include/linux/iosys-map.h:6: In file
included from /usr/src/sys/compat/linuxkpi/common/include/linux/io.h:35: ./machine/vm.h:64:11:
error: use of undeclared identifier 'NULL' 64 | return (NULL);
--
A FreeBSD user