[CRIU] [PATCH 1/2] rst-malloc: return aligned pointers to sizeof(void *) (v3)
Andrew Vagin
avagin at virtuozzo.com
Thu Feb 4 08:25:42 PST 2016
On Wed, Feb 03, 2016 at 02:07:30PM +0300, Pavel Emelyanov wrote:
> On 01/27/2016 08:29 PM, Andrew Vagin wrote:
> > On Wed, Jan 27, 2016 at 04:29:43PM +0300, Pavel Emelyanov wrote:
> >> On 01/26/2016 10:58 PM, Andrey Vagin wrote:
> >>> From: Andrew Vagin <avagin at virtuozzo.com>
> >>>
> >>> Stas found that if we don't align a pointer,
> >>> futex and atomic operations can fail.
> >>>
> >>> v2: don't hard-code the size of void *
> >>> v3: add a function to allocate memory without gaps with
> >>> a privious slice. It's used to allocate arrays.
> >>>
> >>> Cc: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
> >>> Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
> >>> ---
> >>> include/rst-malloc.h | 1 +
> >>> rst-malloc.c | 23 ++++++++++++++++++++++-
> >>> 2 files changed, 23 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/include/rst-malloc.h b/include/rst-malloc.h
> >>> index 8c48f27..f205622 100644
> >>> --- a/include/rst-malloc.h
> >>> +++ b/include/rst-malloc.h
> >>> @@ -58,6 +58,7 @@ extern void *rst_mem_remap_ptr(unsigned long pos, int type);
> >>> * last object can be freed (pop-ed from buffer).
> >>> */
> >>> extern void *rst_mem_alloc(unsigned long size, int type);
> >>> +extern void *rst_mem_alloc_cont(unsigned long size, int type);
> >>> extern void rst_mem_free_last(int type);
> >>> /*
> >>> * Routines to remap SHREMAP and PRIVATE into restorer address space
> >>> diff --git a/rst-malloc.c b/rst-malloc.c
> >>> index 14e0b41..7685430 100644
> >>> --- a/rst-malloc.c
> >>> +++ b/rst-malloc.c
> >>> @@ -128,6 +128,9 @@ unsigned long rst_mem_cpos(int type)
> >>> {
> >>> struct rst_mem_type_s *t = &rst_mems[type];
> >>> BUG_ON(!t->remapable || !t->enabled);
> >>> +
> >>> + t->free_mem = (void *) round_up((unsigned long)t->free_mem, sizeof(void *));
> >>
> >> Should this hunk be here? Why?
> >
> > Yes, it should. We want to aligne a start address of arrays. It's about
> > a case when rst_mem_alloc_cont is used.
>
> It's wrong place for such a thing. The rst_mem_cpos() should be "pure function",
> i.e. do not change anything inside.
Where is the right place?
>
> >>
> >>> +
> >>> return t->free_mem - t->buf;
> >>> }
> >>>
> >>> @@ -138,7 +141,7 @@ void *rst_mem_remap_ptr(unsigned long pos, int type)
> >>> return t->buf + pos;
> >>> }
> >>>
> >>> -void *rst_mem_alloc(unsigned long size, int type)
> >>> +static void *__rst_mem_alloc(unsigned long size, int type)
> >>> {
> >>> struct rst_mem_type_s *t = &rst_mems[type];
> >>> void *ret;
> >>> @@ -158,6 +161,24 @@ void *rst_mem_alloc(unsigned long size, int type)
> >>> return ret;
> >>> }
> >>>
> >>> +void *rst_mem_alloc(unsigned long size, int type)
> >>> +{
> >>> + struct rst_mem_type_s *t = &rst_mems[type];
> >>> +
> >>> + t->free_mem = (void *) round_up((unsigned long)t->free_mem, sizeof(void *));
> >>
> >> Any guarantee you don't overflow the free_mem beyond the allocated memory buffer?
> >
> > __rst_mem_alloc will check and call grow() if it's required.
>
> Hm... Then the respective BUG_ON() should be here.
>
> >>
> >>> +
> >>> + return __rst_mem_alloc(size, type);
> >>> +}
> >>> +
> >>> +/* Allocate memory without gaps with a previous slice */
> >>> +void *rst_mem_alloc_cont(unsigned long size, int type)
> >>
> >> I'd better make a call titles rst_mem_alloc_aligned().
> >
> > rst_mem_alloc_NOT_align
> >
> > I don't want to rename rst_mem_alloc, because ussualy this sort of
> > functions (e.g. malloc) returns alligned addresses.
> >
> > I was thinking about this, but rst_mem_alloc_cont looks better for met.
> >
> > Maybe we need to add rst_mem_realloc() instead of rst_mem_alloc_cont.
>
> Or rst_mem_grow(). OK, let's do that.
>
> >>
> >>> +{
> >>> + struct rst_mem_type_s *t = &rst_mems[type];
> >>> + BUG_ON(!t->remapable);
> >>> +
> >>> + return __rst_mem_alloc(size, type);
> >>> +}
> >>> +
> >>> void rst_mem_free_last(int type)
> >>> {
> >>> struct rst_mem_type_s *t = &rst_mems[type];
> >>>
> >>
> > .
> >
>
More information about the CRIU
mailing list