|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] libxl: save/restore qemu's physmap
On Fri, 20 Jan 2012, Ian Campbell wrote:
> On Fri, 2012-01-20 at 11:18 +0000, Stefano Stabellini wrote:
> > Read Qemu's physmap from xenstore and save it using toolstack_save.
> > Restore Qemu's physmap using toolstack_restore.
>
> Shall we have a version field now so we don't dig ourselves a hole we
> can't get out of?
good idea
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> > ---
> > tools/libxl/libxl_dom.c | 132
> > ++++++++++++++++++++++++++++++++++++++++++++++-
> > 1 files changed, 131 insertions(+), 1 deletions(-)
> >
> > diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> > index fd2b051..3d60a35 100644
> > --- a/tools/libxl/libxl_dom.c
> > +++ b/tools/libxl/libxl_dom.c
> > @@ -347,6 +347,62 @@ out:
> > return rc;
> > }
> >
> > +static int libxl__toolstack_restore(uint32_t domid, uint8_t *buf,
> > + uint32_t size, void *data)
> > +{
> > + libxl__gc *gc = (libxl__gc *) data;
> > + int i, ret;
> > + uint8_t *ptr = buf;
> > + uint32_t namelen = 0;
> > + char *name = NULL;
> > + uint32_t count = 0;
> > + uint64_t phys_offset_v = 0, start_addr_v = 0, size_v = 0;
> > +
> > + if (size < sizeof(count))
> > + return -1;
> > +
> > + memcpy(&count, ptr, sizeof(count));
> > + ptr += sizeof(count);
> > +
> > + if (size <
> > + sizeof(count) + count * (sizeof(uint64_t) * 3 +
> > sizeof(uint32_t)))
> > + return -1;
> > +
> > + for (i = 0; i < count; i++) {
> > + memcpy(&namelen, ptr, sizeof(namelen));
> > + ptr += sizeof(namelen);
> > + if (namelen > 0) {
> > + name = (char *)ptr;
> > + ptr += namelen;
> > + }
> > + memcpy(&phys_offset_v, ptr, sizeof(uint64_t));
> > + ptr += sizeof(uint64_t);
> > + memcpy(&start_addr_v, ptr, sizeof(uint64_t));
> > + ptr += sizeof(uint64_t);
> > + memcpy(&size_v, ptr, sizeof(uint64_t));
> > + ptr += sizeof(uint64_t);
>
> Why not define a struct libxl__physmap_info for these three? You could
> even do the trick with the "char name[]" at the end and incorporate
> namelen too if you wanted.
>
> The maximum size of the allocation is
> sizeof(count) + count * (sizeof(uint64_t) * 3 + sizeof(uint32_t)))
> here but in the save it is allocating:
> sizeof(count) + count * (sizeof(val) * 3 + sizeof(namelen));
> these work out the same but it would be more obviously correct if it
> were "count * sizeof(struct)"
>
> Actually, hang on where is the space for name itself allocated? I see,
> you are reallocing. If you have to do that anyway you may as well start
> off with just sizeof(count) and realloc namelen + sizeof(struct) at each
> stage.
I played with the idea of the struct for a bit and it has improved the
code, especially on restore.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |