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
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user