[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] xenfb: make restartable [Was: pv-grub doesn't run on rhel5]



Samuel Thibault, le Thu 14 Aug 2008 16:14:00 +0100, a écrit :
> > Another pvgrub issue:  Is booting guests with the framebuffer enabled
> > supposed to work?
> 
> 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 <samuel.thibault@xxxxxxxxxxxxx>

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);
 
     err = 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);
 
     xenbus_unwatch_path(XBT_NIL, path);
 
@@ -566,8 +565,7 @@ void shutdown_fbfront(struct fbfront_dev
     xenbus_wait_for_value(path, "6", &dev->events);
 
     err = 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);
 
     xenbus_unwatch_path(XBT_NIL, path);
 
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
 ===========
 
 - 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=x86_32
-
-- bootsplash is supported, but the ioemu backend does not yet support restart
-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 = -1;
        }
+
+       if (!strcmp(dev->devicetype, "vfb")) {
+           if (dev->xenfb->pixels) {
+                   munmap(dev->xenfb->pixels, dev->xenfb->fb_len);
+                   dev->xenfb->pixels = NULL;
+           }
+       }
 }
 
 
@@ -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 = NULL;
-       }
 }
 
 /* Remove the backend area in xenbus since the framebuffer really is
@@ -653,6 +656,16 @@ static int xenfb_on_state_change(struct 
                   not much point in us continuing. */
                return -1;
        case XenbusStateInitialising:
+               if (dev->state != 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_initialized_kbd);
+               }
+               break;
        case XenbusStateInitWait:
        case XenbusStateInitialised:
        case XenbusStateConnected:
@@ -1274,6 +1287,9 @@ static void xenfb_update(void *opaque)
     struct xenfb *xenfb = opaque;
     int period;
 
+    if (!xenfb->fb.page)
+        return;
+
     if (xenfb_queue_full(xenfb))
         return;
 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.