ihk_mc_alloc_aligned_pages_node(): support for explicit indication of target NUMA node
This commit is contained in:
49
kernel/mem.c
49
kernel/mem.c
@ -68,8 +68,8 @@ static char *memdebug = NULL;
|
|||||||
static void *___kmalloc(int size, enum ihk_mc_ap_flag flag);
|
static void *___kmalloc(int size, enum ihk_mc_ap_flag flag);
|
||||||
static void ___kfree(void *ptr);
|
static void ___kfree(void *ptr);
|
||||||
|
|
||||||
static void *___ihk_mc_alloc_aligned_pages(int npages,
|
static void *___ihk_mc_alloc_aligned_pages_node(int npages,
|
||||||
int p2align, enum ihk_mc_ap_flag flag);
|
int p2align, enum ihk_mc_ap_flag flag, int node);
|
||||||
static void *___ihk_mc_alloc_pages(int npages, enum ihk_mc_ap_flag flag);
|
static void *___ihk_mc_alloc_pages(int npages, enum ihk_mc_ap_flag flag);
|
||||||
static void ___ihk_mc_free_pages(void *p, int npages);
|
static void ___ihk_mc_free_pages(void *p, int npages);
|
||||||
|
|
||||||
@ -151,14 +151,15 @@ struct pagealloc_track_entry *__pagealloc_track_find_entry(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Top level routines called from macros */
|
/* Top level routines called from macros */
|
||||||
void *_ihk_mc_alloc_aligned_pages(int npages, int p2align,
|
void *_ihk_mc_alloc_aligned_pages_node(int npages, int p2align,
|
||||||
enum ihk_mc_ap_flag flag, char *file, int line)
|
enum ihk_mc_ap_flag flag, int node, char *file, int line)
|
||||||
{
|
{
|
||||||
unsigned long irqflags;
|
unsigned long irqflags;
|
||||||
struct pagealloc_track_entry *entry;
|
struct pagealloc_track_entry *entry;
|
||||||
struct pagealloc_track_addr_entry *addr_entry;
|
struct pagealloc_track_addr_entry *addr_entry;
|
||||||
int hash, addr_hash;
|
int hash, addr_hash;
|
||||||
void *r = ___ihk_mc_alloc_aligned_pages(npages, p2align, flag);
|
void *r = ___ihk_mc_alloc_aligned_pages_node(npages,
|
||||||
|
p2align, flag, node);
|
||||||
|
|
||||||
if (!memdebug || !pagealloc_track_initialized)
|
if (!memdebug || !pagealloc_track_initialized)
|
||||||
return r;
|
return r;
|
||||||
@ -230,12 +231,6 @@ out:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *_ihk_mc_alloc_pages(int npages, enum ihk_mc_ap_flag flag,
|
|
||||||
char *file, int line)
|
|
||||||
{
|
|
||||||
return _ihk_mc_alloc_aligned_pages(npages, PAGE_P2ALIGN, flag, file, line);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _ihk_mc_free_pages(void *ptr, int npages, char *file, int line)
|
void _ihk_mc_free_pages(void *ptr, int npages, char *file, int line)
|
||||||
{
|
{
|
||||||
unsigned long irqflags;
|
unsigned long irqflags;
|
||||||
@ -449,18 +444,18 @@ void pagealloc_memcheck(void)
|
|||||||
|
|
||||||
|
|
||||||
/* Actual allocation routines */
|
/* Actual allocation routines */
|
||||||
static void *___ihk_mc_alloc_aligned_pages(int npages, int p2align,
|
static void *___ihk_mc_alloc_aligned_pages_node(int npages, int p2align,
|
||||||
enum ihk_mc_ap_flag flag)
|
enum ihk_mc_ap_flag flag, int node)
|
||||||
{
|
{
|
||||||
if (pa_ops)
|
if (pa_ops)
|
||||||
return pa_ops->alloc_page(npages, p2align, flag);
|
return pa_ops->alloc_page(npages, p2align, flag, node);
|
||||||
else
|
else
|
||||||
return early_alloc_pages(npages);
|
return early_alloc_pages(npages);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *___ihk_mc_alloc_pages(int npages, enum ihk_mc_ap_flag flag)
|
static void *___ihk_mc_alloc_pages(int npages, enum ihk_mc_ap_flag flag)
|
||||||
{
|
{
|
||||||
return ___ihk_mc_alloc_aligned_pages(npages, PAGE_P2ALIGN, flag);
|
return ___ihk_mc_alloc_aligned_pages_node(npages, PAGE_P2ALIGN, flag, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ___ihk_mc_free_pages(void *p, int npages)
|
static void ___ihk_mc_free_pages(void *p, int npages)
|
||||||
@ -495,8 +490,8 @@ static void reserve_pages(struct ihk_page_allocator_desc *pa_allocator,
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern int cpu_local_var_initialized;
|
extern int cpu_local_var_initialized;
|
||||||
static void *allocate_aligned_pages(int npages, int p2align,
|
static void *mckernel_allocate_aligned_pages_node(int npages, int p2align,
|
||||||
enum ihk_mc_ap_flag flag)
|
enum ihk_mc_ap_flag flag, int pref_node)
|
||||||
{
|
{
|
||||||
unsigned long pa = 0;
|
unsigned long pa = 0;
|
||||||
int i, node;
|
int i, node;
|
||||||
@ -602,12 +597,7 @@ order_based:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *allocate_pages(int npages, enum ihk_mc_ap_flag flag)
|
static void __mckernel_free_pages_in_allocator(void *va, int npages)
|
||||||
{
|
|
||||||
return allocate_aligned_pages(npages, PAGE_P2ALIGN, flag);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __free_pages_in_allocator(void *va, int npages)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned long pa_start = virt_to_phys(va);
|
unsigned long pa_start = virt_to_phys(va);
|
||||||
@ -630,7 +620,7 @@ static void __free_pages_in_allocator(void *va, int npages)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void free_pages(void *va, int npages)
|
static void mckernel_free_pages(void *va, int npages)
|
||||||
{
|
{
|
||||||
struct list_head *pendings = &cpu_local_var(pending_free_pages);
|
struct list_head *pendings = &cpu_local_var(pending_free_pages);
|
||||||
struct page *page;
|
struct page *page;
|
||||||
@ -638,7 +628,8 @@ static void free_pages(void *va, int npages)
|
|||||||
page = phys_to_page(virt_to_phys(va));
|
page = phys_to_page(virt_to_phys(va));
|
||||||
if (page) {
|
if (page) {
|
||||||
if (page->mode != PM_NONE) {
|
if (page->mode != PM_NONE) {
|
||||||
panic("free_pages:not PM_NONE");
|
kprintf("%s: WARNING: page phys 0x%lx is not PM_NONE",
|
||||||
|
__FUNCTION__, page->phys);
|
||||||
}
|
}
|
||||||
if (pendings->next != NULL) {
|
if (pendings->next != NULL) {
|
||||||
page->mode = PM_PENDING_FREE;
|
page->mode = PM_PENDING_FREE;
|
||||||
@ -648,7 +639,7 @@ static void free_pages(void *va, int npages)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__free_pages_in_allocator(va, npages);
|
__mckernel_free_pages_in_allocator(va, npages);
|
||||||
}
|
}
|
||||||
|
|
||||||
void begin_free_pages_pending(void) {
|
void begin_free_pages_pending(void) {
|
||||||
@ -677,7 +668,7 @@ void finish_free_pages_pending(void)
|
|||||||
}
|
}
|
||||||
page->mode = PM_NONE;
|
page->mode = PM_NONE;
|
||||||
list_del(&page->list);
|
list_del(&page->list);
|
||||||
__free_pages_in_allocator(phys_to_virt(page_to_phys(page)),
|
__mckernel_free_pages_in_allocator(phys_to_virt(page_to_phys(page)),
|
||||||
page->offset);
|
page->offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -686,8 +677,8 @@ void finish_free_pages_pending(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct ihk_mc_pa_ops allocator = {
|
static struct ihk_mc_pa_ops allocator = {
|
||||||
.alloc_page = allocate_aligned_pages,
|
.alloc_page = mckernel_allocate_aligned_pages_node,
|
||||||
.free_page = free_pages,
|
.free_page = mckernel_free_pages,
|
||||||
};
|
};
|
||||||
|
|
||||||
void sbox_write(int offset, unsigned int value);
|
void sbox_write(int offset, unsigned int value);
|
||||||
|
|||||||
@ -79,7 +79,7 @@ void ihk_mc_reserve_arch_pages(struct ihk_page_allocator_desc *pa_allocator,
|
|||||||
unsigned long, unsigned long, int));
|
unsigned long, unsigned long, int));
|
||||||
|
|
||||||
struct ihk_mc_pa_ops {
|
struct ihk_mc_pa_ops {
|
||||||
void *(*alloc_page)(int, int, enum ihk_mc_ap_flag);
|
void *(*alloc_page)(int, int, enum ihk_mc_ap_flag, int node);
|
||||||
void (*free_page)(void *, int);
|
void (*free_page)(void *, int);
|
||||||
|
|
||||||
void *(*alloc)(int, enum ihk_mc_ap_flag);
|
void *(*alloc)(int, enum ihk_mc_ap_flag);
|
||||||
@ -103,17 +103,20 @@ void ihk_mc_map_micpa(unsigned long host_pa, unsigned long* mic_pa);
|
|||||||
int ihk_mc_free_micpa(unsigned long mic_pa);
|
int ihk_mc_free_micpa(unsigned long mic_pa);
|
||||||
void ihk_mc_clean_micpa(void);
|
void ihk_mc_clean_micpa(void);
|
||||||
|
|
||||||
void *_ihk_mc_alloc_aligned_pages(int npages, int p2align,
|
void *_ihk_mc_alloc_aligned_pages_node(int npages, int p2align,
|
||||||
enum ihk_mc_ap_flag flag, char *file, int line);
|
enum ihk_mc_ap_flag flag, int node, char *file, int line);
|
||||||
#define ihk_mc_alloc_aligned_pages(npages, p2align, flag) ({\
|
#define ihk_mc_alloc_aligned_pages_node(npages, p2align, flag, node) ({\
|
||||||
void *r = _ihk_mc_alloc_aligned_pages(npages, p2align, flag, __FILE__, __LINE__);\
|
void *r = _ihk_mc_alloc_aligned_pages_node(npages, p2align, flag, node, __FILE__, __LINE__);\
|
||||||
|
r;\
|
||||||
|
})
|
||||||
|
|
||||||
|
#define ihk_mc_alloc_aligned_pages(npages, p2align, flag) ({\
|
||||||
|
void *r = _ihk_mc_alloc_aligned_pages_node(npages, p2align, flag, -1, __FILE__, __LINE__);\
|
||||||
r;\
|
r;\
|
||||||
})
|
})
|
||||||
|
|
||||||
void *_ihk_mc_alloc_pages(int npages, enum ihk_mc_ap_flag flag,
|
|
||||||
char *file, int line);
|
|
||||||
#define ihk_mc_alloc_pages(npages, flag) ({\
|
#define ihk_mc_alloc_pages(npages, flag) ({\
|
||||||
void *r = _ihk_mc_alloc_pages(npages, flag, __FILE__, __LINE__);\
|
void *r = _ihk_mc_alloc_aligned_pages_node(npages, PAGE_P2ALIGN, flag, -1, __FILE__, __LINE__);\
|
||||||
r;\
|
r;\
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,6 @@
|
|||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include <bitops.h>
|
#include <bitops.h>
|
||||||
|
|
||||||
void *allocate_pages(int npages, enum ihk_mc_ap_flag flag);
|
|
||||||
void free_pages(void *, int npages);
|
void free_pages(void *, int npages);
|
||||||
|
|
||||||
#define MAP_INDEX(n) ((n) >> 6)
|
#define MAP_INDEX(n) ((n) >> 6)
|
||||||
|
|||||||
Reference in New Issue
Block a user