aboutsummaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2015-05-09 20:08:36 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2015-05-09 20:08:36 +0000
commit44ec2b63c50ae6d0b2765d5cbdbffb0beb276ad4 (patch)
tree076f93ba33455e8fa9706dc599764746cfac5937 /sys/kern
parent4bc8ff08029571c916ed5e025717b05dcf9c82f4 (diff)
downloadsrc-44ec2b63c50ae6d0b2765d5cbdbffb0beb276ad4.tar.gz
src-44ec2b63c50ae6d0b2765d5cbdbffb0beb276ad4.zip
The vmem callback to reclaim kmem arena address space on low or
fragmented conditions currently just wakes up the pagedaemon. The kmem arena is significantly smaller then the total available physical memory, which means that there are loads where kmem arena space could be exhausted, while there is a lot of pages available still. The woken up pagedaemon sees vm_pages_needed != 0, verifies the condition vm_paging_needed() which is false, clears the pass and returns back to sleep, not calling neither uma_reclaim() nor lowmem handler. To handle low kmem arena conditions, create additional pagedaemon thread which calls uma_reclaim() directly. The thread sleeps on the dedicated channel and kmem_reclaim() wakes the thread in addition to the pagedaemon. Reported and tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=282690
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_malloc.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c
index aef1e4e23d31..ff5b106e385e 100644
--- a/sys/kern/kern_malloc.c
+++ b/sys/kern/kern_malloc.c
@@ -665,13 +665,15 @@ reallocf(void *addr, unsigned long size, struct malloc_type *mtp, int flags)
}
/*
- * Wake the page daemon when we exhaust KVA. It will call the lowmem handler
- * and uma_reclaim() callbacks in a context that is safe.
+ * Wake the uma reclamation pagedaemon thread when we exhaust KVA. It
+ * will call the lowmem handler and uma_reclaim() callbacks in a
+ * context that is safe.
*/
static void
kmem_reclaim(vmem_t *vm, int flags)
{
+ uma_reclaim_wakeup();
pagedaemon_wakeup();
}