Page MenuHomeFreeBSD

D58283.diff
No OneTemporary

D58283.diff

diff --git a/sys/amd64/include/vm.h b/sys/amd64/include/vm.h
--- 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
--- 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
--- 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
--- 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
--- 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
--- 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
--- a/sys/vm/vm_phys.c
+++ b/sys/vm/vm_phys.c
@@ -108,6 +108,7 @@
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_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 @@
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 @@
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);

File Metadata

Mime Type
text/plain
Expires
Fri, Jul 24, 10:34 PM (6 h, 49 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35395903
Default Alt Text
D58283.diff (6 KB)

Event Timeline