svn commit: r271641 - in projects/sendfile: lib/libc/sys sys/vm
Gleb Smirnoff
glebius at FreeBSD.org
Mon Sep 15 18:46:03 UTC 2014
Author: glebius
Date: Mon Sep 15 18:46:02 2014
New Revision: 271641
URL: http://svnweb.freebsd.org/changeset/base/271641
Log:
Merge head r258543 through r271639.
Modified:
projects/sendfile/lib/libc/sys/mmap.2
projects/sendfile/sys/vm/vm_mmap.c
projects/sendfile/sys/vm/vnode_pager.c
Directory Properties:
projects/sendfile/ (props changed)
projects/sendfile/lib/libc/ (props changed)
projects/sendfile/sys/ (props changed)
Modified: projects/sendfile/lib/libc/sys/mmap.2
==============================================================================
--- projects/sendfile/lib/libc/sys/mmap.2 Mon Sep 15 18:43:57 2014 (r271640)
+++ projects/sendfile/lib/libc/sys/mmap.2 Mon Sep 15 18:46:02 2014 (r271641)
@@ -28,7 +28,7 @@
.\" @(#)mmap.2 8.4 (Berkeley) 5/11/95
.\" $FreeBSD$
.\"
-.Dd June 19, 2014
+.Dd September 15, 2014
.Dt MMAP 2
.Os
.Sh NAME
@@ -372,6 +372,29 @@ The
argument
is not a valid open file descriptor.
.It Bq Er EINVAL
+An invalid value was passed in the
+.Fa prot
+argument.
+.It Bq Er EINVAL
+An undefined option was set in the
+.Fa flags
+argument.
+.It Bq Er EINVAL
+Both
+.Dv MAP_PRIVATE
+and
+.Dv MAP_SHARED
+were specified.
+.It Bq Er EINVAL
+None of
+.Dv MAP_ANON ,
+.Dv MAP_PRIVATE ,
+.Dv MAP_SHARED ,
+or
+.Dv MAP_STACK
+was specified.
+At least one of these flags must be included.
+.It Bq Er EINVAL
.Dv MAP_FIXED
was specified and the
.Fa addr
Modified: projects/sendfile/sys/vm/vm_mmap.c
==============================================================================
--- projects/sendfile/sys/vm/vm_mmap.c Mon Sep 15 18:43:57 2014 (r271640)
+++ projects/sendfile/sys/vm/vm_mmap.c Mon Sep 15 18:46:02 2014 (r271641)
@@ -203,17 +203,17 @@ sys_mmap(td, uap)
struct vnode *vp;
vm_offset_t addr;
vm_size_t size, pageoff;
- vm_prot_t cap_maxprot, prot, maxprot;
+ vm_prot_t cap_maxprot, maxprot;
void *handle;
objtype_t handle_type;
- int align, error, flags;
+ int align, error, flags, prot;
off_t pos;
struct vmspace *vms = td->td_proc->p_vmspace;
cap_rights_t rights;
addr = (vm_offset_t) uap->addr;
size = uap->len;
- prot = uap->prot & VM_PROT_ALL;
+ prot = uap->prot;
flags = uap->flags;
pos = uap->pos;
@@ -244,8 +244,23 @@ sys_mmap(td, uap)
flags |= MAP_ANON;
pos = 0;
}
+ /* XXX: MAP_RENAME, MAP_NORESERVE */
+ if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_HASSEMAPHORE |
+ MAP_STACK | MAP_NOSYNC | MAP_ANON | MAP_EXCL | MAP_NOCORE |
+ MAP_PREFAULT_READ |
+#ifdef MAP_32BIT
+ MAP_32BIT |
+#endif
+ MAP_ALIGNMENT_MASK)) != 0)
+ return (EINVAL);
if ((flags & (MAP_EXCL | MAP_FIXED)) == MAP_EXCL)
return (EINVAL);
+ if ((flags & (MAP_ANON | MAP_SHARED | MAP_PRIVATE)) == 0 ||
+ (flags & (MAP_SHARED | MAP_PRIVATE)) == (MAP_SHARED | MAP_PRIVATE))
+ return (EINVAL);
+ if (prot != PROT_NONE &&
+ (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)) != 0)
+ return (EINVAL);
/*
* Align the file position to a page boundary,
@@ -415,6 +430,8 @@ sys_mmap(td, uap)
map:
td->td_fpop = fp;
maxprot &= cap_maxprot;
+
+ /* This relies on VM_PROT_* matching PROT_*. */
error = vm_mmap(&vms->vm_map, &addr, size, prot, maxprot,
flags, handle_type, handle, pos);
td->td_fpop = NULL;
Modified: projects/sendfile/sys/vm/vnode_pager.c
==============================================================================
--- projects/sendfile/sys/vm/vnode_pager.c Mon Sep 15 18:43:57 2014 (r271640)
+++ projects/sendfile/sys/vm/vnode_pager.c Mon Sep 15 18:46:02 2014 (r271641)
@@ -832,24 +832,24 @@ vnode_pager_generic_getpages(struct vnod
}
/*
+ * Since the caller has busied the requested page, that page's valid
+ * field will not be changed by other threads.
+ */
+ vm_page_assert_xbusied(m[reqpage]);
+
+ /*
* If we have a completely valid page available to us, we can
* clean up and return. Otherwise we have to re-read the
* media.
*/
- VM_OBJECT_WLOCK(object);
if (m[reqpage]->valid == VM_PAGE_BITS_ALL) {
- for (i = 0; i < count; i++)
- if (i != reqpage) {
- vm_page_lock(m[i]);
- vm_page_free(m[i]);
- vm_page_unlock(m[i]);
- }
- VM_OBJECT_WUNLOCK(object);
- return VM_PAGER_OK;
+ vm_pager_free_nonreq(object, m, reqpage, count);
+ return (VM_PAGER_OK);
} else if (reqblock == -1) {
pmap_zero_page(m[reqpage]);
KASSERT(m[reqpage]->dirty == 0,
("vnode_pager_generic_getpages: page %p is dirty", m));
+ VM_OBJECT_WLOCK(object);
m[reqpage]->valid = VM_PAGE_BITS_ALL;
for (i = 0; i < count; i++)
if (i != reqpage) {
@@ -859,9 +859,11 @@ vnode_pager_generic_getpages(struct vnod
}
VM_OBJECT_WUNLOCK(object);
return (VM_PAGER_OK);
+ } else if (m[reqpage]->valid != 0) {
+ VM_OBJECT_WLOCK(object);
+ m[reqpage]->valid = 0;
+ VM_OBJECT_WUNLOCK(object);
}
- m[reqpage]->valid = 0;
- VM_OBJECT_WUNLOCK(object);
/*
* here on direct device I/O
More information about the svn-src-projects
mailing list