git: d8bfcacd12ab - main - vm_fault: add a verifier that the PG_ZERO page is indeed zeroed
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 21 Nov 2025 15:03:02 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=d8bfcacd12aba73188c44a157c707908e275825d
commit d8bfcacd12aba73188c44a157c707908e275825d
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-11-21 08:34:51 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-11-21 15:02:21 +0000
vm_fault: add a verifier that the PG_ZERO page is indeed zeroed
Compiled under INVARIANTS, activated by the same sysctl
debug.vm_check_pg_zero.
Reviewed by: markj
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D53850
---
sys/vm/vm_fault.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 2e150b368d71..3bf16778d987 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -85,6 +85,8 @@
#include <sys/refcount.h>
#include <sys/resourcevar.h>
#include <sys/rwlock.h>
+#include <sys/sched.h>
+#include <sys/sf_buf.h>
#include <sys/signalvar.h>
#include <sys/sysctl.h>
#include <sys/sysent.h>
@@ -1220,6 +1222,24 @@ vm_fault_zerofill(struct faultstate *fs)
if ((fs->m->flags & PG_ZERO) == 0) {
pmap_zero_page(fs->m);
} else {
+#ifdef INVARIANTS
+ if (vm_check_pg_zero) {
+ struct sf_buf *sf;
+ unsigned long *p;
+ int i;
+
+ sched_pin();
+ sf = sf_buf_alloc(fs->m, SFB_CPUPRIVATE);
+ p = (unsigned long *)sf_buf_kva(sf);
+ for (i = 0; i < PAGE_SIZE / sizeof(*p); i++, p++) {
+ KASSERT(*p == 0,
+ ("zerocheck failed page %p PG_ZERO %d %jx",
+ fs->m, i, (uintmax_t)*p));
+ }
+ sf_buf_free(sf);
+ sched_unpin();
+ }
+#endif
VM_CNT_INC(v_ozfod);
}
VM_CNT_INC(v_zfod);