PERFORCE change 104663 for review
Chris Jones
cdjones at FreeBSD.org
Mon Aug 21 08:35:14 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=104663
Change 104663 by cdjones at cdjones-impulse on 2006/08/21 08:35:04
Mission accomplished: pager thread now stops when it's appropriate.
Affected files ...
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_jail.c#24 edit
.. //depot/projects/soc2006/cdjones_jail/src/sys/sys/jail.h#20 edit
Differences ...
==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_jail.c#24 (text+ko) ====
@@ -156,17 +156,21 @@
break;
if (jail_limit_memory && pr->pr_mem_limit) {
- /* TODO: consider whether it might be better to start
+ /*
+ * TODO: consider whether it might be better to start
* pushing back when we approach the limit, rather than
* when we hit it.
+ *
*/
- limit = (long) prison_memory_limit(pr);
- usage = (long) prison_memory(pr);
+ limit = prison_memory_limit(pr);
+ usage = prison_memory(pr);
- /* The logic from vm_daemon() really needs to go here.
- * Problem: we want to push things below their rlimits.
+ /*
+ * The logic from vm_daemon() really needs to go here.
+ * Problem: we want to push things below their rlimits,
+ * and vm_daemon doesn't do that. It'd be better to
+ * refactor vm_daemon to fit, but this'll do for now.
*
- * TODO: refactor vm_daemon to optionally act on specific jails?
*/
printf("jpager/%d: memory %ld / %ld bytes\n",
@@ -213,20 +217,23 @@
*/
/* TODO: this arbitrarily reduces each process's space by
- * 5% (until it's completely swapped out) while
+ * 6.25% (until it's completely swapped out) while
* we're under memory pressure. A better way would be
* to either hit large processes first, or to hit the
* least-active processes first, or go proportionally,
* or ....
*/
- newsize = cursize = (long) vmspace_resident_count(p->p_vmspace);
- newsize -= newsize / 20;
+ newsize = cursize = vmspace_resident_count(p->p_vmspace);
+ newsize -= newsize / 16;
if (cursize < 0)
newsize = 0;
PROC_UNLOCK(p);
printf("jpager/%d: squeezing process %d from %ld to %ld\n",
pr_id, p->p_pid, cursize, newsize);
vm_pageout_map_deactivate_pages(&p->p_vmspace->vm_map, newsize);
+ printf("jpager/%d: squeezed process %d from %ld to %ld (wanted %ld)\n",
+ pr_id, p->p_pid, cursize,
+ vmspace_resident_count(p->p_vmspace), newsize);
} /* end LIST_FOREACH procs */
sx_sunlock(&allproc_lock);
}
@@ -552,32 +559,31 @@
}
/* Given credential, return memory usage in bytes. */
-vm_pindex_t
+long
prison_memory(struct prison *pr)
{
struct proc *p;
- u_int mem_used = 0;
+ long mem_used = 0;
- /* TODO: cut this to search only procs in given jail. */
+ /*
+ * TODO: this is a really bad way of doing the
+ * search, as we end up going across all processes
+ * for each jail. It'd be more efficient to just do
+ * this once in a period and update the relevant jail.
+ *
+ */
FOREACH_PROC_IN_SYSTEM(p) {
if (!jailed(p->p_ucred) ||
- (pr != p->p_ucred->cr_prison)) {
+ (pr != p->p_ucred->cr_prison))
continue;
- }
-
- /* Get memory usage (see vm/vm_map.h). */
- /* TODO maybe use vm_swrss? */
- mem_used += (p->p_vmspace)->vm_tsize; /* text size (pages) */
- mem_used += (p->p_vmspace)->vm_dsize; /* data size (pages) */
- mem_used += (p->p_vmspace)->vm_ssize; /* stack size (pages) */
+ mem_used += vmspace_resident_count(p->p_vmspace);
}
-
- mem_used *= PAGE_SIZE;
+ mem_used *= PAGE_SIZE;
return mem_used;
}
/* Given credential, return permitted memory usage in bytes. */
-vm_pindex_t
+long
prison_memory_limit(struct prison *pr)
{
vm_pindex_t memlimit;
==== //depot/projects/soc2006/cdjones_jail/src/sys/sys/jail.h#20 (text+ko) ====
@@ -134,8 +134,8 @@
void prison_hold(struct prison *pr);
int prison_if(struct ucred *cred, struct sockaddr *sa);
int prison_ip(struct ucred *cred, int flag, u_int32_t *ip);
-vm_pindex_t prison_memory(struct prison *pr);
-vm_pindex_t prison_memory_limit(struct prison *pr);
+long prison_memory(struct prison *pr);
+long prison_memory_limit(struct prison *pr);
void prison_remote_ip(struct ucred *cred, int flags, u_int32_t *ip);
#endif /* _KERNEL */
More information about the p4-projects
mailing list