]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Handle spurious page faults that may occur in no-fault sections of the
authorAlan Cox <alc@FreeBSD.org>
Thu, 22 Mar 2012 04:52:51 +0000 (04:52 +0000)
committerAlan Cox <alc@FreeBSD.org>
Thu, 22 Mar 2012 04:52:51 +0000 (04:52 +0000)
commit5730afc9b6405f9325dfbbf7164dd6c818191ff5
tree6628d621fc3b1f91d03b83dcd89b48528e3132fe
parentbfb2fa9f007481070ebebbb93728b8b3648a5553
Handle spurious page faults that may occur in no-fault sections of the
kernel.

When access restrictions are added to a page table entry, we flush the
corresponding virtual address mapping from the TLB.  In contrast, when
access restrictions are removed from a page table entry, we do not
flush the virtual address mapping from the TLB.  This is exactly as
recommended in AMD's documentation.  In effect, when access
restrictions are removed from a page table entry, AMD's MMUs will
transparently refresh a stale TLB entry.  In short, this saves us from
having to perform potentially costly TLB flushes.  In contrast,
Intel's MMUs are allowed to generate a spurious page fault based upon
the stale TLB entry.  Usually, such spurious page faults are handled
by vm_fault() without incident.  However, when we are executing
no-fault sections of the kernel, we are not allowed to execute
vm_fault().  This change introduces special-case handling for spurious
page faults that occur in no-fault sections of the kernel.

In collaboration with: kib
Tested by: gibbs (an earlier version)

I would also like to acknowledge Hiroki Sato's assistance in
diagnosing this problem.

MFC after: 1 week
sys/amd64/amd64/trap.c
sys/amd64/include/proc.h
sys/i386/i386/trap.c
sys/i386/include/proc.h
sys/kern/kern_sysctl.c
sys/kern/subr_uio.c
sys/sys/proc.h
sys/vm/vm_fault.c