Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Dec 2008 17:32:52 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r186397 - head/sys/security/mac
Message-ID:  <200812221732.mBMHWqRD066914@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Mon Dec 22 17:32:52 2008
New Revision: 186397
URL: http://svn.freebsd.org/changeset/base/186397

Log:
  Make preparations for resurrecting shared/read locks on vm maps:
  
  mac_proc_vm_revoke_recurse() requests a read lock on the vm map at the start
  but does not handle failure by vm_map_lock_upgrade() when it seeks to modify
  the vm map.  At present, this works because all lock request on a vm map are
  implemented as exclusive locks.  Thus, vm_map_lock_upgrade() is a no-op that
  always reports success.  However, that is about to change, and
  proc_vm_revoke_recurse() will require substantial modifications to handle
  vm_map_lock_upgrade() failures.  For the time being, I am changing
  mac_proc_vm_revoke_recurse() to request a write lock on the vm map at the
  start.
  
  Approved by:	rwatson
  MFC after:	3 months

Modified:
  head/sys/security/mac/mac_process.c

Modified: head/sys/security/mac/mac_process.c
==============================================================================
--- head/sys/security/mac/mac_process.c	Mon Dec 22 16:58:47 2008	(r186396)
+++ head/sys/security/mac/mac_process.c	Mon Dec 22 17:32:52 2008	(r186397)
@@ -260,7 +260,7 @@ mac_proc_vm_revoke_recurse(struct thread
 	if (!mac_mmap_revocation)
 		return;
 
-	vm_map_lock_read(map);
+	vm_map_lock(map);
 	for (vme = map->header.next; vme != &map->header; vme = vme->next) {
 		if (vme->eflags & MAP_ENTRY_IS_SUB_MAP) {
 			mac_proc_vm_revoke_recurse(td, cred,
@@ -315,7 +315,6 @@ mac_proc_vm_revoke_recurse(struct thread
 		    prot2str(revokeperms), (u_long)vme->start,
 		    (long)(vme->end - vme->start),
 		    prot2str(vme->max_protection), prot2str(vme->protection));
-		vm_map_lock_upgrade(map);
 		/*
 		 * This is the really simple case: if a map has more
 		 * max_protection than is allowed, but it's not being
@@ -369,10 +368,9 @@ mac_proc_vm_revoke_recurse(struct thread
 			    vme->protection & ~revokeperms);
 			vm_map_simplify_entry(map, vme);
 		}
-		vm_map_lock_downgrade(map);
 		VFS_UNLOCK_GIANT(vfslocked);
 	}
-	vm_map_unlock_read(map);
+	vm_map_unlock(map);
 }
 
 int



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812221732.mBMHWqRD066914>