diff options
author | Richard Braun <rbraun@sceen.net> | 2014-08-20 22:44:45 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2014-08-20 22:44:45 +0200 |
commit | 1b8abcbce755022410af5e95f207deb8d8096ffd (patch) | |
tree | 0f16125c0951b47cc186137c18869e034db09124 | |
parent | 23e8642967d19ed94c0d489f6aca25679d041354 (diff) |
vm/vm_page: pin thread where appropriate
Make sure CPU pools are always accessed from their owning processor.
-rw-r--r-- | vm/vm_page.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/vm/vm_page.c b/vm/vm_page.c index 08ff6433..3f96d644 100644 --- a/vm/vm_page.c +++ b/vm/vm_page.c @@ -40,6 +40,7 @@ #include <kern/sprintf.h> #include <kern/stddef.h> #include <kern/string.h> +#include <kern/thread.h> #include <kern/types.h> #include <machine/cpu.h> #include <machine/pmap.h> @@ -407,8 +408,8 @@ vm_page_seg_alloc(struct vm_page_seg *seg, unsigned int order, assert(order < VM_PAGE_NR_FREE_LISTS); if (order == 0) { + thread_pin(); cpu_pool = vm_page_cpu_pool_get(seg); - mutex_lock(&cpu_pool->lock); if (cpu_pool->nr_pages == 0) { @@ -416,12 +417,14 @@ vm_page_seg_alloc(struct vm_page_seg *seg, unsigned int order, if (!filled) { mutex_unlock(&cpu_pool->lock); + thread_unpin(); return NULL; } } page = vm_page_cpu_pool_pop(cpu_pool); mutex_unlock(&cpu_pool->lock); + thread_unpin(); } else { mutex_lock(&seg->lock); page = vm_page_seg_alloc_from_buddy(seg, order); @@ -445,8 +448,8 @@ vm_page_seg_free(struct vm_page_seg *seg, struct vm_page *page, vm_page_set_type(page, order, VM_PAGE_FREE); if (order == 0) { + thread_pin(); cpu_pool = vm_page_cpu_pool_get(seg); - mutex_lock(&cpu_pool->lock); if (cpu_pool->nr_pages == cpu_pool->size) @@ -454,6 +457,7 @@ vm_page_seg_free(struct vm_page_seg *seg, struct vm_page *page, vm_page_cpu_pool_push(cpu_pool, page); mutex_unlock(&cpu_pool->lock); + thread_unpin(); } else { mutex_lock(&seg->lock); vm_page_seg_free_to_buddy(seg, page, order); |