[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [Xen-devel] [PATCH v3 5/6] xen: record physmap changes
From: |
Ian Campbell |
Subject: |
Re: [Qemu-devel] [Xen-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore |
Date: |
Thu, 19 Jan 2012 12:24:56 +0000 |
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 <address@hidden>
> ---
> 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;
> }
- [Qemu-devel] [PATCH v3 0/6] save/restore on Xen, Stefano Stabellini, 2012/01/19
- [Qemu-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore, Stefano Stabellini, 2012/01/19
- Re: [Qemu-devel] [Xen-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore,
Ian Campbell <=
- Re: [Qemu-devel] [Xen-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore, Stefano Stabellini, 2012/01/19
- Re: [Qemu-devel] [Xen-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore, Ian Campbell, 2012/01/19
- Re: [Qemu-devel] [Xen-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore, Stefano Stabellini, 2012/01/19
- Re: [Qemu-devel] [Xen-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore, Avi Kivity, 2012/01/25
- Re: [Qemu-devel] [Xen-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore, Stefano Stabellini, 2012/01/25
- Re: [Qemu-devel] [Xen-devel] [PATCH v3 5/6] xen: record physmap changes to xenstore, Avi Kivity, 2012/01/25
[Qemu-devel] [PATCH v3 1/6] vl.c: do not save the RAM state when Xen is enabled, Stefano Stabellini, 2012/01/19
[Qemu-devel] [PATCH v3 2/6] xen mapcache: check if memory region has moved., Stefano Stabellini, 2012/01/19
[Qemu-devel] [PATCH v3 6/6] xen: change memory access behavior during migration., Stefano Stabellini, 2012/01/19
[Qemu-devel] [PATCH v3 3/6] Set runstate to INMIGRATE earlier, Stefano Stabellini, 2012/01/19