summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sbi/sbi_heap.c52
1 files changed, 21 insertions, 31 deletions
diff --git a/lib/sbi/sbi_heap.c b/lib/sbi/sbi_heap.c
index 8cad3aaf..1de6dc1e 100644
--- a/lib/sbi/sbi_heap.c
+++ b/lib/sbi/sbi_heap.c
@@ -73,7 +73,7 @@ static void *alloc_with_align(struct sbi_heap_control *hpctrl,
size_t align, size_t size)
{
void *ret = NULL;
- struct heap_node *n, *np, *rem;
+ struct heap_node *n, *np;
unsigned long lowest_aligned;
size_t pad;
@@ -107,40 +107,30 @@ static void *alloc_with_align(struct sbi_heap_control *hpctrl,
struct heap_node, head);
sbi_list_del(&n->head);
- if (size + pad < np->size) {
- rem = sbi_list_first_entry(&hpctrl->free_node_list,
- struct heap_node, head);
- sbi_list_del(&rem->head);
- rem->addr = np->addr + (size + pad);
- rem->size = np->size - (size + pad);
- sbi_list_add_tail(&rem->head,
- &hpctrl->free_space_list);
- }
+ n->addr = np->addr;
+ n->size = pad;
+ sbi_list_add_tail(&n->head, &np->head);
- n->addr = lowest_aligned;
- n->size = size;
- sbi_list_add_tail(&n->head, &hpctrl->used_space_list);
+ np->addr += pad;
+ np->size -= pad;
+ }
- np->size = pad;
- ret = (void *)n->addr;
- } else {
- if (size < np->size) {
- n = sbi_list_first_entry(&hpctrl->free_node_list,
- struct heap_node, head);
- sbi_list_del(&n->head);
- n->addr = np->addr;
- n->size = size;
- np->addr += size;
- np->size -= size;
- sbi_list_add_tail(&n->head, &hpctrl->used_space_list);
- ret = (void *)n->addr;
- } else {
- sbi_list_del(&np->head);
- sbi_list_add_tail(&np->head, &hpctrl->used_space_list);
- ret = (void *)np->addr;
- }
+ if (size < np->size) {
+ n = sbi_list_first_entry(&hpctrl->free_node_list,
+ struct heap_node, head);
+ sbi_list_del(&n->head);
+
+ n->addr = np->addr + size;
+ n->size = np->size - size;
+ sbi_list_add(&n->head, &np->head);
+
+ np->size = size;
}
+ sbi_list_del(&np->head);
+ sbi_list_add_tail(&np->head, &hpctrl->used_space_list);
+ ret = (void *)np->addr;
+
out:
spin_unlock(&hpctrl->lock);