Index: trunk/src/VBox/Additions/linux/drm/vbox_drv.c
===================================================================
--- trunk/src/VBox/Additions/linux/drm/vbox_drv.c	(revision 62550)
+++ trunk/src/VBox/Additions/linux/drm/vbox_drv.c	(revision 62557)
@@ -217,6 +217,8 @@
 {
     struct vbox_private *vbox = dev->dev_private;
+    /* We do not yet know whether the new owner can handle hotplug, so we
+     * do not advertise dynamic modes on the first query and send a
+     * tentative hotplug notification after that to see if they query again. */
     vbox->initial_mode_queried = false;
-    vbox_disable_accel(vbox);
     return 0;
 }
@@ -228,5 +230,10 @@
     struct vbox_private *vbox = dev->dev_private;
     vbox->initial_mode_queried = false;
+    mutex_lock(&vbox->hw_mutex);
+    /* Disable VBVA when someone releases master in case the next person tries
+     * to do VESA. */
+    /** @todo work out if anyone is likely to and whether it will even work. */
     vbox_disable_accel(vbox);
+    mutex_unlock(&vbox->hw_mutex);
 }
 
Index: trunk/src/VBox/Additions/linux/drm/vbox_main.c
===================================================================
--- trunk/src/VBox/Additions/linux/drm/vbox_main.c	(revision 62550)
+++ trunk/src/VBox/Additions/linux/drm/vbox_main.c	(revision 62557)
@@ -111,36 +111,36 @@
 {
     struct vbox_private *vbox = fb->dev->dev_private;
+    struct drm_crtc *crtc;
     unsigned i;
 
     LogFunc(("vboxvideo: %d: fb=%p, num_rects=%u, vbox=%p\n", __LINE__, fb,
              num_rects, vbox));
-    vbox_enable_accel(vbox);
     mutex_lock(&vbox->hw_mutex);
-    for (i = 0; i < num_rects; ++i)
-    {
-        struct drm_crtc *crtc;
-        list_for_each_entry(crtc, &fb->dev->mode_config.crtc_list, head)
-        {
-            unsigned crtc_id = to_vbox_crtc(crtc)->crtc_id;
-            VBVACMDHDR cmd_hdr;
-
-            if (   CRTC_FB(crtc) != fb
-                || rects[i].x1 >   crtc->x
-                                  + crtc->hwmode.hdisplay
-                || rects[i].y1 >   crtc->y
-                                  + crtc->hwmode.vdisplay
-                || rects[i].x2 < crtc->x
-                || rects[i].y2 < crtc->y)
-                continue;
-            cmd_hdr.x = (int16_t)rects[i].x1;
-            cmd_hdr.y = (int16_t)rects[i].y1;
-            cmd_hdr.w = (uint16_t)rects[i].x2 - rects[i].x1;
-            cmd_hdr.h = (uint16_t)rects[i].y2 - rects[i].y1;
-            if (VBoxVBVABufferBeginUpdate(&vbox->vbva_info[crtc_id],
-                                          &vbox->submit_info))
+    list_for_each_entry(crtc, &fb->dev->mode_config.crtc_list, head) {
+        if (CRTC_FB(crtc) == fb) {
+            vbox_enable_accel(vbox);
+            for (i = 0; i < num_rects; ++i)
             {
-                VBoxVBVAWrite(&vbox->vbva_info[crtc_id], &vbox->submit_info, &cmd_hdr,
-                              sizeof(cmd_hdr));
-                VBoxVBVABufferEndUpdate(&vbox->vbva_info[crtc_id]);
+                unsigned crtc_id = to_vbox_crtc(crtc)->crtc_id;
+                VBVACMDHDR cmd_hdr;
+
+                if (   rects[i].x1 >   crtc->x
+                                      + crtc->hwmode.hdisplay
+                    || rects[i].y1 >   crtc->y
+                                      + crtc->hwmode.vdisplay
+                    || rects[i].x2 < crtc->x
+                    || rects[i].y2 < crtc->y)
+                    continue;
+                cmd_hdr.x = (int16_t)rects[i].x1;
+                cmd_hdr.y = (int16_t)rects[i].y1;
+                cmd_hdr.w = (uint16_t)rects[i].x2 - rects[i].x1;
+                cmd_hdr.h = (uint16_t)rects[i].y2 - rects[i].y1;
+                if (VBoxVBVABufferBeginUpdate(&vbox->vbva_info[crtc_id],
+                                              &vbox->submit_info))
+                {
+                    VBoxVBVAWrite(&vbox->vbva_info[crtc_id], &vbox->submit_info, &cmd_hdr,
+                                  sizeof(cmd_hdr));
+                    VBoxVBVABufferEndUpdate(&vbox->vbva_info[crtc_id]);
+                }
             }
         }
Index: trunk/src/VBox/Additions/linux/drm/vbox_mode.c
===================================================================
--- trunk/src/VBox/Additions/linux/drm/vbox_mode.c	(revision 62550)
+++ trunk/src/VBox/Additions/linux/drm/vbox_mode.c	(revision 62557)
@@ -260,4 +260,8 @@
     vbox_crtc_mode_set_base(crtc, x, y, old_fb);
     mutex_lock(&vbox->hw_mutex);
+    /* Disable VBVA when someone sets a new mode until they send us dirty
+     * rectangles, which proves that they can.  A single screen can work
+     * without VBVA. */
+    vbox_disable_accel(vbox);
     rc = vbox_set_view(crtc);
     if (!rc)
