svn commit: r253801 - stable/9/sys/vm

Jeremie Le Hen jlh at FreeBSD.org
Tue Jul 30 12:17:46 UTC 2013


Author: jlh
Date: Tue Jul 30 12:17:45 2013
New Revision: 253801
URL: http://svnweb.freebsd.org/changeset/base/253801

Log:
  MFC r253554:
    Fix a panic in the racct code when munlock(2) is called with incorrect values.
  
    The racct code in sys_munlock() assumed that the boundaries provided by
    the userland were correct as long as vm_map_unwire() returned
    successfully.  However the latter contains its own logic and sometimes
    manages to do something out of those boundaries, even if they are buggy.
    This change makes the racct code to use the accounting done by the vm
    layer, as it is done in other places such as vm_mlock().
  
    Despite fixing the panic, Alan Cox pointed that this code is still
    race-y though: two simultaneous callers will produce incorrect values.
  
    Reviewed by:  alc
  
  MFC r253556:
    Fix previous commit when option RACCT is not used.
  
  Approved by:	re (kib)

Modified:
  stable/9/sys/vm/vm_mmap.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/vm/vm_mmap.c
==============================================================================
--- stable/9/sys/vm/vm_mmap.c	Tue Jul 30 11:31:18 2013	(r253800)
+++ stable/9/sys/vm/vm_mmap.c	Tue Jul 30 12:17:45 2013	(r253801)
@@ -1221,6 +1221,9 @@ sys_munlock(td, uap)
 {
 	vm_offset_t addr, end, last, start;
 	vm_size_t size;
+#ifdef RACCT
+	vm_map_t map;
+#endif
 	int error;
 
 	error = priv_check(td, PRIV_VM_MUNLOCK);
@@ -1238,7 +1241,9 @@ sys_munlock(td, uap)
 #ifdef RACCT
 	if (error == KERN_SUCCESS) {
 		PROC_LOCK(td->td_proc);
-		racct_sub(td->td_proc, RACCT_MEMLOCK, ptoa(end - start));
+		map = &td->td_proc->p_vmspace->vm_map;
+		racct_set(td->td_proc, RACCT_MEMLOCK,
+		    ptoa(pmap_wired_count(map->pmap)));
 		PROC_UNLOCK(td->td_proc);
 	}
 #endif


More information about the svn-src-all mailing list