[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 2/3] libxl: save/restore qemu's physmap
Stefano Stabellini writes ("[Xen-devel] [PATCH v6 2/3] libxl: save/restore qemu's physmap"): > Read Qemu's physmap from xenstore and save it using toolstack_save. > Restore Qemu's physmap using toolstack_restore. > +static int libxl__toolstack_restore(uint32_t domid, uint8_t *buf, > + uint32_t size, void *data) ... > + if (size < sizeof(version) + sizeof(count)) > + return -1; > + > + memcpy(&version, ptr, sizeof(version)); > + ptr += sizeof(version); > + > + if (version != TOOLSTACK_SAVE_VERSION) > + return -1; Surely these error exits need log messages. > + for (i = 0; i < count; i++) { > + pi = (struct libxl__physmap_info*) ptr; > + ptr += sizeof(struct libxl__physmap_info) + pi->namelen; > + > + ret = libxl__xs_write(gc, 0, libxl__sprintf(gc, > + > "/local/domain/0/device-model/%d/physmap/%"PRIx64"/start_addr", Long line. > + domid, pi->phys_offset), "%"PRIx64, pi->start_addr); > + if (ret) > + return -1; > + ret = libxl__xs_write(gc, 0, libxl__sprintf(gc, > + "/local/domain/0/device-model/%d/physmap/%"PRIx64"/size", > + domid, pi->phys_offset), "%"PRIx64, pi->size); This whole thing contains a lot of repetitive code. Can you perhaps break the xs_write into a helper function and then you'd make the repetition more explicit by writing something like: helper(gc, domid, "start_addr", "%"PRIx64, pi->start_addr); helper(gc, domid, "name", "%"PRIx64, pi->size); if (pi->namelen) helper(gc, domid, "name", "%s", pi->name); > +static int libxl__toolstack_save(uint32_t domid, uint8_t **buf, > + uint32_t *len, void *data) > +{ ... > + *buf = calloc(1, *len); Surely this should come from the gc. > + start_addr = libxl__xs_read(gc, 0, libxl__sprintf(gc, > + "/local/domain/0/device-model/%d/physmap/%s/start_addr", > + domid, phys_offset)); > + size = libxl__xs_read(gc, 0, libxl__sprintf(gc, > + "/local/domain/0/device-model/%d/physmap/%s/size", > + domid, phys_offset)); > + name = libxl__xs_read(gc, 0, libxl__sprintf(gc, > + "/local/domain/0/device-model/%d/physmap/%s/name", > + domid, phys_offset)); Again, quite a lot of repetition which obscures the similarities between the different calls. > + if (start_addr == NULL || size == NULL || phys_offset == NULL) > + return -1; This seems a rather odd condition. Surely it is an error if only some of these parameters are in xenstore ? > + if (name == NULL) > + namelen = 0; > + else > + namelen = strlen(name) + 1; > + *len += namelen + sizeof(struct libxl__physmap_info); > + offset = ptr - (*buf); > + *buf = realloc(*buf, *len); Shouldn't this come from the gc ? Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |