aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/lib
diff options
context:
space:
mode:
authorTimur Tabi <timur@freescale.com>2007-05-14 12:31:26 -0400
committerPaul Mackerras <paulus@samba.org>2007-05-17 07:10:16 -0400
commit1c2de47cd47daa033251dbb4a3643e7e87a681b0 (patch)
tree8353c7c550fcecea589d6c5c0fbee4ad35af7a78 /arch/powerpc/lib
parent991eb43af989002d5c7f4a2ff2a6c806a912b51b (diff)
[POWERPC] Fix alignment problem in rh_alloc_align() with exact-sized blocks
When an rheap is created, the caller can specify the alignment to use. In rh_alloc_align(), if a free block is found that is the exact size needed (including extra space for alignment), that configured alignment value is not used to align the pointer. Instead, the default alignment is used. If the default alignment is smaller than the configured alignment, then the returned value will not be aligned correctly. Signed-off-by: Timur Tabi <timur@freescale.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/lib')
-rw-r--r--arch/powerpc/lib/rheap.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c
index b2f6dcc59600..180ee2933ab9 100644
--- a/arch/powerpc/lib/rheap.c
+++ b/arch/powerpc/lib/rheap.c
@@ -468,25 +468,19 @@ unsigned long rh_alloc_align(rh_info_t * info, int size, int alignment, const ch
468 if (blk->size == size) { 468 if (blk->size == size) {
469 /* Move from free list to taken list */ 469 /* Move from free list to taken list */
470 list_del(&blk->list); 470 list_del(&blk->list);
471 blk->owner = owner; 471 newblk = blk;
472 start = blk->start; 472 } else {
473 473 newblk = get_slot(info);
474 attach_taken_block(info, blk); 474 newblk->start = blk->start;
475 newblk->size = size;
475 476
476 return start; 477 /* blk still in free list, with updated start, size */
478 blk->start += size;
479 blk->size -= size;
477 } 480 }
478 481
479 newblk = get_slot(info);
480 newblk->start = blk->start;
481 newblk->size = size;
482 newblk->owner = owner; 482 newblk->owner = owner;
483
484 /* blk still in free list, with updated start, size */
485 blk->start += size;
486 blk->size -= size;
487
488 start = newblk->start; 483 start = newblk->start;
489
490 attach_taken_block(info, newblk); 484 attach_taken_block(info, newblk);
491 485
492 /* for larger alignment return fixed up pointer */ 486 /* for larger alignment return fixed up pointer */