mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-02 09:46:37 +03:00
efi_mem_sort: use list_for_each_entry_safe instead
Use list_for_each_entry_safe and comparisons against the current and next efi_mem_desc. This reduces the computation required for merging regions, prevents unnecessary additional iterations of the list, and requires less temporary values. Signed-off-by: Randolph Sapp <rs@ti.com> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
committed by
Heinrich Schuchardt
parent
025c4cbd42
commit
b1c28ad5fa
@@ -128,44 +128,29 @@ static uint64_t desc_get_end(struct efi_mem_desc *desc)
|
||||
*/
|
||||
static void efi_mem_sort(void)
|
||||
{
|
||||
struct efi_mem_list *lmem;
|
||||
struct efi_mem_list *prevmem = NULL;
|
||||
bool merge_again = true;
|
||||
struct efi_mem_list *curmem, *nextmem = NULL;
|
||||
|
||||
list_sort(NULL, &efi_mem, efi_mem_cmp);
|
||||
|
||||
/* Now merge entries that can be merged */
|
||||
while (merge_again) {
|
||||
merge_again = false;
|
||||
list_for_each_entry(lmem, &efi_mem, link) {
|
||||
struct efi_mem_desc *prev;
|
||||
struct efi_mem_desc *cur;
|
||||
uint64_t pages;
|
||||
list_for_each_entry_safe(curmem, nextmem, &efi_mem, link) {
|
||||
struct efi_mem_desc *cur;
|
||||
struct efi_mem_desc *next;
|
||||
|
||||
if (!prevmem) {
|
||||
prevmem = lmem;
|
||||
continue;
|
||||
}
|
||||
/* Exit when we've got nothing to compare with */
|
||||
if (&nextmem->link == &efi_mem)
|
||||
break;
|
||||
|
||||
cur = &lmem->desc;
|
||||
prev = &prevmem->desc;
|
||||
cur = &curmem->desc;
|
||||
next = &nextmem->desc;
|
||||
|
||||
if ((desc_get_end(cur) == prev->physical_start) &&
|
||||
(prev->type == cur->type) &&
|
||||
(prev->attribute == cur->attribute)) {
|
||||
/* There is an existing map before, reuse it */
|
||||
pages = cur->num_pages;
|
||||
prev->num_pages += pages;
|
||||
prev->physical_start -= pages << EFI_PAGE_SHIFT;
|
||||
prev->virtual_start -= pages << EFI_PAGE_SHIFT;
|
||||
list_del(&lmem->link);
|
||||
free(lmem);
|
||||
|
||||
merge_again = true;
|
||||
break;
|
||||
}
|
||||
|
||||
prevmem = lmem;
|
||||
if ((cur->physical_start == desc_get_end(next)) &&
|
||||
(cur->type == next->type) &&
|
||||
(cur->attribute == next->attribute)) {
|
||||
/* There is another similar map coming up, reuse it */
|
||||
next->num_pages += cur->num_pages;
|
||||
list_del(&curmem->link);
|
||||
free(curmem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user