2011/7/29 Stefano Stabellini <stefano.stabellini@eu.citrix.com>
On Fri, 29 Jul 2011, Jiageng Yu wrote:
> I have noticed the mistake. In fact, we shall stop the map_foreign_pages of xen_console and xenfb devices in qemu. Because
> the front drivers in stubdom has already map the memories. This is my new patch. But it is not stable, I am testing it.
>  
> We use xc_handle to map foreign pages in xenfb and xen_console devices. If qemu running on stubdom, the xc_handle is
> invalid.
>  
>  
> diff --git a/hw/xen_backend.c b/hw/xen_backend.c
> index cfb53c8..11c53fe 100644
> --- a/hw/xen_backend.c
> +++ b/hw/xen_backend.c
> @@ -47,6 +47,7 @@ XenXC xen_xc = XC_HANDLER_INITIAL_VALUE;
>  XenGnttab xen_xcg = XC_HANDLER_INITIAL_VALUE;
>  struct xs_handle *xenstore = NULL;
>  const char *xen_protocol;
> +XenXC xc_handle = XC_HANDLER_INITIAL_VALUE;
>  
>  /* private */
>  static QTAILQ_HEAD(XenDeviceHead, XenDevice) xendevs = QTAILQ_HEAD_INITIALIZER(xendevs);
> @@ -655,6 +656,7 @@ static void xen_be_evtchn_event(void *opaque)
>  
>  int xen_be_init(void)
>  {
> +#ifndef CONFIG_STUBDOM
>      xenstore = xs_daemon_open();
>      if (!xenstore) {
>          xen_be_printf(NULL, 0, "can't connect to xenstored\n");
> @@ -665,10 +667,16 @@ int xen_be_init(void)
>          goto err;
>      }
>  
> +    if (xc_handle == XC_HANDLER_INITIAL_VALUE) {
> +        goto err;
> +    }
> +#endif
> +
>      if (xen_xc == XC_HANDLER_INITIAL_VALUE) {
>          /* Check if xen_init() have been called */
>          goto err;
>      }
> +
>      return 0;
>  
>  err:
> diff --git a/hw/xen_backend.h b/hw/xen_backend.h
> index 9d36df3..bc5a157 100644
> --- a/hw/xen_backend.h
> +++ b/hw/xen_backend.h
> @@ -59,6 +59,9 @@ extern XenXC xen_xc;
>  extern struct xs_handle *xenstore;
>  extern const char *xen_protocol;
>  
> +/* invalid in linux stubdom */
> +extern XenXC xc_handle;
> +
>  /* xenstore helper functions */
>  int xenstore_write_str(const char *base, const char *node, const char *val);
>  int xenstore_write_int(const char *base, const char *node, int ival);
> diff --git a/hw/xen_console.c b/hw/xen_console.c
> index c6c8163..66b6dd7 100644
> --- a/hw/xen_console.c
> +++ b/hw/xen_console.c
> @@ -213,7 +213,7 @@ static int con_connect(struct XenDevice *xendev)
>      if (xenstore_read_int(con->console, "limit", &limit) == 0)
>   con->buffer.max_capacity = limit;
>  
> -    con->sring = xc_map_foreign_range(xen_xc, con->xendev.dom,
> +   con->sring = xc_map_foreign_range(xc_handle, con->xendev.dom,
>            XC_PAGE_SIZE,
>            PROT_READ|PROT_WRITE,
>            con->ring_ref);
> diff --git a/hw/xenfb.c b/hw/xenfb.c
> index 039076a..278fa60 100644
> --- a/hw/xenfb.c
> +++ b/hw/xenfb.c
> @@ -104,7 +104,7 @@ static int common_bind(struct common *c)
>      if (xenstore_read_fe_int(&c->xendev, "event-channel", &c->xendev.remote_port) == -1)
>   return -1;
>  
> -    c->page = xc_map_foreign_range(xen_xc, c->xendev.dom,
> +   c->page = xc_map_foreign_range(xc_handle, c->xendev.dom,
>         XC_PAGE_SIZE,
>         PROT_READ | PROT_WRITE, mfn);
>      if (c->page == NULL)
> @@ -482,14 +482,14 @@ static int xenfb_map_fb(struct XenFB *xenfb)
>      fbmfns = qemu_mallocz(sizeof(unsigned long) * xenfb->fbpages);
>  
>      xenfb_copy_mfns(mode, n_fbdirs, pgmfns, pd);
> -    map = xc_map_foreign_pages(xen_xc, xenfb->c.xendev.dom,
> +   map = xc_map_foreign_pages(xc_handle, xenfb->c.xendev.dom,
>            PROT_READ, pgmfns, n_fbdirs);
>      if (map == NULL)
>   goto out;
>      xenfb_copy_mfns(mode, xenfb->fbpages, fbmfns, map);
>      munmap(map, n_fbdirs * XC_PAGE_SIZE);
>  
> -    xenfb->pixels = xc_map_foreign_pages(xen_xc, xenfb->c.xendev.dom,
> +   xenfb->pixels = xc_map_foreign_pages(xc_handle, xenfb->c.xendev.dom,
>        PROT_READ | PROT_WRITE, fbmfns, xenfb->fbpages);
>      if (xenfb->pixels == NULL)
>   goto out;
> diff --git a/xen-all.c b/xen-all.c
> index b73fc43..04dfb51 100644
> --- a/xen-all.c
> +++ b/xen-all.c
> @@ -527,12 +534,22 @@ int xen_init(void)
>          return -1;
>      }
>  
> +#ifdef CONFIG_STUBDOM
> +    return 0;
> +#endif
> +
> +    xc_handle = xen_xc_interface_open(0, 0, 0);
> +    if (xc_handle == XC_HANDLER_INITIAL_VALUE) {
> +        xen_be_printf(NULL, 0, "can't open xen interface\n");
> +        return -1;
> +    }
> +
>      return 0;
>  }
>
>

I think that the backends shouldn't be initialized at all when running
in the stubdom, so I would do something like this instead:

diff --git a/xen-all.c b/xen-all.c
index 167bed6..e3f630b 100644
--- a/xen-all.c
+++ b/xen-all.c
@@ -922,6 +922,7 @@ int xen_hvm_init(void)
    cpu_register_phys_memory_client(&state->client);
    state->log_for_dirtybit = NULL;

+#ifndef CONFIG_STUBDOM
    /* Initialize backend core & drivers */
    if (xen_be_init() != 0) {
        fprintf(stderr, "%s: xen backend core setup failed\n", __FUNCTION__);
@@ -930,7 +931,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);
-
+#endif
    return 0;
 }
 

 
Yes. this implementation of stubdom is more closer to the old qemu's implementation. Which branch this patch works on? The qemu-dm-v15 would not so lucky.