From mboxrd@z Thu Jan 1 00:00:00 1970 From: Samuel Thibault Subject: [PATCH] xenfb: make restartable [Was: pv-grub doesn't run on rhel5] Date: Thu, 14 Aug 2008 19:02:51 +0100 Message-ID: <20080814180251.GD4590@implementation.uk.xensource.com> References: <48A40B17.2090701@redhat.com> <20080814111520.GH4590@implementation.uk.xensource.com> <48A4232B.6040500@redhat.com> <20080814122931.GL4590@implementation.uk.xensource.com> <48A43EAD.7040701@redhat.com> <20080814142849.GS4590@implementation.uk.xensource.com> <48A44967.4060401@redhat.com> <20080814151359.GT4590@implementation.uk.xensource.com> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Return-path: Content-Disposition: inline In-Reply-To: <20080814151359.GT4590@implementation.uk.xensource.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Gerd Hoffmann , Xen Development Mailing List List-Id: xen-devel@lists.xenproject.org Samuel Thibault, le Thu 14 Aug 2008 16:14:00 +0100, a =E9crit : > > Another pvgrub issue: Is booting guests with the framebuffer enabled > > supposed to work? >=20 > Yes, but you have to not enable the framebuffer in the grub > configuration, because the framebuffer is currently not able to restart= . Oh actually it was a lot easier than I thought, see patch below (which is actually partly bug fixes). xenfb: make restartable - Fix the pixel unmapping, which should happen during the Closing state. - Fix qemu segfault when a guest shuts its fb down. - Once connected, if frontend state goes from Closed to Initialized, restart the connection loop. Signed-off-by: Samuel Thibault diff -r 38783464a671 extras/mini-os/fbfront.c --- a/extras/mini-os/fbfront.c Thu Aug 14 16:16:44 2008 +0100 +++ b/extras/mini-os/fbfront.c Thu Aug 14 18:59:27 2008 +0100 @@ -226,8 +226,7 @@ void shutdown_kbdfront(struct kbdfront_d xenbus_wait_for_value(path, "6", &dev->events); =20 err =3D xenbus_printf(XBT_NIL, nodename, "state", "%u", 1); - // does not work yet. - //xenbus_wait_for_value(path, "2", &dev->events); + xenbus_wait_for_value(path, "2", &dev->events); =20 xenbus_unwatch_path(XBT_NIL, path); =20 @@ -566,8 +565,7 @@ void shutdown_fbfront(struct fbfront_dev xenbus_wait_for_value(path, "6", &dev->events); =20 err =3D xenbus_printf(XBT_NIL, nodename, "state", "%u", 1); - // does not work yet - //xenbus_wait_for_value(path, "2", &dev->events); + xenbus_wait_for_value(path, "2", &dev->events); =20 xenbus_unwatch_path(XBT_NIL, path); =20 diff -r 38783464a671 stubdom/README --- a/stubdom/README Thu Aug 14 16:16:44 2008 +0100 +++ b/stubdom/README Thu Aug 14 18:59:27 2008 +0100 @@ -126,9 +126,4 @@ Limitations =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 - You can not boot a 64bit kernel with a 32bit-compiled PV-GRUB and vice= -versa. -To cross-compile a 32bit PV-GRUB, - -export XEN_TARGET_ARCH=3Dx86_32 - -- bootsplash is supported, but the ioemu backend does not yet support re= start -for use by the booted kernel. +You need to choose between pv-grub-x86_64.gz and pv-grub-x86_32.gz diff -r 38783464a671 tools/ioemu/hw/xenfb.c --- a/tools/ioemu/hw/xenfb.c Thu Aug 14 16:16:44 2008 +0100 +++ b/tools/ioemu/hw/xenfb.c Thu Aug 14 18:59:27 2008 +0100 @@ -445,6 +445,13 @@ static void xenfb_unbind(struct xenfb_de xc_evtchn_unbind(dev->xenfb->evt_xch, dev->port); dev->port =3D -1; } + + if (!strcmp(dev->devicetype, "vfb")) { + if (dev->xenfb->pixels) { + munmap(dev->xenfb->pixels, dev->xenfb->fb_len); + dev->xenfb->pixels =3D NULL; + } + } } =20 =20 @@ -452,10 +459,6 @@ static void xenfb_detach_dom(struct xenf { xenfb_unbind(&xenfb->fb); xenfb_unbind(&xenfb->kbd); - if (xenfb->pixels) { - munmap(xenfb->pixels, xenfb->fb_len); - xenfb->pixels =3D NULL; - } } =20 /* Remove the backend area in xenbus since the framebuffer really is @@ -653,6 +656,16 @@ static int xenfb_on_state_change(struct=20 not much point in us continuing. */ return -1; case XenbusStateInitialising: + if (dev->state !=3D XenbusStateClosed) + /* Do not let a domain make us skip the closing state */ + return 0; + xenfb_switch_state(dev, XenbusStateInitWait); + xs_unwatch(dev->xenfb->xsh, dev->otherend, ""); + if (!strcmp(dev->devicetype, "vkbd")) { + fprintf(stderr, "FB: Waiting for KBD backend creation\n"); + xenfb_wait_for_frontend(&dev->xenfb->kbd, xenfb_frontend_initializ= ed_kbd); + } + break; case XenbusStateInitWait: case XenbusStateInitialised: case XenbusStateConnected: @@ -1274,6 +1287,9 @@ static void xenfb_update(void *opaque) struct xenfb *xenfb =3D opaque; int period; =20 + if (!xenfb->fb.page) + return; + if (xenfb_queue_full(xenfb)) return; =20