|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V3 3/8] xen/common: Introduce _xrealloc function
On 21.08.19 11:09, Paul Durrant wrote: Hi, Paul
Indeed. Thank you for the pointer. You should also check whether the new requested alignment is compatible with the existing block alignment I am wondering:In case when we use only type-safe construction for the basic allocation (xmalloc) and type-safe construction for the re-allocation (xrealloc_flex_struct) over the same pointer of the correct type, will we get a possible alignment incompatibility? This is how I see it: diff --git a/xen/common/xmalloc_tlsf.c b/xen/common/xmalloc_tlsf.c index eecae2e..f90f453 100644 --- a/xen/common/xmalloc_tlsf.c +++ b/xen/common/xmalloc_tlsf.c@@ -616,8 +616,15 @@ void *_xrealloc(void *ptr, unsigned long size, unsigned long align)
curr_size = PFN_ORDER(virt_to_page(ptr)) << PAGE_SHIFT;
else
{
- struct bhdr *b;
- b = (struct bhdr *)((char *)ptr - BHDR_OVERHEAD);
+ struct bhdr *b = (struct bhdr *)((char *)ptr - BHDR_OVERHEAD);
+
+ if ( b->size & FREE_BLOCK )
+ {
+ p = (char *)ptr - (b->size & ~FREE_BLOCK);
+ b = (struct bhdr *)((char *)p - BHDR_OVERHEAD);
+ ASSERT(!(b->size & FREE_BLOCK));
+ }
+
curr_size = b->size & BLOCK_SIZE_MASK;
}
@@ -630,8 +637,8 @@ void *_xrealloc(void *ptr, unsigned long size,
unsigned long align)
tmp_size = ( tmp_size < MIN_BLOCK_SIZE ) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(tmp_size); - if ( tmp_size <= curr_size ) /* fits in current block */ - return ptr; + if ( tmp_size <= curr_size && ((unsigned long)ptr & (align - 1)) == 0 ) + return ptr; /* fits in current block */ p = _xmalloc(size, align); if ( p ) (END) Did I get your point correct? -- Regards, Oleksandr Tyshchenko _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |