IHK query free memory request and implementation
This commit is contained in:
25
kernel/mem.c
25
kernel/mem.c
@ -64,6 +64,27 @@ static struct ihk_mc_pa_ops allocator = {
|
|||||||
.free_page = free_pages,
|
.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,
|
static void page_fault_handler(unsigned long address, void *regs,
|
||||||
unsigned long rbp)
|
unsigned long rbp)
|
||||||
{
|
{
|
||||||
@ -165,6 +186,10 @@ static void page_allocator_init(void)
|
|||||||
|
|
||||||
/* And prepare some exception handlers */
|
/* And prepare some exception handlers */
|
||||||
ihk_mc_set_page_fault_handler(page_fault_handler);
|
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)
|
void register_kmalloc(void)
|
||||||
|
|||||||
@ -26,6 +26,7 @@ int ihk_mc_unregister_interrupt_handler(int vector,
|
|||||||
|
|
||||||
enum ihk_mc_gv_type {
|
enum ihk_mc_gv_type {
|
||||||
IHK_GV_IKC = 1,
|
IHK_GV_IKC = 1,
|
||||||
|
IHK_GV_QUERY_FREE_MEM = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
int ihk_mc_get_vector(enum ihk_mc_gv_type type);
|
int ihk_mc_get_vector(enum ihk_mc_gv_type type);
|
||||||
|
|||||||
@ -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_reserve(void *desc, unsigned long start, unsigned long end);
|
||||||
void ihk_pagealloc_free(void *__desc, unsigned long address, int npages);
|
void ihk_pagealloc_free(void *__desc, unsigned long address, int npages);
|
||||||
unsigned long ihk_pagealloc_count(void *__desc);
|
unsigned long ihk_pagealloc_count(void *__desc);
|
||||||
|
int ihk_pagealloc_query_free(void *__desc);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -229,6 +229,32 @@ unsigned long ihk_pagealloc_count(void *__desc)
|
|||||||
return n;
|
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)
|
void __ihk_pagealloc_zero_free_pages(void *__desc)
|
||||||
{
|
{
|
||||||
struct ihk_page_allocator_desc *desc = __desc;
|
struct ihk_page_allocator_desc *desc = __desc;
|
||||||
|
|||||||
Reference in New Issue
Block a user