diff options
author | alc <alc@FreeBSD.org> | 2005-11-08 06:33:21 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2005-11-08 06:33:21 +0000 |
commit | bf6d4253ee61e7325d3cd61086924ae203e9726c (patch) | |
tree | eb984820691f13d6d86dc80231e1e26c7b4fb3e2 /sys/vm/vm_page.c | |
parent | 72a2e458c66f454b4f2427e4ba858a17f9e61f23 (diff) | |
download | FreeBSD-src-bf6d4253ee61e7325d3cd61086924ae203e9726c.zip FreeBSD-src-bf6d4253ee61e7325d3cd61086924ae203e9726c.tar.gz |
If a physical page is mapped by two or more virtual addresses, transmitted
by the zero-copy sockets method, and written to before the transmission
completes, we need to destroy all of the existing mappings to the page,
not just the one that we fault on. Otherwise, the mappings will no longer
be to the same page and changes made through one of the mappings will not
be visible through the others.
Observed by: tegge
Diffstat (limited to 'sys/vm/vm_page.c')
-rw-r--r-- | sys/vm/vm_page.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 94943ec..9cc8642 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -1651,6 +1651,7 @@ vm_page_cowfault(vm_page_t m) pindex = m->pindex; retry_alloc: + pmap_remove_all(m); vm_page_remove(m); mnew = vm_page_alloc(object, pindex, VM_ALLOC_NORMAL); if (mnew == NULL) { |