allocate/de-allocate exact number of pages requested
derived from: commit 3ba275833ac741db59ec9a614297aef9f01da908 Author: Masamichi Takagi m-takagi@ab.jp.nec.com <takagi@kncc12.(none)> Date: Thu Jan 17 17:34:12 2013 +0900 make aal reserve exact number of physical pages even when requested >= 32 pages
This commit is contained in:
@ -88,10 +88,21 @@ void ihk_pagealloc_destroy(void *__desc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long __ihk_pagealloc_large(struct ihk_page_allocator_desc *desc,
|
static unsigned long __ihk_pagealloc_large(struct ihk_page_allocator_desc *desc,
|
||||||
int nblocks)
|
int npages)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int i, j, mi;
|
unsigned int i, j, mi;
|
||||||
|
int nblocks;
|
||||||
|
int nfrags;
|
||||||
|
unsigned long mask;
|
||||||
|
|
||||||
|
nblocks = (npages / 64);
|
||||||
|
mask = -1;
|
||||||
|
nfrags = (npages % 64);
|
||||||
|
if (nfrags > 0) {
|
||||||
|
++nblocks;
|
||||||
|
mask = (1UL << nfrags) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
flags = ihk_mc_spinlock_lock(&desc->lock);
|
flags = ihk_mc_spinlock_lock(&desc->lock);
|
||||||
for (i = 0, mi = desc->last; i < desc->count; i++, mi++) {
|
for (i = 0, mi = desc->last; i < desc->count; i++, mi++) {
|
||||||
@ -101,15 +112,16 @@ static unsigned long __ihk_pagealloc_large(struct ihk_page_allocator_desc *desc,
|
|||||||
if (mi + nblocks >= desc->count) {
|
if (mi + nblocks >= desc->count) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for (j = mi; j < mi + nblocks; j++) {
|
for (j = mi; j < mi + nblocks - 1; j++) {
|
||||||
if (desc->map[j]) {
|
if (desc->map[j]) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (j == mi + nblocks) {
|
if ((j == (mi + nblocks - 1)) && !(desc->map[j] & mask)) {
|
||||||
for (j = mi; j < mi + nblocks; j++) {
|
for (j = mi; j < mi + nblocks - 1; j++) {
|
||||||
desc->map[j] = (unsigned long)-1;
|
desc->map[j] = (unsigned long)-1;
|
||||||
}
|
}
|
||||||
|
desc->map[j] |= mask;
|
||||||
ihk_mc_spinlock_unlock(&desc->lock, flags);
|
ihk_mc_spinlock_unlock(&desc->lock, flags);
|
||||||
return ADDRESS(desc, mi, 0);
|
return ADDRESS(desc, mi, 0);
|
||||||
}
|
}
|
||||||
@ -126,10 +138,8 @@ unsigned long ihk_pagealloc_alloc(void *__desc, int npages)
|
|||||||
int j;
|
int j;
|
||||||
unsigned long v, mask, flags;
|
unsigned long v, mask, flags;
|
||||||
|
|
||||||
/* If requested page is more than the half of the element,
|
|
||||||
* we allocate the whole element (ulong) */
|
|
||||||
if (npages >= 32) {
|
if (npages >= 32) {
|
||||||
return __ihk_pagealloc_large(desc, (npages + 63) >> 6);
|
return __ihk_pagealloc_large(desc, npages);
|
||||||
}
|
}
|
||||||
|
|
||||||
mask = (1UL << npages) - 1;
|
mask = (1UL << npages) - 1;
|
||||||
@ -191,9 +201,6 @@ void ihk_pagealloc_free(void *__desc, unsigned long address, int npages)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* XXX: Parameter check */
|
/* XXX: Parameter check */
|
||||||
if (npages >= 32) {
|
|
||||||
npages = (npages + 63) & ~63;
|
|
||||||
}
|
|
||||||
flags = ihk_mc_spinlock_lock(&desc->lock);
|
flags = ihk_mc_spinlock_lock(&desc->lock);
|
||||||
mi = (address - desc->start) >> desc->shift;
|
mi = (address - desc->start) >> desc->shift;
|
||||||
for (i = 0; i < npages; i++, mi++) {
|
for (i = 0; i < npages; i++, mi++) {
|
||||||
|
|||||||
Reference in New Issue
Block a user