Skip to contentSkip to conversation

qe_lib: Fix rheap alignment problem

PATCH In review Li Yang 3 participants 5 messages Sep 28, 2006 PowerPC

lore
Share & tools
lore

Li Yang

author
#0 lore raw

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
index ff70964..fe61c92 100644
@@ -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
index 31e5118..57bf991 100644
@@ -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
index e6ca1f6..65b9322 100644
@@ -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);

#1 lore raw
Quoted 6 lines · Li Yang

Honor alignment parameter in the rheap allocator. This is needed by qe_lib.
Remove compile warning.

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
index ff70964..fe61c92 100644
@@ -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 +20 -4
index 31e5118..57bf991 100644
@@ -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
index e6ca1f6..65b9322 100644
@@ -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, int  

alignment,

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);

#2 lore raw
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.

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
index ff70964..fe61c92 100644
@@ -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 +19 -3
index 31e5118..57bf991 100644
@@ -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;
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
index e6ca1f6..65b9322 100644
@@ -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, int  

alignment,

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
#3 lore raw
In reply to Kumar Gala
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.

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
#4 lore raw
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

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