[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.