From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60821) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YGDbD-0007ux-Te for qemu-devel@nongnu.org; Tue, 27 Jan 2015 16:23:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YGDb8-0004TE-5k for qemu-devel@nongnu.org; Tue, 27 Jan 2015 16:23:03 -0500 Received: from mail-wi0-x22a.google.com ([2a00:1450:400c:c05::22a]:38450) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YGDb7-0004TA-Rq for qemu-devel@nongnu.org; Tue, 27 Jan 2015 16:22:58 -0500 Received: by mail-wi0-f170.google.com with SMTP id em10so5112936wid.1 for ; Tue, 27 Jan 2015 13:22:57 -0800 (PST) Date: Tue, 27 Jan 2015 22:22:51 +0100 From: Marc =?UTF-8?B?TWFyw60=?= Message-ID: <20150127222251.7cc1aa9b@crunchbang> In-Reply-To: <1421698563-6977-7-git-send-email-jsnow@redhat.com> References: <1421698563-6977-1-git-send-email-jsnow@redhat.com> <1421698563-6977-7-git-send-email-jsnow@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v2 06/15] libqos: Update QGuestAllocator to be opaque List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: John Snow Cc: kwolf@redhat.com, armbru@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com, stefanha@redhat.com, pbonzini@redhat.com El Mon, 19 Jan 2015 15:15:54 -0500 John Snow escribi=C3=B3: > To avoid the architecture-specific implementations of the generic > qtest allocator having to know about fields within the allocator, add > a page_size setter method for users or arch specializations to use. > The allocator will assume a default page_size for general use, but it > can always be overridden. >=20 > Since this was the last instance of code directly using properties of > the QGuestAllocator object directly, modify the type to be opaque and > move the structure inside of malloc.c. >=20 > mlist_new, which was previously exported, is made static local to > malloc.c, as it has no external users. >=20 > Signed-off-by: John Snow > --- > tests/libqos/malloc-pc.c | 2 +- > tests/libqos/malloc.c | 61 > ++++++++++++++++++++++++++++++++++++------------ > tests/libqos/malloc.h | 22 +++-------------- 3 files changed, 50 > insertions(+), 35 deletions(-) >=20 > diff --git a/tests/libqos/malloc-pc.c b/tests/libqos/malloc-pc.c > index 6a5fdf3..6e253b6 100644 > --- a/tests/libqos/malloc-pc.c > +++ b/tests/libqos/malloc-pc.c > @@ -38,7 +38,7 @@ QGuestAllocator *pc_alloc_init_flags(QAllocOpts > flags)=20 > ram_size =3D qfw_cfg_get_u64(fw_cfg, FW_CFG_RAM_SIZE); > s =3D alloc_init_flags(flags, 1 << 20, MIN(ram_size, 0xE0000000)); > - s->page_size =3D PAGE_SIZE; > + alloc_set_page_size(s, PAGE_SIZE); > =20 > /* clean-up */ > g_free(fw_cfg); > diff --git a/tests/libqos/malloc.c b/tests/libqos/malloc.c > index 4ff260f..8cce1ba 100644 > --- a/tests/libqos/malloc.c > +++ b/tests/libqos/malloc.c > @@ -16,6 +16,26 @@ > #include > #include > =20 > +typedef QTAILQ_HEAD(MemList, MemBlock) MemList; > + > +typedef struct MemBlock { > + QTAILQ_ENTRY(MemBlock) MLIST_ENTNAME; > + uint64_t size; > + uint64_t addr; > +} MemBlock; > + > +typedef struct QGuestAllocator { > + QAllocOpts opts; > + uint64_t start; > + uint64_t end; > + uint32_t page_size; > + > + MemList used; > + MemList free; > +} QGuestAllocator; > + > +#define DEFAULT_PAGE_SIZE 4096 > + > static void mlist_delete(MemList *list, MemBlock *node) > { > g_assert(list && node); > @@ -103,6 +123,21 @@ static void mlist_coalesce(MemList *head, > MemBlock *node) } while (merge); > } > =20 > +static MemBlock *mlist_new(uint64_t addr, uint64_t size) > +{ > + MemBlock *block; > + > + if (!size) { > + return NULL; > + } > + block =3D g_malloc0(sizeof(MemBlock)); > + > + block->addr =3D addr; > + block->size =3D size; > + > + return block; > +} > + > static uint64_t mlist_fulfill(QGuestAllocator *s, MemBlock *freenode, > uint64_t > size) { > @@ -187,21 +222,6 @@ static void mlist_free(QGuestAllocator *s, > uint64_t addr) mlist_coalesce(&s->free, node); > } > =20 > -MemBlock *mlist_new(uint64_t addr, uint64_t size) > -{ > - MemBlock *block; > - > - if (!size) { > - return NULL; > - } > - block =3D g_malloc0(sizeof(MemBlock)); > - > - block->addr =3D addr; > - block->size =3D size; > - > - return block; > -} > - > /* > * Mostly for valgrind happiness, but it does offer > * a chokepoint for debugging guest memory leaks, too. > @@ -283,6 +303,8 @@ QGuestAllocator *alloc_init(uint64_t start, > uint64_t end) node =3D mlist_new(s->start, s->end - s->start); > QTAILQ_INSERT_HEAD(&s->free, node, MLIST_ENTNAME); > =20 > + s->page_size =3D DEFAULT_PAGE_SIZE; > + > return s; > } > =20 > @@ -293,3 +315,12 @@ QGuestAllocator *alloc_init_flags(QAllocOpts > opts, s->opts =3D opts; > return s; > } > + > +void alloc_set_page_size(QGuestAllocator *allocator, size_t > page_size) +{ > + /* Can't alter the page_size for an allocator in-use */ > + g_assert(QTAILQ_EMPTY(&allocator->used)); > + > + g_assert(is_power_of_2(page_size)); > + allocator->page_size =3D page_size; > +} > diff --git a/tests/libqos/malloc.h b/tests/libqos/malloc.h > index 7b29547..a39dba4 100644 > --- a/tests/libqos/malloc.h > +++ b/tests/libqos/malloc.h > @@ -17,8 +17,6 @@ > #include > #include "qemu/queue.h" > =20 > -#define MLIST_ENTNAME entries > - > typedef enum { > ALLOC_NO_FLAGS =3D 0x00, > ALLOC_LEAK_WARN =3D 0x01, > @@ -26,24 +24,8 @@ typedef enum { > ALLOC_PARANOID =3D 0x04 > } QAllocOpts; > =20 > -typedef QTAILQ_HEAD(MemList, MemBlock) MemList; > -typedef struct MemBlock { > - QTAILQ_ENTRY(MemBlock) MLIST_ENTNAME; > - uint64_t size; > - uint64_t addr; > -} MemBlock; > +typedef struct QGuestAllocator QGuestAllocator; > =20 > -typedef struct QGuestAllocator { > - QAllocOpts opts; > - uint64_t start; > - uint64_t end; > - uint32_t page_size; > - > - MemList used; > - MemList free; > -} QGuestAllocator; > - > -MemBlock *mlist_new(uint64_t addr, uint64_t size); > void alloc_uninit(QGuestAllocator *allocator); > =20 > /* Always returns page aligned values */ > @@ -53,4 +35,6 @@ void guest_free(QGuestAllocator *allocator, > uint64_t addr); QGuestAllocator *alloc_init(uint64_t start, uint64_t > end); QGuestAllocator *alloc_init_flags(QAllocOpts flags, > uint64_t start, uint64_t end); > +void alloc_set_page_size(QGuestAllocator *allocator, size_t > page_size); + > #endif Reviewed-by: Marc Mar=C3=AD