[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 3/5] xenfb: Add option to use a grant ref for shared page
On Wed, 17 Sep 2014, Owen smith wrote: > 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> As Ian pointed out, the docs need to be updated before I am going to push this change upstream. Aside from that Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > 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 |