[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore
On Thu, 2012-01-19 at 11:56 +0000, Stefano Stabellini wrote: > Write to xenstore any physmap changes so that the hypervisor can be > aware of them. What is the structure of the xenstore values? Looks like <domid>/physmap/<original-addr>/start_addr <new-addr> ? Who defines the meaning of original-addr, in particular what happens if it the original-addr for a device changes in a N->N+1 migration? What happens if things overlap or if a subsequent call only updates part of a previously moved mapping? > Read physmap changes from xenstore on boot. > > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > --- > xen-all.c | 62 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 62 insertions(+), 0 deletions(-) > > diff --git a/xen-all.c b/xen-all.c > index 507d93d..c830cb1 100644 > --- a/xen-all.c > +++ b/xen-all.c > @@ -253,6 +253,7 @@ static int xen_add_to_physmap(XenIOState *state, > XenPhysmap *physmap = NULL; > target_phys_addr_t pfn, start_gpfn; > target_phys_addr_t phys_offset = memory_region_get_ram_addr(mr); > + char path[80], value[17]; > > if (get_physmapping(state, start_addr, size)) { > return 0; > @@ -299,6 +300,22 @@ go_physmap: > start_addr >> TARGET_PAGE_BITS, > (start_addr + size) >> TARGET_PAGE_BITS, > XEN_DOMCTL_MEM_CACHEATTR_WB); > + > + snprintf(path, sizeof(path), > + "/local/domain/0/device-model/%d/physmap/%"PRIx64"/start_addr", > + xen_domid, (uint64_t)phys_offset); > + snprintf(value, sizeof(value), "%"PRIx64, (uint64_t)start_addr); > + if (!xs_write(state->xenstore, 0, path, value, strlen(value))) { > + return -1; > + } > + snprintf(path, sizeof(path), > + "/local/domain/0/device-model/%d/physmap/%"PRIx64"/size", > + xen_domid, (uint64_t)phys_offset); > + snprintf(value, sizeof(value), "%"PRIx64, (uint64_t)size); > + if (!xs_write(state->xenstore, 0, path, value, strlen(value))) { > + return -1; > + } > + > return 0; > } > > @@ -926,6 +943,50 @@ int xen_init(void) > return 0; > } > > +static void xen_read_physmap(XenIOState *state) > +{ > + XenPhysmap *physmap = NULL; > + unsigned int len, num, i; > + char path[80], *value = NULL; > + char **entries = NULL; > + > + snprintf(path, sizeof(path), > + "/local/domain/0/device-model/%d/physmap", xen_domid); > + entries = xs_directory(state->xenstore, 0, path, &num); > + if (entries == NULL) > + return; > + > + for (i = 0; i < num; i++) { > + physmap = g_malloc(sizeof (XenPhysmap)); > + physmap->phys_offset = strtoull(entries[i], NULL, 16); > + snprintf(path, sizeof(path), > + "/local/domain/0/device-model/%d/physmap/%s/start_addr", > + xen_domid, entries[i]); > + value = xs_read(state->xenstore, 0, path, &len); > + if (value == NULL) { > + free(physmap); > + continue; > + } > + physmap->start_addr = strtoull(value, NULL, 16); > + free(value); > + > + snprintf(path, sizeof(path), > + "/local/domain/0/device-model/%d/physmap/%s/size", > + xen_domid, entries[i]); > + value = xs_read(state->xenstore, 0, path, &len); > + if (value == NULL) { > + free(physmap); > + continue; > + } > + physmap->size = strtoull(value, NULL, 16); > + free(value); > + > + QLIST_INSERT_HEAD(&state->physmap, physmap, list); > + } > + free(entries); > + return; > +} > + > int xen_hvm_init(void) > { > int i, rc; > @@ -998,6 +1059,7 @@ int xen_hvm_init(void) > xen_be_register("console", &xen_console_ops); > xen_be_register("vkbd", &xen_kbdmouse_ops); > xen_be_register("qdisk", &xen_blkdev_ops); > + xen_read_physmap(state); > > return 0; > } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |