Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 Aug 2010 18:35:49 GMT
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 183084 for review
Message-ID:  <201008301835.o7UIZnBr054161@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@183084?ac=10

Change 183084 by trasz@trasz_victim on 2010/08/30 18:34:59

	Clean up stuff and improve distinction between HRL and CONTAINERS - the latter
	is not related to lim_cur() removal.

Affected files ...

.. //depot/projects/soc2009/trasz_limits/sys/compat/linux/linux_misc.c#15 edit
.. //depot/projects/soc2009/trasz_limits/sys/compat/svr4/imgact_svr4.c#9 edit
.. //depot/projects/soc2009/trasz_limits/sys/conf/options#23 edit
.. //depot/projects/soc2009/trasz_limits/sys/fs/fdescfs/fdesc_vfsops.c#4 edit
.. //depot/projects/soc2009/trasz_limits/sys/i386/linux/imgact_linux.c#8 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/imgact_aout.c#9 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/imgact_elf.c#16 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/imgact_gzip.c#7 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/init_main.c#28 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#29 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#93 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#20 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_prot.c#29 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#47 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/vfs_vnops.c#19 edit
.. //depot/projects/soc2009/trasz_limits/sys/vm/vm_glue.c#8 edit
.. //depot/projects/soc2009/trasz_limits/sys/vm/vm_mmap.c#16 edit
.. //depot/projects/soc2009/trasz_limits/sys/vm/vm_pageout.c#13 edit
.. //depot/projects/soc2009/trasz_limits/sys/vm/vm_unix.c#9 edit

Differences ...

==== //depot/projects/soc2009/trasz_limits/sys/compat/linux/linux_misc.c#15 (text+ko) ====

@@ -359,6 +359,16 @@
 	 * XXX - this is not complete. it should check current usage PLUS
 	 * the resources needed by this library.
 	 */
+#ifndef HRL
+	PROC_LOCK(td->td_proc);
+	if (a_out->a_text > maxtsiz ||
+	    a_out->a_data + bss_size > lim_cur(td->td_proc, RLIMIT_DATA)) {
+		PROC_UNLOCK(td->td_proc);
+		error = ENOMEM;
+		goto cleanup;
+	}
+	PROC_UNLOCK(td->td_proc);
+#endif
 #ifdef CONTAINERS
 	if (a_out->a_text > maxtsiz) {
 		error = ENOMEM;
@@ -370,15 +380,6 @@
 		error = ENOMEM;
 		goto cleanup;
 	}
-#else
-	PROC_LOCK(td->td_proc);
-	if (a_out->a_text > maxtsiz ||
-	    a_out->a_data + bss_size > lim_cur(td->td_proc, RLIMIT_DATA)) {
-		PROC_UNLOCK(td->td_proc);
-		error = ENOMEM;
-		goto cleanup;
-	}
-	PROC_UNLOCK(td->td_proc);
 #endif /* !CONTAINERS */
 
 	/*

==== //depot/projects/soc2009/trasz_limits/sys/compat/svr4/imgact_svr4.c#9 (text+ko) ====

@@ -107,6 +107,15 @@
     /*
      * text/data/bss must not exceed limits
      */
+#ifndef HRL
+    PROC_LOCK(imgp->proc);
+    if (a_out->a_text > maxtsiz ||
+	a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA)) {
+    	PROC_UNLOCK(imgp->proc);
+	return (ENOMEM);
+    }
+    PROC_UNLOCK(imgp->proc);
+#endif /* !HRL */
 #ifdef CONTAINERS
     if (a_out->a_text > maxtsiz)
         return (ENOMEM);
@@ -114,15 +123,7 @@
         a_out->a_data + bss_size);
     if (error)
         return (ENOMEM);
-#else
-    PROC_LOCK(imgp->proc);
-    if (a_out->a_text > maxtsiz ||
-	a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA)) {
-    	PROC_UNLOCK(imgp->proc);
-	return (ENOMEM);
-    }
-    PROC_UNLOCK(imgp->proc);
-#endif /* !CONTAINERS */
+#endif
 
     VOP_UNLOCK(imgp->vp, 0);
 

==== //depot/projects/soc2009/trasz_limits/sys/conf/options#23 (text+ko) ====

@@ -859,4 +859,4 @@
 CONTAINERS		opt_global.h
 
 # Hierarchical Resource Limits
-HRL			opt_hrl.h
+HRL			opt_global.h

==== //depot/projects/soc2009/trasz_limits/sys/fs/fdescfs/fdesc_vfsops.c#4 (text+ko) ====

@@ -38,6 +38,7 @@
  * /dev/fd Filesystem
  */
 
+#include <sys/container.h>
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/filedesc.h>
@@ -186,6 +187,9 @@
 	int i;
 	int last;
 	int freefd;
+#ifdef CONTAINERS
+	uint64_t limit;
+#endif
 
 	td = curthread;
 
@@ -195,12 +199,22 @@
 	 * limit is ever reduced below the current number
 	 * of open files... ]
 	 */
+#ifndef HRL
 	PROC_LOCK(td->td_proc);
 	lim = lim_cur(td->td_proc, RLIMIT_NOFILE);
 	PROC_UNLOCK(td->td_proc);
-	/* XXX: Check HRL? */
+#endif
 	fdp = td->td_proc->p_fd;
 	FILEDESC_SLOCK(fdp);
+#ifdef CONTAINERS
+	limit = rusage_get_limit(td->td_proc, RUSAGE_NOFILE);
+#ifdef HRL
+	lim = limit;
+#else
+	if (lim > limit)
+		lim = limit;
+#endif
+#endif
 	last = min(fdp->fd_nfiles, lim);
 	freefd = 0;
 	for (i = fdp->fd_freefile; i < last; i++)

==== //depot/projects/soc2009/trasz_limits/sys/i386/linux/imgact_linux.c#8 (text+ko) ====

@@ -105,6 +105,15 @@
     /*
      * text/data/bss must not exceed limits
      */
+#ifndef HRL
+    PROC_LOCK(imgp->proc);
+    if (a_out->a_text > maxtsiz ||
+	a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA)) {
+	PROC_UNLOCK(imgp->proc);
+	return (ENOMEM);
+    }
+    PROC_UNLOCK(imgp->proc);
+#endif /* !HRL */
 #ifdef CONTAINERS
     if (a_out->a_text > maxtsiz)
 	return (ENOMEM);
@@ -112,15 +121,7 @@
 	a_out->a_data + bss_size);
     if (error)
 	return (ENOMEM);
-#else
-    PROC_LOCK(imgp->proc);
-    if (a_out->a_text > maxtsiz ||
-	a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA)) {
-	PROC_UNLOCK(imgp->proc);
-	return (ENOMEM);
-    }
-    PROC_UNLOCK(imgp->proc);
-#endif /* !CONTAINERS */
+#endif /* CONTAINERS */
 
     VOP_UNLOCK(imgp->vp, 0);
 

==== //depot/projects/soc2009/trasz_limits/sys/kern/imgact_aout.c#9 (text+ko) ====

@@ -185,15 +185,7 @@
 	/*
 	 * text/data/bss must not exceed limits
 	 */
-#ifdef CONTAINERS
-	if (/* text can't exceed maximum text size */
-	    a_out->a_text > maxtsiz)
-		return (ENOMEM);
-	error = rusage_set(imgp->proc, RUSAGE_DATA,
-	    a_out->a_data + bss_size);
-	if (error)
-		return (ENOMEM);
-#else
+#ifndef HRL
 	PROC_LOCK(imgp->proc);
 	if (/* text can't exceed maximum text size */
 	    a_out->a_text > maxtsiz ||
@@ -204,7 +196,16 @@
 			return (ENOMEM);
 	}
 	PROC_UNLOCK(imgp->proc);
-#endif
+#endif /* !HRL */
+#ifdef CONTAINERS
+	if (/* text can't exceed maximum text size */
+	    a_out->a_text > maxtsiz)
+		return (ENOMEM);
+	error = rusage_set(imgp->proc, RUSAGE_DATA,
+	    a_out->a_data + bss_size);
+	if (error)
+		return (ENOMEM);
+#endif /* CONTAINERS */
 
 	/*
 	 * Avoid a possible deadlock if the current address space is destroyed

==== //depot/projects/soc2009/trasz_limits/sys/kern/imgact_elf.c#16 (text+ko) ====

@@ -874,6 +874,17 @@
 	 * limits after loading the segments since we do
 	 * not actually fault in all the segments pages.
 	 */
+#ifndef HRL
+	PROC_LOCK(imgp->proc);
+	if (data_size > lim_cur(imgp->proc, RLIMIT_DATA) ||
+	    text_size > maxtsiz ||
+	    total_size > lim_cur(imgp->proc, RLIMIT_VMEM)) {
+		PROC_UNLOCK(imgp->proc);
+		return (ENOMEM);
+	}
+#else
+	PROC_LOCK(imgp->proc);
+#endif /* !HRL */
 #ifdef CONTAINERS
 	if (text_size > maxtsiz)
 		return (ENOMEM);
@@ -885,17 +896,8 @@
 	    total_size);
 	if (error)
 		return (ENOMEM);
+#endif /* CONTAINERS */
 
-	PROC_LOCK(imgp->proc);
-#else
-	PROC_LOCK(imgp->proc);
-	if (data_size > lim_cur(imgp->proc, RLIMIT_DATA) ||
-	    text_size > maxtsiz ||
-	    total_size > lim_cur(imgp->proc, RLIMIT_VMEM)) {
-		PROC_UNLOCK(imgp->proc);
-		return (ENOMEM);
-	}
-#endif /* !CONTAINERS */
 	vmspace->vm_tsize = text_size >> PAGE_SHIFT;
 	vmspace->vm_taddr = (caddr_t)(uintptr_t)text_addr;
 	vmspace->vm_dsize = data_size >> PAGE_SHIFT;
@@ -1120,7 +1122,7 @@
 		error = EFAULT;
 		goto done;
 	}
-#endif
+#endif /* CONTAINERS */
 	if (hdrsize + seginfo.size >= limit) {
 		error = EFAULT;
 		goto done;

==== //depot/projects/soc2009/trasz_limits/sys/kern/imgact_gzip.c#7 (text+ko) ====

@@ -210,17 +210,7 @@
 	/*
 	 * text/data/bss must not exceed limits
 	 */
-#ifdef CONTAINERS
-	if (			/* text can't exceed maximum text size */
-	    gz->a_out.a_text > maxtsiz) {
-		gz->where = __LINE__;
-		return (ENOMEM);
-	}
-	error = rusage_set(gz->ip->proc, RUSAGE_DATA,
-	    gz->a_out.a_data + gz->bss_size);
-	if (error)
-		return (ENOMEM);
-#else
+#ifndef HRL
 	PROC_LOCK(gz->ip->proc);
 	if (			/* text can't exceed maximum text size */
 	    gz->a_out.a_text > maxtsiz ||
@@ -233,7 +223,18 @@
 		return (ENOMEM);
 	}
 	PROC_UNLOCK(gz->ip->proc);
-#endif /* !CONTAINERS */
+#endif /* !HRL */
+#ifdef CONTAINERS
+	if (			/* text can't exceed maximum text size */
+	    gz->a_out.a_text > maxtsiz) {
+		gz->where = __LINE__;
+		return (ENOMEM);
+	}
+	error = rusage_set(gz->ip->proc, RUSAGE_DATA,
+	    gz->a_out.a_data + gz->bss_size);
+	if (error)
+		return (ENOMEM);
+#endif /* CONTAINERS */
 	/* Find out how far we should go */
 	gz->file_end = gz->file_offset + gz->a_out.a_text + gz->a_out.a_data;
 

==== //depot/projects/soc2009/trasz_limits/sys/kern/init_main.c#28 (text+ko) ====

@@ -45,7 +45,6 @@
 __FBSDID("$FreeBSD: src/sys/kern/init_main.c,v 1.314 2010/08/09 14:48:31 gavin Exp $");
 
 #include "opt_ddb.h"
-#include "opt_hrl.h"
 #include "opt_init_path.h"
 
 #include <sys/param.h>

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#29 (text+ko) ====

@@ -32,7 +32,6 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include "opt_hrl.h"
 #include "opt_kdtrace.h"
 
 #include <sys/container.h>

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#93 (text+ko) ====

@@ -27,8 +27,6 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include "opt_hrl.h"
-
 #include <sys/container.h>
 #include <sys/hrl.h>
 #include <sys/param.h>

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#20 (text+ko) ====

@@ -40,8 +40,6 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include "opt_hrl.h"
-
 #include <sys/param.h>
 #include <sys/eventhandler.h>
 #include <sys/kernel.h>

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_prot.c#29 (text+ko) ====

@@ -45,7 +45,6 @@
 __FBSDID("$FreeBSD: src/sys/kern/kern_prot.c,v 1.230 2010/07/18 20:57:53 trasz Exp $");
 
 #include "opt_compat.h"
-#include "opt_hrl.h"
 #include "opt_inet.h"
 #include "opt_inet6.h"
 

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#47 (text+ko) ====

@@ -38,7 +38,6 @@
 __FBSDID("$FreeBSD: src/sys/kern/kern_resource.c,v 1.202 2010/07/18 20:57:53 trasz Exp $");
 
 #include "opt_compat.h"
-#include "opt_hrl.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -655,7 +654,7 @@
 }
 #endif
 
-#ifndef CONTAINERS
+#ifndef HRL
 static void
 lim_cb(void *arg)
 {
@@ -689,7 +688,7 @@
 	if ((p->p_flag & P_WEXIT) == 0)
 		callout_reset(&p->p_limco, hz, lim_cb, p);
 }
-#endif /* !CONTAINERS */
+#endif /* !HRL */
 
 #ifdef HRL
 static void
@@ -846,7 +845,7 @@
 
 	switch (which) {
 
-#ifndef CONTAINERS
+#ifndef HRL
 	case RLIMIT_CPU:
 		if (limp->rlim_cur != RLIM_INFINITY &&
 		    p->p_cpulimit == RLIM_INFINITY)
@@ -1262,7 +1261,7 @@
 {
 	p2->p_limit = lim_hold(p1->p_limit);
 	callout_init_mtx(&p2->p_limco, &p2->p_mtx, 0);
-#ifndef CONTAINERS
+#ifndef HRL
 	if (p1->p_cpulimit != RLIM_INFINITY)
 		callout_reset(&p2->p_limco, hz, lim_cb, p2);
 #endif

==== //depot/projects/soc2009/trasz_limits/sys/kern/vfs_vnops.c#19 (text+ko) ====

@@ -1347,11 +1347,7 @@
 
 	if (vp->v_type != VREG || td == NULL)
 		return (0);
-#ifdef CONTAINERS
-	if (rusage_set(td->td_proc, RUSAGE_FSIZE,
-	    (uoff_t)uio->uio_offset + uio->uio_resid))
-		return (EFBIG);
-#else
+#ifndef HRL
 	PROC_LOCK(td->td_proc);
 	if ((uoff_t)uio->uio_offset + uio->uio_resid >
 	    lim_cur(td->td_proc, RLIMIT_FSIZE)) {
@@ -1361,5 +1357,11 @@
 	}
 	PROC_UNLOCK(td->td_proc);
 #endif
+#ifdef CONTAINERS
+	if (rusage_set(td->td_proc, RUSAGE_FSIZE,
+	    (uoff_t)uio->uio_offset + uio->uio_resid))
+		return (EFBIG);
+#endif
+
 	return (0);
 }

==== //depot/projects/soc2009/trasz_limits/sys/vm/vm_glue.c#8 (text+ko) ====

@@ -200,10 +200,12 @@
 	PROC_LOCK(curproc);
 	nsize = ptoa(npages +
 	    pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map)));
+#ifndef HRL
 	if (nsize > lim_cur(curproc, RLIMIT_MEMLOCK)) {
 		PROC_UNLOCK(curproc);
 		return (ENOMEM);
 	}
+#endif
 	PROC_UNLOCK(curproc);
 #ifdef CONTAINERS
 	if (rusage_set(curproc, RUSAGE_MEMLOCK, nsize))

==== //depot/projects/soc2009/trasz_limits/sys/vm/vm_mmap.c#16 (text+ko) ====

@@ -1043,10 +1043,12 @@
 	PROC_LOCK(proc);
 	nsize = ptoa(npages +
 	    pmap_wired_count(vm_map_pmap(&proc->p_vmspace->vm_map)));
+#ifndef HRL
 	if (nsize > lim_cur(proc, RLIMIT_MEMLOCK)) {
 		PROC_UNLOCK(proc);
 		return (ENOMEM);
 	}
+#endif
 	PROC_UNLOCK(proc);
 	if (npages + cnt.v_wire_count > vm_page_max_wired)
 		return (EAGAIN);
@@ -1432,6 +1434,7 @@
 
 	size = round_page(size);
 
