The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=d8bfcacd12aba73188c44a157c707908e275825d

commit d8bfcacd12aba73188c44a157c707908e275825d
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2025-11-21 08:34:51 +0000
Commit:     Konstantin Belousov <[email protected]>
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);

Reply via email to