DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] eal: fix end for bounded malloc elements
@ 2017-12-21 16:54 Anatoly Burakov
  2018-01-12 14:54 ` Thomas Monjalon
  0 siblings, 1 reply; 2+ messages in thread
From: Anatoly Burakov @ 2017-12-21 16:54 UTC (permalink / raw)
  To: dev; +Cc: Sergio Gonzalez Monroy, stable

In cases when alignment is bigger than boundary, we may incorrectly
calculate end of a bounded malloc element.

Consider this: suppose we are allocating a bounded malloc element
that should be of 128 bytes in size, bounded to 128 bytes and
aligned on a 256-byte boundary. Suppose our malloc element ends
at 0x140 - that is, 256 plus one cacheline.

So, right at the start, we are aligning our new_data_start to
include the required element size, and to be aligned on a specified
boundary - so new_data_start becomes 0. This fails the following
bounds check, because our element cannot go above 128 bytes from
the start, and we are at 320. So, we enter the bounds handling
branch.

While we're in there, we are aligning end_pt to our boundedness
requirement of 128 byte, and end up with 0x100 (since 256 is
128-byte aligned). We recalculate new_data_size and it stays at
0, however our end is at 0x100, which is beyond the 128 byte
boundary, and we report inability to reserve a bounded element
when we could have.

This patch adds an end_pt recalculation after new_data_start
adjustment - we already know that size <= bound, so we can do it
safely - and we then correctly report that we can, in fact, try
using this element for bounded malloc allocation.

Fixes: fafcc11985a2 ("mem: rework memzone to be allocated by malloc")
Cc: sergio.gonzalez.monroy@intel.com
Cc: stable@dpdk.org
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 lib/librte_eal/common/malloc_elem.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/librte_eal/common/malloc_elem.c b/lib/librte_eal/common/malloc_elem.c
index 98bcd37..f6cbc42 100644
--- a/lib/librte_eal/common/malloc_elem.c
+++ b/lib/librte_eal/common/malloc_elem.c
@@ -98,6 +98,7 @@ elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align,
 	if ((new_data_start & bmask) != ((end_pt - 1) & bmask)) {
 		end_pt = RTE_ALIGN_FLOOR(end_pt, bound);
 		new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
+		end_pt = new_data_start + size;
 		if (((end_pt - 1) & bmask) != (new_data_start & bmask))
 			return NULL;
 	}
-- 
2.7.4

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [dpdk-dev] [PATCH] eal: fix end for bounded malloc elements
  2017-12-21 16:54 [dpdk-dev] [PATCH] eal: fix end for bounded malloc elements Anatoly Burakov
@ 2018-01-12 14:54 ` Thomas Monjalon
  0 siblings, 0 replies; 2+ messages in thread
From: Thomas Monjalon @ 2018-01-12 14:54 UTC (permalink / raw)
  To: Anatoly Burakov; +Cc: dev, stable

21/12/2017 17:54, Anatoly Burakov:
> In cases when alignment is bigger than boundary, we may incorrectly
> calculate end of a bounded malloc element.
> 
> Consider this: suppose we are allocating a bounded malloc element
> that should be of 128 bytes in size, bounded to 128 bytes and
> aligned on a 256-byte boundary. Suppose our malloc element ends
> at 0x140 - that is, 256 plus one cacheline.
> 
> So, right at the start, we are aligning our new_data_start to
> include the required element size, and to be aligned on a specified
> boundary - so new_data_start becomes 0. This fails the following
> bounds check, because our element cannot go above 128 bytes from
> the start, and we are at 320. So, we enter the bounds handling
> branch.
> 
> While we're in there, we are aligning end_pt to our boundedness
> requirement of 128 byte, and end up with 0x100 (since 256 is
> 128-byte aligned). We recalculate new_data_size and it stays at
> 0, however our end is at 0x100, which is beyond the 128 byte
> boundary, and we report inability to reserve a bounded element
> when we could have.
> 
> This patch adds an end_pt recalculation after new_data_start
> adjustment - we already know that size <= bound, so we can do it
> safely - and we then correctly report that we can, in fact, try
> using this element for bounded malloc allocation.
> 
> Fixes: fafcc11985a2 ("mem: rework memzone to be allocated by malloc")
> Cc: sergio.gonzalez.monroy@intel.com
> Cc: stable@dpdk.org
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>

It looks to be a headache, but as the maintainer of DPDK memory,
I trust you :)

Applied, thanks

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-01-12 14:55 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-12-21 16:54 [dpdk-dev] [PATCH] eal: fix end for bounded malloc elements Anatoly Burakov
2018-01-12 14:54 ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).