From f9cb60ef33451cbfacb3b6a3afddb1bf4d952e80 Mon Sep 17 00:00:00 2001 From: "Balazs Gerofi bgerofi@riken.jp" Date: Mon, 24 Jun 2013 09:00:48 +0900 Subject: [PATCH] IHK query free memory request and implementation --- kernel/mem.c | 25 +++++++++++++++++++++++++ lib/include/ihk/cpu.h | 1 + lib/include/ihk/page_alloc.h | 1 + lib/page_alloc.c | 26 ++++++++++++++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/kernel/mem.c b/kernel/mem.c index 173b91bc..57b67853 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -64,6 +64,27 @@ static struct ihk_mc_pa_ops allocator = { .free_page = free_pages, }; +void sbox_write(int offset, unsigned int value); + +static void query_free_mem_interrupt_handler(void *priv) +{ + dkprintf("query free mem handler!\n"); + + int pages = ihk_pagealloc_query_free(pa_allocator); + + dkprintf("free pages: %d\n", pages); + + sbox_write(SBOX_SCRATCH0, pages); + sbox_write(SBOX_SCRATCH1, 1); +} + +static struct ihk_mc_interrupt_handler query_free_mem_handler = { + .func = query_free_mem_interrupt_handler, + .priv = NULL, +}; + + + static void page_fault_handler(unsigned long address, void *regs, unsigned long rbp) { @@ -165,6 +186,10 @@ static void page_allocator_init(void) /* And prepare some exception handlers */ ihk_mc_set_page_fault_handler(page_fault_handler); + + /* Register query free mem handler */ + ihk_mc_register_interrupt_handler(ihk_mc_get_vector(IHK_GV_QUERY_FREE_MEM), + &query_free_mem_handler); } void register_kmalloc(void) diff --git a/lib/include/ihk/cpu.h b/lib/include/ihk/cpu.h index 87e4f467..309be623 100644 --- a/lib/include/ihk/cpu.h +++ b/lib/include/ihk/cpu.h @@ -26,6 +26,7 @@ int ihk_mc_unregister_interrupt_handler(int vector, enum ihk_mc_gv_type { IHK_GV_IKC = 1, + IHK_GV_QUERY_FREE_MEM = 2 }; int ihk_mc_get_vector(enum ihk_mc_gv_type type); diff --git a/lib/include/ihk/page_alloc.h b/lib/include/ihk/page_alloc.h index b5bcb7f5..0f17aa8a 100644 --- a/lib/include/ihk/page_alloc.h +++ b/lib/include/ihk/page_alloc.h @@ -24,5 +24,6 @@ unsigned long ihk_pagealloc_alloc(void *__desc, int npages); void ihk_pagealloc_reserve(void *desc, unsigned long start, unsigned long end); void ihk_pagealloc_free(void *__desc, unsigned long address, int npages); unsigned long ihk_pagealloc_count(void *__desc); +int ihk_pagealloc_query_free(void *__desc); #endif diff --git a/lib/page_alloc.c b/lib/page_alloc.c index 5d4b2b9d..9c2c2109 100644 --- a/lib/page_alloc.c +++ b/lib/page_alloc.c @@ -229,6 +229,32 @@ unsigned long ihk_pagealloc_count(void *__desc) return n; } +int ihk_pagealloc_query_free(void *__desc) +{ + struct ihk_page_allocator_desc *desc = __desc; + unsigned int mi; + int j; + unsigned long v, flags; + int npages = 0; + + flags = ihk_mc_spinlock_lock(&desc->lock); + for (mi = 0; mi < desc->count; mi++) { + + v = desc->map[mi]; + if (v == (unsigned long)-1) + continue; + + for (j = 0; j < 64; j++) { + if (!(v & ((unsigned long)1 << j))) { /* free */ + npages++; + } + } + } + ihk_mc_spinlock_unlock(&desc->lock, flags); + + return npages; +} + void __ihk_pagealloc_zero_free_pages(void *__desc) { struct ihk_page_allocator_desc *desc = __desc;