add ihk_mc_allocate_aligned_pages()

This commit is contained in:
NAKAMURA Gou
2013-07-10 12:52:46 +09:00
parent 63d97642d5
commit 630170fb6a
6 changed files with 44 additions and 18 deletions

View File

@@ -50,7 +50,7 @@ void ihk_mc_reserve_arch_pages(unsigned long start, unsigned long end,
void (*cb)(unsigned long, unsigned long, int));
struct ihk_mc_pa_ops {
void *(*alloc_page)(int, enum ihk_mc_ap_flag);
void *(*alloc_page)(int, int, enum ihk_mc_ap_flag);
void (*free_page)(void *, int);
void *(*alloc)(int, enum ihk_mc_ap_flag);
@@ -74,6 +74,7 @@ void ihk_mc_map_micpa(unsigned long host_pa, unsigned long* mic_pa);
int ihk_mc_free_micpa(unsigned long mic_pa);
void ihk_mc_clean_micpa(void);
void *ihk_mc_alloc_aligned_pages(int npages, int p2align, enum ihk_mc_ap_flag flag);
void *ihk_mc_alloc_pages(int npages, enum ihk_mc_ap_flag flag);
void ihk_mc_free_pages(void *p, int npages);
void *ihk_mc_allocate(int size, enum ihk_mc_ap_flag flag);

View File

@@ -20,7 +20,7 @@ void *__ihk_pagealloc_init(unsigned long start, unsigned long size,
void *ihk_pagealloc_init(unsigned long start, unsigned long size,
unsigned long unit);
void ihk_pagealloc_destroy(void *__desc);
unsigned long ihk_pagealloc_alloc(void *__desc, int npages);
unsigned long ihk_pagealloc_alloc(void *__desc, int npages, int p2align);
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);

View File

@@ -88,13 +88,14 @@ void ihk_pagealloc_destroy(void *__desc)
}
static unsigned long __ihk_pagealloc_large(struct ihk_page_allocator_desc *desc,
int npages)
int npages, int p2align)
{
unsigned long flags;
unsigned int i, j, mi;
int nblocks;
int nfrags;
unsigned long mask;
int mialign;
nblocks = (npages / 64);
mask = -1;
@@ -103,13 +104,14 @@ static unsigned long __ihk_pagealloc_large(struct ihk_page_allocator_desc *desc,
++nblocks;
mask = (1UL << nfrags) - 1;
}
mialign = (p2align <= 6)? 1: (1 << (p2align - 6));
flags = ihk_mc_spinlock_lock(&desc->lock);
for (i = 0, mi = desc->last; i < desc->count; i++, mi++) {
if (mi >= desc->count) {
mi = 0;
}
if (mi + nblocks >= desc->count) {
if ((mi + nblocks >= desc->count) || (mi % mialign)) {
continue;
}
for (j = mi; j < mi + nblocks - 1; j++) {
@@ -131,18 +133,20 @@ static unsigned long __ihk_pagealloc_large(struct ihk_page_allocator_desc *desc,
return 0;
}
unsigned long ihk_pagealloc_alloc(void *__desc, int npages)
unsigned long ihk_pagealloc_alloc(void *__desc, int npages, int p2align)
{
struct ihk_page_allocator_desc *desc = __desc;
unsigned int i, mi;
int j;
unsigned long v, mask, flags;
int jalign;
if (npages >= 32) {
return __ihk_pagealloc_large(desc, npages);
if ((npages >= 32) || (p2align >= 5)) {
return __ihk_pagealloc_large(desc, npages, p2align);
}
mask = (1UL << npages) - 1;
jalign = (p2align <= 0)? 1: (1 << p2align);
flags = ihk_mc_spinlock_lock(&desc->lock);
for (i = 0, mi = desc->last; i < desc->count; i++, mi++) {
@@ -155,6 +159,9 @@ unsigned long ihk_pagealloc_alloc(void *__desc, int npages)
continue;
for (j = 0; j <= 64 - npages; j++) {
if (j % jalign) {
continue;
}
if (!(v & (mask << j))) { /* free */
desc->map[mi] |= (mask << j);