From d5dd22c9f6ba86ce9175d84a8f95946edbdb04fc Mon Sep 17 00:00:00 2001 From: Anatoly Burakov Date: Mon, 16 Jul 2018 15:57:19 +0100 Subject: [PATCH] mem: fix alignment of requested virtual areas The original code did not align any addresses that were requested as page-aligned, but were different because addr_is_hint was set. Below fix by Dariusz has introduced an issue where all unaligned addresses were left as unaligned. This patch is a partial revert of commit 7fa7216ed48d ("mem: fix alignment of requested virtual areas") and implements a proper fix for this issue, by asking for alignment in all but the following two cases: 1) page size is equal to system page size, or 2) we got an aligned requested address, and will not accept a different one This ensures that alignment is performed in all cases, except for those we can guarantee that the address will not need alignment. Fixes: b7cc54187ea4 ("mem: move virtual area function in common directory") Fixes: 7fa7216ed48d ("mem: fix alignment of requested virtual areas") Cc: stable@dpdk.org Signed-off-by: Anatoly Burakov Tested-by: Lei Yao Acked-by: Dariusz Stojaczyk --- lib/librte_eal/common/eal_common_memory.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c index 659cc08f64..fbfb1b0550 100644 --- a/lib/librte_eal/common/eal_common_memory.c +++ b/lib/librte_eal/common/eal_common_memory.c @@ -66,14 +66,17 @@ eal_get_virtual_area(void *requested_addr, size_t *size, addr_is_hint = true; } - /* if requested address is not aligned by page size, or if requested - * address is NULL, add page size to requested length as we may get an - * address that's aligned by system page size, which can be smaller than - * our requested page size. additionally, we shouldn't try to align if - * system page size is the same as requested page size. + /* we don't need alignment of resulting pointer in the following cases: + * + * 1. page size is equal to system size + * 2. we have a requested address, and it is page-aligned, and we will + * be discarding the address if we get a different one. + * + * for all other cases, alignment is potentially necessary. */ no_align = (requested_addr != NULL && - ((uintptr_t)requested_addr & (page_sz - 1))) || + requested_addr == RTE_PTR_ALIGN(requested_addr, page_sz) && + !addr_is_hint) || page_sz == system_page_sz; do {