Date: Sun, 19 Jul 2026 11:48:09 +0200 From: A FreeBSD User <freebsd@walstatt-de.de> To: Mark Johnston <markj@FreeBSD.org> Cc: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: Re: git: a7e483ee146a - main - vm_phys: Add a sysctl to dump registered fictitious memory ranges Message-ID: <20260719114836.58a7f518@thor.sb211.local> In-Reply-To: <6a5c1c3f.3b403.6ca6c3fe@gitrepo.freebsd.org>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --] 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 [-- Attachment #2 --] -----BEGIN PGP SIGNATURE----- iJEEARYKADkWIQRQheDybVktG5eW/1Kxzvs8OqokrwUCalyddBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDMACgkQsc77PDqqJK+P9wD8Cq0mT01LRxnxfG2lzd3l sRWVXKjeXWpvMpUhFF3UWUwBAKQHx8U7+abvUwIuQHahyfaM233GPIjKTBtwTATO +/wI =PoPF -----END PGP SIGNATURE-----home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20260719114836.58a7f518>
