Commit 5e980823 authored by Li Yang's avatar Li Yang Committed by Paul Mackerras

[POWERPC] Fix rheap alignment problem

Honor alignment parameter in the rheap allocator.  This is needed by
qe_lib.
Remove compile warning.
Signed-off-by: default avatarPantelis Antoniou <pantelis@embeddedalley.com>
Signed-off-by: default avatarLi Yang <leoli@freescale.com>
Acked-by: default avatarKumar Galak <galak@kernel.crashing.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 07bd1c4a
...@@ -14,6 +14,7 @@ endif ...@@ -14,6 +14,7 @@ endif
obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \ obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \
memcpy_64.o usercopy_64.o mem_64.o string.o \ memcpy_64.o usercopy_64.o mem_64.o string.o \
strcase.o strcase.o
obj-$(CONFIG_QUICC_ENGINE) += rheap.o
obj-$(CONFIG_XMON) += sstep.o obj-$(CONFIG_XMON) += sstep.o
ifeq ($(CONFIG_PPC64),y) ifeq ($(CONFIG_PPC64),y)
......
...@@ -423,17 +423,21 @@ void *rh_detach_region(rh_info_t * info, void *start, int size) ...@@ -423,17 +423,21 @@ void *rh_detach_region(rh_info_t * info, void *start, int size)
return (void *)s; return (void *)s;
} }
void *rh_alloc(rh_info_t * info, int size, const char *owner) void *rh_alloc_align(rh_info_t * info, int size, int alignment, const char *owner)
{ {
struct list_head *l; struct list_head *l;
rh_block_t *blk; rh_block_t *blk;
rh_block_t *newblk; rh_block_t *newblk;
void *start; void *start;
/* Validate size */ /* Validate size, (must be power of two) */
if (size <= 0) if (size <= 0 || (alignment & (alignment - 1)) != 0)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
/* given alignment larger that default rheap alignment */
if (alignment > info->alignment)
size += alignment - 1;
/* Align to configured alignment */ /* Align to configured alignment */
size = (size + (info->alignment - 1)) & ~(info->alignment - 1); size = (size + (info->alignment - 1)) & ~(info->alignment - 1);
...@@ -476,15 +480,27 @@ void *rh_alloc(rh_info_t * info, int size, const char *owner) ...@@ -476,15 +480,27 @@ void *rh_alloc(rh_info_t * info, int size, const char *owner)
attach_taken_block(info, newblk); attach_taken_block(info, newblk);
/* for larger alignment return fixed up pointer */
/* this is no problem with the deallocator since */
/* we scan for pointers that lie in the blocks */
if (alignment > info->alignment)
start = (void *)(((unsigned long)start + alignment - 1) &
~(alignment - 1));
return start; return start;
} }
void *rh_alloc(rh_info_t * info, int size, const char *owner)
{
return rh_alloc_align(info, size, info->alignment, owner);
}
/* allocate at precisely the given address */ /* allocate at precisely the given address */
void *rh_alloc_fixed(rh_info_t * info, void *start, int size, const char *owner) void *rh_alloc_fixed(rh_info_t * info, void *start, int size, const char *owner)
{ {
struct list_head *l; struct list_head *l;
rh_block_t *blk, *newblk1, *newblk2; rh_block_t *blk, *newblk1, *newblk2;
unsigned long s, e, m, bs, be; unsigned long s, e, m, bs = 0, be = 0;
/* Validate size */ /* Validate size */
if (size <= 0) if (size <= 0)
......
...@@ -62,6 +62,10 @@ extern int rh_attach_region(rh_info_t * info, void *start, int size); ...@@ -62,6 +62,10 @@ extern int rh_attach_region(rh_info_t * info, void *start, int size);
/* Detach a free region */ /* Detach a free region */
extern void *rh_detach_region(rh_info_t * info, void *start, int size); extern void *rh_detach_region(rh_info_t * info, void *start, int size);
/* Allocate the given size from the remote heap (with alignment) */
extern void *rh_alloc_align(rh_info_t * info, int size, int alignment,
const char *owner);
/* Allocate the given size from the remote heap */ /* Allocate the given size from the remote heap */
extern void *rh_alloc(rh_info_t * info, int size, const char *owner); extern void *rh_alloc(rh_info_t * info, int size, const char *owner);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment