qe_lib: Fix rheap alignment problem
PATCH 8/12 qe_lib: Fix rheap alignment problem
Honor alignment parameter in the rheap allocator. This is needed by qe_lib.
Remove compile warning.
---
arch/powerpc/lib/Makefile | 1 + arch/powerpc/lib/rheap.c | 24 ++++++++++++++++++++---- include/asm-ppc/rheap.h | 4 ++++ 3 files changed, 25 insertions(+), 4 deletions(-)
arch/powerpc/lib/Makefile +0 -0
@@ -14,6 +14,7 @@ endif
obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \ memcpy_64.o usercopy_64.o mem_64.o string.o \ strcase.o
+obj-$(CONFIG_QUICC_ENGINE) += rheap.o
obj-$(CONFIG_PPC_ISERIES) += e2a.o
obj-$(CONFIG_XMON) += sstep.o
arch/powerpc/lib/rheap.c +0 -0
@@ -423,17 +423,21 @@ void *rh_detach_region(rh_info_t * info,
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;
rh_block_t *blk;
rh_block_t *newblk;
void *start;- /* Validate size */
- if (size <= 0)
+ /* Validate size, (must be power of two) */
+ if (size <= 0 || (alignment & (alignment - 1)) != 0)
return ERR_PTR(-EINVAL);
+ /* given alignment larger that default rheap alignment */
+ if (alignment > info->alignment)
+ size += alignment - 1;
+
/* Align to configured alignment */ size = (size + (info->alignment - 1)) & ~(info->alignment - 1);
@@ -476,15 +480,27 @@ void *rh_alloc(rh_info_t * info, int siz
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; }
+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 */
void *rh_alloc_fixed(rh_info_t * info, void *start, int size, const char *owner)
{
struct list_head *l;
rh_block_t *blk, *newblk1, *newblk2;- unsigned long s, e, m, bs, be;
+ unsigned long s, e, m, bs = 0, be = 0;
/* Validate size */ if (size <= 0)
include/asm-ppc/rheap.h +0 -0
@@ -62,6 +62,10 @@ extern int rh_attach_region(rh_info_t * /* Detach a free region */
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 */
extern void *rh_alloc(rh_info_t * info, int size, const char *owner);
Quoted 6 lines · Li Yang
Honor alignment parameter in the rheap allocator. This is needed by
qe_lib.
Remove compile warning.Signed-off-by Pantelis Antoniou <[email protected]>Signed-off-by Li Yang <[email protected]>
Vitaly, have you tested this with any of your PQ2 powerpc ports?
- k
Quoted 82 lines
---
arch/powerpc/lib/Makefile | 1 + arch/powerpc/lib/rheap.c | 24 ++++++++++++++++++++---- include/asm-ppc/rheap.h | 4 ++++ 3 files changed, 25 insertions(+), 4 deletions(-)arch/powerpc/lib/Makefile +1
-0@@ -14,6 +14,7 @@ endif obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \ memcpy_64.o usercopy_64.o mem_64.o string.o \ strcase.o +obj-$(CONFIG_QUICC_ENGINE) += rheap.oobj-$(CONFIG_PPC_ISERIES) += e2a.o
obj-$(CONFIG_XMON) += sstep.oarch/powerpc/lib/rheap.c +20
-4@@ -423,17 +423,21 @@ void *rh_detach_region(rh_info_t * info,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;rh_block_t *blk;rh_block_t *newblk;void *start; -/* Validate size */ -if (size <=0 ) +/* Validate size, (must be power of two) */ +if (size <=0 || (alignment & (alignment -1 )) !=0 )return ERR_PTR (-EINVAL ); +/* given alignment larger that default rheap alignment */ +if (alignment > info->alignment) + size += alignment -1 ; +/* Align to configured alignment */ size = (size + (info->alignment -1 )) & ~(info->alignment -1 );@@ -476,15 +480,27 @@ void *rh_alloc(rh_info_t * info, int sizattach_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; } +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 */ void *rh_alloc_fixed (rh_info_t * info,void *start,int size,const char *owner) {struct list_head *l;rh_block_t *blk, *newblk1, *newblk2; -unsigned long s, e, m, bs, be; +unsigned long s, e, m, bs =0 , be =0 ;/* Validate size */ if (size <=0 )include/asm-ppc/rheap.h +0
-0@@ -62,6 +62,10 @@ extern int rh_attach_region(rh_info_t * /*Detach a free region */
extern void *rh_detach_region(rh_info_t * info, void *start, int size);include/asm-ppc/rheap.h +2
-0+/* Allocate the given size from the remote heap (with alignment) */ +extern void *rh_alloc_align(rh_info_t * info, int size, intalignment,
include/asm-ppc/rheap.h +2
-0+ const char *owner); +/* Allocate the given size from the remote heap */
extern void *rh_alloc(rh_info_t * info, int size, const char *owner);
Quoted 12 lines · On Thu, 28 Sep 2006 09:10:18 -0500 Kumar Gala <[email protected]> wrote:
Quoted 6 lines · Li Yang
Honor alignment parameter in the rheap allocator. This is needed by
qe_lib.
Remove compile warning.Signed-off-by Pantelis Antoniou <[email protected]>Signed-off-by Li Yang <[email protected]>Vitaly, have you tested this with any of your PQ2 powerpc ports?
Had no such a chance... Well I can give it a quick test for 8560 today, and PQ2 next week. I think the fix was introduced and verified a while ago, but don't recall if it is the one below :)
-Vitaly
Quoted 88 lines
- k
Quoted 84 lines
---
arch/powerpc/lib/Makefile | 1 + arch/powerpc/lib/rheap.c | 24 ++++++++++++++++++++---- include/asm-ppc/rheap.h | 4 ++++ 3 files changed, 25 insertions(+), 4 deletions(-)arch/powerpc/lib/Makefile +1
-0@@ -14,6 +14,7 @@ endif obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \ memcpy_64.o usercopy_64.o mem_64.o string.o \ strcase.o +obj-$(CONFIG_QUICC_ENGINE) += rheap.oobj-$(CONFIG_PPC_ISERIES) += e2a.o
obj-$(CONFIG_XMON) += sstep.oarch/powerpc/lib/rheap.c +19
-3@@ -423,17 +423,21 @@ void *rh_detach_region(rh_info_t * info,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;rh_block_t *blk;rh_block_t *newblk;void *start; -/* Validate size */ -if (size <=0 ) +/* Validate size, (must be power of two) */ +if (size <=0 || (alignment & (alignment -1 )) !=0 )return ERR_PTR (-EINVAL ); +/* given alignment larger that default rheap alignment */ +if (alignment > info->alignment) + size += alignment -1 ; +/* Align to configured alignment */ size = (size + (info->alignment -1 )) & ~(info->alignment -1 );@@ -476,15 +480,27 @@ void *rh_alloc(rh_info_t * info, int sizattach_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; } +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 */ void *rh_alloc_fixed(rh_info_t * info, void *start, int size, const char *owner)
{ struct list_head *l; rh_block_t *blk, *newblk1, *newblk2;arch/powerpc/lib/rheap.c +1
-1-unsigned long s, e, m, bs, be; +unsigned long s, e, m, bs =0 , be =0 ;/* Validate size */ if (size <= 0)include/asm-ppc/rheap.h +0
-0@@ -62,6 +62,10 @@ extern int rh_attach_region(rh_info_t * /*Detach a free region */
extern void *rh_detach_region(rh_info_t * info, void *start, int size);include/asm-ppc/rheap.h +2
-0+/* Allocate the given size from the remote heap (with alignment) */ +extern void *rh_alloc_align(rh_info_t * info, int size, intalignment,
include/asm-ppc/rheap.h +2
-0+ const char *owner); +/* Allocate the given size from the remote heap */
extern void *rh_alloc(rh_info_t * info, int size, const char *owner);
Signature · 2 lines
Sincerely, Vitaly
Quoted 10 lines · On Thu, 28 Sep 2006 09:10:18 -0500 Kumar Gala <[email protected]> wrote:
Quoted 6 lines · Li Yang
Honor alignment parameter in the rheap allocator. This is needed by
qe_lib.
Remove compile warning.Signed-off-by Pantelis Antoniou <[email protected]>Signed-off-by Li Yang <[email protected]>
OK, I can state rheap is still consistent in 8560 cpm2.
It even makes sense to apply this instantly because it's a notable bugfix.. Kumar?
Signature · 2 lines
Sincerely, Vitaly
Quoted 10 lines · Vitaly Bordug
Quoted 7 lines · On Thu, 28 Sep 2006 09:10:18 -0500 Kumar Gala <[email protected]> wrote:
Quoted 4 lines · Li Yang
Honor alignment parameter in the rheap allocator. This is needed by
qe_lib.
Remove compile warning.
Quoted 6 lines
Quoted 3 lines
Quoted 2 lines
Signed-off-by Pantelis Antoniou <[email protected]>Signed-off-by Li Yang <[email protected]>OK, I can state rheap is still consistent in 8560 cpm2.
It even makes sense to apply this instantly because it's a notable bugfix.. Kumar?
Good, I wanted to pull this out of QE patch set and since it fixes a bug even better.
Acked by me.
- kumar