From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45294) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XUGH2-0000io-7C for qemu-devel@nongnu.org; Wed, 17 Sep 2014 10:32:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XUGGu-0000Tf-Fi for qemu-devel@nongnu.org; Wed, 17 Sep 2014 10:32:00 -0400 Received: from smtp.citrix.com ([66.165.176.89]:35628) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XUGGu-0000Rt-Bb for qemu-devel@nongnu.org; Wed, 17 Sep 2014 10:31:52 -0400 From: Owen smith Date: Wed, 17 Sep 2014 15:30:40 +0100 Message-ID: <1410964242-3341-4-git-send-email-owen.smith@citrix.com> In-Reply-To: <1410964242-3341-1-git-send-email-owen.smith@citrix.com> References: <1410964242-3341-1-git-send-email-owen.smith@citrix.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH v2 3/5] xenfb: Add option to use a grant ref for shared page List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: stefano.stabellini@eu.citrix.com, Owen smith , xen-devel@lists.xen.org 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: Grant reference to use to map the shared ring. Only used if "page-ref" is not set. Signed-off-by: Owen smith --- 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