[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 01/22] mm: introduce xvmalloc() et al and use for grant table allocations
On Thu, Apr 22, 2021 at 04:43:39PM +0200, Jan Beulich wrote: > All of the array allocations in grant_table_init() can exceed a page's > worth of memory, which xmalloc()-based interfaces aren't really suitable > for after boot. We also don't need any of these allocations to be > physically contiguous.. Introduce interfaces dynamically switching > between xmalloc() et al and vmalloc() et al, based on requested size, > and use them instead. > > All the wrappers in the new header get cloned mostly verbatim from > xmalloc.h, with the sole adjustment to switch unsigned long to size_t > for sizes and to unsigned int for alignments. We seem to be growing a non-trivial amount of memory allocation families of functions: xmalloc, vmalloc and now xvmalloc. I think from a consumer PoV it would make sense to only have two of those: one for allocations that require to be physically contiguous, and one for allocation that don't require it. Even then, requesting for physically contiguous allocations could be done by passing a flag to the same interface that's used for non-contiguous allocations. Maybe another option would be to expand the existing v{malloc,realloc,...} set of functions to have your proposed behaviour for xv{malloc,realloc,...}? > --- /dev/null > +++ b/xen/include/xen/xvmalloc.h > @@ -0,0 +1,73 @@ > + > +#ifndef __XVMALLOC_H__ > +#define __XVMALLOC_H__ > + > +#include <xen/cache.h> > +#include <xen/types.h> > + > +/* > + * Xen malloc/free-style interface for allocations possibly exceeding a > page's > + * worth of memory, as long as there's no need to have physically contiguous > + * memory allocated. These should be used in preference to xmalloc() et al > + * whenever the size is not known to be constrained to at most a single page. Even when it's know that size <= PAGE_SIZE this helpers are appropriate as they would end up using xmalloc, so I think it's fine to recommend them universally as long as there's no need to alloc physically contiguous memory? Granted there's a bit more overhead from the logic to decide between using xmalloc or vmalloc &c, but that's IMO not that big of a deal in order to not recommend this interface globally for non-contiguous alloc. > + */ > + > +/* Allocate space for typed object. */ > +#define xvmalloc(_type) ((_type *)_xvmalloc(sizeof(_type), > __alignof__(_type))) > +#define xvzalloc(_type) ((_type *)_xvzalloc(sizeof(_type), > __alignof__(_type))) > + > +/* Allocate space for array of typed objects. */ > +#define xvmalloc_array(_type, _num) \ > + ((_type *)_xvmalloc_array(sizeof(_type), __alignof__(_type), _num)) > +#define xvzalloc_array(_type, _num) \ > + ((_type *)_xvzalloc_array(sizeof(_type), __alignof__(_type), _num)) > + > +/* Allocate space for a structure with a flexible array of typed objects. */ > +#define xvzalloc_flex_struct(type, field, nr) \ > + ((type *)_xvzalloc(offsetof(type, field[nr]), __alignof__(type))) > + > +#define xvmalloc_flex_struct(type, field, nr) \ > + ((type *)_xvmalloc(offsetof(type, field[nr]), __alignof__(type))) > + > +/* Re-allocate space for a structure with a flexible array of typed objects. > */ > +#define xvrealloc_flex_struct(ptr, field, nr) \ > + ((typeof(ptr))_xvrealloc(ptr, offsetof(typeof(*(ptr)), field[nr]), \ > + __alignof__(typeof(*(ptr))))) > + > +/* Allocate untyped storage. */ > +#define xvmalloc_bytes(_bytes) _xvmalloc(_bytes, SMP_CACHE_BYTES) > +#define xvzalloc_bytes(_bytes) _xvzalloc(_bytes, SMP_CACHE_BYTES) I see xmalloc does the same, wouldn't it be enough to align to a lower value? Seems quite wasteful to align to 128 on x86 by default? > + > +/* Free any of the above. */ > +extern void xvfree(void *); > + > +/* Free an allocation, and zero the pointer to it. */ > +#define XVFREE(p) do { \ > + xvfree(p); \ > + (p) = NULL; \ > +} while ( false ) > + > +/* Underlying functions */ > +extern void *_xvmalloc(size_t size, unsigned int align); > +extern void *_xvzalloc(size_t size, unsigned int align); > +extern void *_xvrealloc(void *ptr, size_t size, unsigned int align); Nit: I would drop the 'extern' keyword from the function prototypes. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |