* [PATCH] powerpc:Fix rheap alignment problem
@ 2006-06-30 13:02 Li Yang-r58472
2006-06-30 23:13 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 10+ messages in thread
From: Li Yang-r58472 @ 2006-06-30 13:02 UTC (permalink / raw)
To: 'Paul Mackerras'
Cc: linuxppc-dev, 'linux-kernel@vger.kernel.org'
Honour alignment parameter in the rheap allocator.
Remove compile warning.
Signed-off-by: Pantelis Antoniou <pantelis@embeddedalley.com>
Signed-off-by: Li Yang <leoli@freescale.com>
---
arch/powerpc/lib/Makefile | 1 +
arch/powerpc/lib/rheap.c | 24 ++++++++++++++++++++----
include/asm-ppc/rheap.h | 4 ++++
3 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile
index 34f5c2e..136a892 100644
--- a/arch/powerpc/lib/Makefile
+++ b/arch/powerpc/lib/Makefile
@@ -11,6 +11,7 @@ obj-y += bitops.o
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
diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c
index 31e5118..57bf991 100644
--- a/arch/powerpc/lib/rheap.c
+++ b/arch/powerpc/lib/rheap.c
@@ -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)
diff --git a/include/asm-ppc/rheap.h b/include/asm-ppc/rheap.h
index e6ca1f6..65b9322 100644
--- a/include/asm-ppc/rheap.h
+++ b/include/asm-ppc/rheap.h
@@ -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);
--
Leo Li
Freescale Semiconductor
LeoLi@freescale.com
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH] powerpc:Fix rheap alignment problem
2006-06-30 13:02 [PATCH] powerpc:Fix rheap alignment problem Li Yang-r58472
@ 2006-06-30 23:13 ` Benjamin Herrenschmidt
[not found] ` <DCEAAC0833DD314AB0B58112AD99B93B07B36E@ismail.innsys.innovsys.com>
0 siblings, 1 reply; 10+ messages in thread
From: Benjamin Herrenschmidt @ 2006-06-30 23:13 UTC (permalink / raw)
To: Li Yang-r58472
Cc: 'Paul Mackerras', linuxppc-dev,
'linux-kernel@vger.kernel.org'
On Fri, 2006-06-30 at 21:02 +0800, Li Yang-r58472 wrote:
> Honour alignment parameter in the rheap allocator.
> Remove compile warning.
What is this used for ? This rheap allocator ? I see no user in
arch/powerpc at least and only two users apparently in arch/ppc... are
we sure we need something that complex for these ? Can't we just use a
running bitmap allocator or an idr ?
Cheers,
Ben.
> Signed-off-by: Pantelis Antoniou <pantelis@embeddedalley.com>
> Signed-off-by: Li Yang <leoli@freescale.com>
>
> ---
> arch/powerpc/lib/Makefile | 1 +
> arch/powerpc/lib/rheap.c | 24 ++++++++++++++++++++----
> include/asm-ppc/rheap.h | 4 ++++
> 3 files changed, 25 insertions(+), 4 deletions(-)
>
> diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile
> index 34f5c2e..136a892 100644
> --- a/arch/powerpc/lib/Makefile
> +++ b/arch/powerpc/lib/Makefile
> @@ -11,6 +11,7 @@ obj-y += bitops.o
> 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
>
> diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c
> index 31e5118..57bf991 100644
> --- a/arch/powerpc/lib/rheap.c
> +++ b/arch/powerpc/lib/rheap.c
> @@ -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)
> diff --git a/include/asm-ppc/rheap.h b/include/asm-ppc/rheap.h
> index e6ca1f6..65b9322 100644
> --- a/include/asm-ppc/rheap.h
> +++ b/include/asm-ppc/rheap.h
> @@ -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);
>
> --
> Leo Li
> Freescale Semiconductor
>
> LeoLi@freescale.com
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [PATCH] powerpc:Fix rheap alignment problem
@ 2006-07-03 6:49 Li Yang-r58472
0 siblings, 0 replies; 10+ messages in thread
From: Li Yang-r58472 @ 2006-07-03 6:49 UTC (permalink / raw)
To: 'Pantelis Antoniou', Rune Torgersen
Cc: linuxppc-dev list, Paul Mackerras, linux-kernel
Buddy allocation is good in general, but doesn't mean it fits best in any condition. In this case for managing DPRAM/MURAM in Freescale soc, in most case we only put buffer descriptor in DPRAM. That means the alloc/free only occurs on initialization and unloading of the driver. So there are not supposed to be a lot of free operations. Buddy allocation will cause more internal fragment, in my humble opinion. And a free-list allocation is best fit in this case.
Best Regards,
Leo
> -----Original Message-----
> From: linuxppc-dev-bounces+leoli=freescale.com@ozlabs.org
> [mailto:linuxppc-dev-bounces+leoli=freescale.com@ozlabs.org] On Behalf Of
> Pantelis Antoniou
> Sent: Sunday, July 02, 2006 1:18 PM
> To: Rune Torgersen
> Cc: linuxppc-dev list; Paul Mackerras; linux-kernel@vger.kernel.org
> Subject: Re: [PATCH] powerpc:Fix rheap alignment problem
>
> On Sunday 02 July 2006 06:54, Rune Torgersen wrote:
> > From: Pantelis Antoniou
> > Sent: Sat 7/1/2006 9:50 AM
> > >Since genalloc is the blessed linux thing it might be best to use that &
> remove
> > >rheap completely. Oh well...
> >
> > Two problems with genalloc that I can see (for CPM programming):
> > 1) (minor) Does not have a way to specify alignment (genalloc does it for
> you)
> > 2) (major problerm, at least for me) Does not have a way to allocate a specified
> address in the pool.
> >
> > 2 is needed esp when programming MCC drivers, since a lot of the datastructures
> must be in DP RAM _and_ be in a specific spot. And if you cannot tell the
> allocator that I am using a specific address, then the allocator might very
> well give somebody else that portion of RAM. The only solution without a fixed
> allocator is to allocate ALL memory in the DP RAM and use your own allocator.
> >
>
> Yeah, that too.
>
> Too bad there are no main tree drivers like that, but they do exist.
>
> One could conceivably hack genalloc to do that, but will end up with
> something complex too.
>
> BTW, there are other uEngine based architectures with similar alignment
> requirements.
>
> So in conclusion, for the in-tree drivers genalloc is sufficient as an cpm
> memory allocator.
> For some out of tree drivers, it is not.
>
> Pantelis
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [PATCH] powerpc:Fix rheap alignment problem
@ 2006-07-03 12:19 Li Yang-r58472
0 siblings, 0 replies; 10+ messages in thread
From: Li Yang-r58472 @ 2006-07-03 12:19 UTC (permalink / raw)
To: 'Benjamin Herrenschmidt', Pantelis Antoniou
Cc: linuxppc-dev list, Paul Mackerras, linux-kernel
> > > Two problems with genalloc that I can see (for CPM programming):
> > > 1) (minor) Does not have a way to specify alignment (genalloc does it for
> you)
> > > 2) (major problerm, at least for me) Does not have a way to allocate a
> specified address in the pool.
> > >
> > > 2 is needed esp when programming MCC drivers, since a lot of the
> datastructures must be in DP RAM _and_ be in a specific spot. And if you cannot
> tell the allocator that I am using a specific address, then the allocator might
> very well give somebody else that portion of RAM. The only solution without
> a fixed allocator is to allocate ALL memory in the DP RAM and use your own
> allocator.
> > >
> >
> > Yeah, that too.
> >
> > Too bad there are no main tree drivers like that, but they do exist.
> >
> > One could conceivably hack genalloc to do that, but will end up with
> > something complex too.
> >
> > BTW, there are other uEngine based architectures with similar alignment
> > requirements.
> >
> > So in conclusion, for the in-tree drivers genalloc is sufficient as an cpm
> memory allocator.
> > For some out of tree drivers, it is not.
>
> Sounds like a good enough justification to keep rheap for now then.
As the reason I stated in the last mail, rheap should continue being used not only for this fix-address situation but also for CPM/QE buffer descriptor management. Rheap and genalloc are two different implementations of dynamic memory allocator, which have different suitable cases. Both of them should be kept for different applications.
>
> Ben.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2006-07-03 12:19 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-30 13:02 [PATCH] powerpc:Fix rheap alignment problem Li Yang-r58472
2006-06-30 23:13 ` Benjamin Herrenschmidt
[not found] ` <DCEAAC0833DD314AB0B58112AD99B93B07B36E@ismail.innsys.innovsys.com>
[not found] ` <a0bc9bf80606302335p7ba227afwf69dc42e2eada64b@mail.gmail.com>
2006-07-01 7:21 ` Benjamin Herrenschmidt
2006-07-01 10:25 ` Christoph Hellwig
2006-07-01 14:34 ` Kumar Gala
2006-07-01 14:50 ` Pantelis Antoniou
[not found] ` <DCEAAC0833DD314AB0B58112AD99B93B07B36F@ismail.innsys.innovsys.com>
2006-07-02 5:18 ` Pantelis Antoniou
2006-07-03 11:08 ` Benjamin Herrenschmidt
-- strict thread matches above, loose matches on Subject: below --
2006-07-03 6:49 Li Yang-r58472
2006-07-03 12:19 Li Yang-r58472
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox