diff options
author | kib <kib@FreeBSD.org> | 2015-05-23 09:14:29 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2015-05-23 09:14:29 +0000 |
commit | 09f1502b693cf27aaf4e8510864396fdb5cdccd7 (patch) | |
tree | aea5b47d7ef5ce1fabc967b70de6e263e1634d2b /sys/vm | |
parent | a072eaae06913629d597381a0413a365c3f82344 (diff) | |
download | FreeBSD-src-09f1502b693cf27aaf4e8510864396fdb5cdccd7.zip FreeBSD-src-09f1502b693cf27aaf4e8510864396fdb5cdccd7.tar.gz |
MFC r282690:
Call uma_reclaim() from the additional pagedaemon thread to reclaim kmem
arena address space.
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/uma.h | 3 | ||||
-rw-r--r-- | sys/vm/uma_core.c | 42 | ||||
-rw-r--r-- | sys/vm/vm_pageout.c | 7 |
3 files changed, 47 insertions, 5 deletions
diff --git a/sys/vm/uma.h b/sys/vm/uma.h index 5012d98..ed69e19 100644 --- a/sys/vm/uma.h +++ b/sys/vm/uma.h @@ -689,4 +689,7 @@ struct uma_percpu_stat { uint64_t _ups_reserved[5]; /* Reserved. */ }; +void uma_reclaim_wakeup(void); +void uma_reclaim_worker(void *); + #endif /* _VM_UMA_H_ */ diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index f404045..d0df901 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -3192,16 +3192,17 @@ uma_find_refcnt(uma_zone_t zone, void *item) } /* See uma.h */ -void -uma_reclaim(void) +static void +uma_reclaim_locked(bool kmem_danger) { + #ifdef UMA_DEBUG printf("UMA: vm asked us to release pages!\n"); #endif - sx_xlock(&uma_drain_lock); + sx_assert(&uma_drain_lock, SA_XLOCKED); bucket_enable(); zone_foreach(zone_drain); - if (vm_page_count_min()) { + if (vm_page_count_min() || kmem_danger) { cache_drain_safe(NULL); zone_foreach(zone_drain); } @@ -3213,9 +3214,42 @@ uma_reclaim(void) zone_drain(slabzone); zone_drain(slabrefzone); bucket_zone_drain(); +} + +void +uma_reclaim(void) +{ + + sx_xlock(&uma_drain_lock); + uma_reclaim_locked(false); sx_xunlock(&uma_drain_lock); } +static int uma_reclaim_needed; + +void +uma_reclaim_wakeup(void) +{ + + uma_reclaim_needed = 1; + wakeup(&uma_reclaim_needed); +} + +void +uma_reclaim_worker(void *arg __unused) +{ + + sx_xlock(&uma_drain_lock); + for (;;) { + sx_sleep(&uma_reclaim_needed, &uma_drain_lock, PVM, + "umarcl", 0); + if (uma_reclaim_needed) { + uma_reclaim_needed = 0; + uma_reclaim_locked(true); + } + } +} + /* See uma.h */ int uma_zone_exhausted(uma_zone_t zone) diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 3cd1e54..db10fa4 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -1726,8 +1726,9 @@ vm_pageout_init(void) static void vm_pageout(void) { + int error; #if MAXMEMDOM > 1 - int error, i; + int i; #endif swap_pager_swap_init(); @@ -1741,6 +1742,10 @@ vm_pageout(void) } } #endif + error = kthread_add(uma_reclaim_worker, NULL, curproc, NULL, + 0, 0, "uma"); + if (error != 0) + panic("starting uma_reclaim helper, error %d\n", error); vm_pageout_worker((void *)(uintptr_t)0); } |