+#ifndef HRL
 	PROC_LOCK(td->td_proc);
 	if (td->td_proc->p_vmspace->vm_map.size + size >
 	    lim_cur(td->td_proc, RLIMIT_VMEM)) {
@@ -1439,6 +1442,12 @@
 		return(ENOMEM);
 	}
 	PROC_UNLOCK(td->td_proc);
+#endif
+#ifdef CONTAINERS
+	if (rusage_set(td->td_proc, RUSAGE_VMEM,
+	    td->td_proc->p_vmspace->vm_map.size + size))
+		return (ENOMEM);
+#endif
 
 	/*
 	 * We currently can only deal with page aligned file offsets.

==== //depot/projects/soc2009/trasz_limits/sys/vm/vm_pageout.c#13 (text+ko) ====

@@ -1704,7 +1704,10 @@
 			maxsize = OFF_TO_IDX(rusage_get_limit(p, RUSAGE_RSS));
 			if (size > maxsize) {
 				vm_pageout_map_deactivate_pages(
-				    &vm->vm_map, limit);
+				    &vm->vm_map, maxsize);
+				/* Update RSS usage after paging out. */
+				size = vmspace_resident_count(vm);
+				rusage_set(p, RUSAGE_RSS, IDX_TO_OFF(size));
 			}
 #endif
 			vmspace_free(vm);

==== //depot/projects/soc2009/trasz_limits/sys/vm/vm_unix.c#9 (text+ko) ====

@@ -74,19 +74,20 @@
 {
 	struct vmspace *vm = td->td_proc->p_vmspace;
 	vm_offset_t new, old, base;
-#ifndef CONTAINERS
+#ifndef HRL
 	rlim_t datalim, vmemlim;
 #endif
 	int rv;
 	int error = 0;
 	boolean_t do_map_wirefuture;
 
-#ifndef CONTAINERS
+#ifndef HRL
 	PROC_LOCK(td->td_proc);
 	datalim = lim_cur(td->td_proc, RLIMIT_DATA);
 	vmemlim = lim_cur(td->td_proc, RLIMIT_VMEM);
 	PROC_UNLOCK(td->td_proc);
 #endif
+
 	do_map_wirefuture = FALSE;
 	new = round_page((vm_offset_t)uap->nsize);
 	vm_map_lock(&vm->vm_map);
@@ -94,14 +95,7 @@
 	base = round_page((vm_offset_t) vm->vm_daddr);
 	old = base + ctob(vm->vm_dsize);
 	if (new > base) {
-#ifdef CONTAINERS
-		error = rusage_set(td->td_proc, RUSAGE_DATA,
-		    new - base);
-		if (error) {
-			error = ENOMEM;
-			goto done;
-		}
-#else
+#ifndef HRL
 		/*
 		 * Check the resource limit, but allow a process to reduce
 		 * its usage, even if it remains over the limit.
@@ -110,7 +104,16 @@
 			error = ENOMEM;
 			goto done;
 		}
-#endif /* !CONTAINERS */
+#endif /* !HRL */
+#ifdef CONTAINERS
+		error = rusage_set(td->td_proc, RUSAGE_DATA,
+		    new - base);
+		if (error) {
+			error = ENOMEM;
+			goto done;
+		}
+#endif
+
 		if (new > vm_map_max(&vm->vm_map)) {
 			error = ENOMEM;
 			goto done;
@@ -125,6 +128,12 @@
 		goto done;
 	}
 	if (new > old) {
+#ifndef HRL
+		if (vm->vm_map.size + (new - old) > vmemlim) {
+			error = ENOMEM;
+			goto done;
+		}
+#endif /* !HRL */
 #ifdef CONTAINERS
 		error = rusage_set(td->td_proc, RUSAGE_VMEM,
 		    vm->vm_map.size + (new - old));
@@ -132,12 +141,7 @@
 			error = ENOMEM;
 			goto done;
 		}
-#else
-		if (vm->vm_map.size + (new - old) > vmemlim) {
-			error = ENOMEM;
-			goto done;
-		}
-#endif /* !CONTAINERS */
+#endif
 		rv = vm_map_insert(&vm->vm_map, NULL, 0, old, new,
 		    VM_PROT_RW, VM_PROT_ALL, 0);
 		if (rv != KERN_SUCCESS) {



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