Module Name: src
Committed By: pooka
Date: Mon Feb 17 19:33:05 UTC 2014
Modified Files:
src/sys/rump/librump/rumpkern: vm.c
Log Message:
reserve a small amount of memory for the pagedaemon
To generate a diff of this commit:
cvs rdiff -u -r1.146 -r1.147 src/sys/rump/librump/rumpkern/vm.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/rump/librump/rumpkern/vm.c
diff -u src/sys/rump/librump/rumpkern/vm.c:1.146 src/sys/rump/librump/rumpkern/vm.c:1.147
--- src/sys/rump/librump/rumpkern/vm.c:1.146 Sat Nov 23 22:24:31 2013
+++ src/sys/rump/librump/rumpkern/vm.c Mon Feb 17 19:33:05 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: vm.c,v 1.146 2013/11/23 22:24:31 christos Exp $ */
+/* $NetBSD: vm.c,v 1.147 2014/02/17 19:33:05 pooka Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.146 2013/11/23 22:24:31 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.147 2014/02/17 19:33:05 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -94,6 +94,7 @@ static kmutex_t pdaemonmtx;
static kcondvar_t pdaemoncv, oomwait;
unsigned long rump_physmemlimit = RUMPMEM_UNLIMITED;
+static unsigned long pdlimit = RUMPMEM_UNLIMITED; /* page daemon memlimit */
static unsigned long curphysmem;
static unsigned long dddlim; /* 90% of memory limit used */
#define NEED_PAGEDAEMON() \
@@ -305,8 +306,13 @@ uvm_init(void)
if (rump_physmemlimit / mult != tmp)
panic("uvm_init: RUMP_MEMLIMIT overflow: %s", buf);
/* it's not like we'd get far with, say, 1 byte, but ... */
- if (rump_physmemlimit == 0)
- panic("uvm_init: no memory");
+ if (rump_physmemlimit < 2*MAXPHYS)
+ panic("uvm_init: no memory, need at least %d bytes",
+ 2*MAXPHYS);
+
+ /* reserve some memory for the pager */
+ pdlimit = rump_physmemlimit;
+ rump_physmemlimit -= 2*MAXPHYS;
#define HUMANIZE_BYTES 9
CTASSERT(sizeof(buf) >= HUMANIZE_BYTES);
@@ -919,11 +925,15 @@ void
uvm_wait(const char *msg)
{
- if (__predict_false(curlwp == uvm.pagedaemon_lwp))
- panic("pagedaemon out of memory");
if (__predict_false(rump_threads == 0))
panic("pagedaemon missing (RUMP_THREADS = 0)");
+ if (curlwp == uvm.pagedaemon_lwp) {
+ /* is it possible for us to later get memory? */
+ if (!uvmexp.paging)
+ panic("pagedaemon out of memory");
+ }
+
mutex_enter(&pdaemonmtx);
pdaemon_waiters++;
cv_signal(&pdaemoncv);
@@ -1158,7 +1168,8 @@ rump_hypermalloc(size_t howmuch, int ali
limitagain:
if (rump_physmemlimit != RUMPMEM_UNLIMITED) {
newmem = atomic_add_long_nv(&curphysmem, howmuch);
- if (newmem > rump_physmemlimit) {
+ if ((newmem > rump_physmemlimit) &&
+ !(curlwp == uvm.pagedaemon_lwp || newmem > pdlimit)) {
newmem = atomic_add_long_nv(&curphysmem, -howmuch);
if (!waitok) {
return NULL;