[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 3/5] xenfb: Add option to use a grant ref for shared page
Adds "page-gref" to the frontend location to specify the grant reference of the shared page. Adds the DEVOPS_FLAG_NEED_GNTDEV to both vfb and vkbd device flags. "page-ref" is checked first to avoid breaking existing frontends. "page-gref" Value: <uint32_t> Grant reference to use to map the shared ring. Only used if "page-ref" is not set. Signed-off-by: Owen smith <owen.smith@xxxxxxxxxx> --- hw/display/xenfb.c | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index 69471e9..829036f 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -54,6 +54,7 @@ struct common { struct XenDevice xendev; /* must be first */ void *page; + int page_gref; QemuConsole *con; }; @@ -96,22 +97,38 @@ static int common_bind(struct common *c) { uint64_t mfn; - if (xenstore_read_fe_uint64(&c->xendev, "page-ref", &mfn) == -1) - return -1; - assert(mfn == (xen_pfn_t)mfn); + if (xenstore_read_fe_uint64(&c->xendev, "page-ref", &mfn) == -1) { + if (xenstore_read_fe_int(&c->xendev, "page-gref", &c->page_gref) == -1) { + return -1; + } + } 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, - XC_PAGE_SIZE, - PROT_READ | PROT_WRITE, mfn); + if (c->page_gref) { + c->page = xc_gnttab_map_grant_ref(c->xendev.gnttabdev, + c->xendev.dom, c->page_gref, + PROT_READ | PROT_WRITE); + } else { + assert(mfn == (xen_pfn_t)mfn); + c->page = xc_map_foreign_range(xen_xc, c->xendev.dom, + XC_PAGE_SIZE, + PROT_READ | PROT_WRITE, mfn); + } if (c->page == NULL) return -1; xen_be_bind_evtchn(&c->xendev); - xen_be_printf(&c->xendev, 1, "ring mfn %"PRIx64", remote-port %d, local-port %d\n", - mfn, c->xendev.remote_port, c->xendev.local_port); + if (c->page_gref) { + xen_be_printf(&c->xendev, 1, + "ring gref %d, remote-port %d, local-port %d\n", + c->page_gref, c->xendev.remote_port, c->xendev.local_port); + } else { + xen_be_printf(&c->xendev, 1, + "ring mfn %"PRIx64", remote-port %d, local-port %d\n", + mfn, c->xendev.remote_port, c->xendev.local_port); + } return 0; } @@ -120,8 +137,13 @@ static void common_unbind(struct common *c) { xen_be_unbind_evtchn(&c->xendev); if (c->page) { - munmap(c->page, XC_PAGE_SIZE); - c->page = NULL; + if (c->page_gref) { + xc_gnttab_munmap(c->xendev.gnttabdev, c->page, 1); + } else { + munmap(c->page, XC_PAGE_SIZE); + } + c->page = NULL; + c->page_gref = 0; } } @@ -954,6 +976,7 @@ static void fb_event(struct XenDevice *xendev) struct XenDevOps xen_kbdmouse_ops = { .size = sizeof(struct XenInput), + .flags = DEVOPS_FLAG_NEED_GNTDEV, .init = input_init, .initialise = input_initialise, .connected = input_connected, @@ -963,6 +986,7 @@ struct XenDevOps xen_kbdmouse_ops = { struct XenDevOps xen_framebuffer_ops = { .size = sizeof(struct XenFB), + .flags = DEVOPS_FLAG_NEED_GNTDEV, .init = fb_init, .initialise = fb_initialise, .disconnect = fb_disconnect, -- 2.1.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |