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