|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V3 3/8] xen/common: Introduce _xrealloc function
> -----Original Message-----
> From: Oleksandr <olekstysh@xxxxxxxxx>
> Sent: 21 August 2019 15:36
> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: sstabellini@xxxxxxxxxx; Wei Liu <wl@xxxxxxx>; Konrad Rzeszutek Wilk
> <konrad.wilk@xxxxxxxxxx>;
> George Dunlap <George.Dunlap@xxxxxxxxxx>; Andrew Cooper
> <Andrew.Cooper3@xxxxxxxxxx>; Ian Jackson
> <Ian.Jackson@xxxxxxxxxx>; Tim (Xen.org) <tim@xxxxxxx>; Oleksandr Tyshchenko
> <oleksandr_tyshchenko@xxxxxxxx>; julien.grall@xxxxxxx; Jan Beulich
> <jbeulich@xxxxxxxx>;
> Volodymyr_Babchuk@xxxxxxxx
> Subject: Re: [Xen-devel] [PATCH V3 3/8] xen/common: Introduce _xrealloc
> function
>
>
> On 21.08.19 11:09, Paul Durrant wrote:
>
> Hi, Paul
>
> >> }
> >>
> >> +void *_xrealloc(void *ptr, unsigned long size, unsigned long align)
> >> +{
> >> + unsigned long curr_size, tmp_size;
> >> + void *p;
> >> +
> >> + if ( !size )
> >> + {
> >> + xfree(ptr);
> >> + return ZERO_BLOCK_PTR;
> >> + }
> >> +
> >> + if ( ptr == NULL || ptr == ZERO_BLOCK_PTR )
> >> + return _xmalloc(size, align);
> >> +
> >> + if ( !((unsigned long)ptr & (PAGE_SIZE - 1)) )
> >> + curr_size = PFN_ORDER(virt_to_page(ptr)) << PAGE_SHIFT;
> >> + else
> >> + {
> >> + struct bhdr *b;
> >> + b = (struct bhdr *)((char *)ptr - BHDR_OVERHEAD);
> >> + curr_size = b->size & BLOCK_SIZE_MASK;
> >> + }
> > That seconds clause is not going to give you the block size if the previous
> > allocation had alignment
> padding. You'll need to check the FREE_BLOCK bit to tell whether it's a real
> block header or the
> 'fake' alignment header and then maybe walk backwards onto the real header.
> See the code in xfree().
>
> 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?
You shouldn't but you're trusting that no-one will want to call the function
directly with a higher alignment.
>
>
> 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;
Yes, that looks ok for getting the size right...
> }
>
> @@ -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 */
...and that should deal with the alignment too (although you may want to
mention the alignment part in the comment too)
>
> p = _xmalloc(size, align);
> if ( p )
>
> (END)
>
>
> Did I get your point correct?
>
Yes, with those changes I think it will look ok.
Paul
>
> --
> 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 |