+ detaching-fbcon-fix-give_up_console.patch added to -mm tree

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

 



The patch titled

     Detaching fbcon: fix give_up_console()

has been added to the -mm tree.  Its filename is

     detaching-fbcon-fix-give_up_console.patch

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this

------------------------------------------------------
Subject: Detaching fbcon: fix give_up_console()
From: "Antonino A. Daplas" <adaplas@xxxxxxxxx>


To allow for detaching fbcon, it must be able to give up the console. 
However, the function give_up_console() is plain broken.  It just sets the
entries in the console driver map to NULL, it leaves the vt layer without a
console driver, and does not decrement the module reference count.  Calling
give_up_console() is guaranteed to hang the machine..

To fix this problem, ensure that the virtual consoles are not left dangling
without a driver.  All systems have a default boot driver (either vgacon or
dummycon) which is never unloaded.  For those vt's that lost their driver, the
default boot driver is reassigned back to them.

Signed-off-by: Antonino Daplas <adaplas@xxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 drivers/char/vt.c |   29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff -puN drivers/char/vt.c~detaching-fbcon-fix-give_up_console drivers/char/vt.c
--- devel/drivers/char/vt.c~detaching-fbcon-fix-give_up_console	2006-06-06 15:12:50.000000000 -0700
+++ devel-akpm/drivers/char/vt.c	2006-06-06 15:12:50.000000000 -0700
@@ -100,6 +100,7 @@
 
 
 const struct consw *conswitchp;
+static struct consw *defcsw; /* default console */
 
 /* A bitmap for codes <32. A bit of 1 indicates that the code
  * corresponding to that bit number invokes some special action
@@ -2673,17 +2674,23 @@ int take_over_console(const struct consw
 	if (!try_module_get(owner))
 		return -ENODEV;
 
-	acquire_console_sem();
+	/* save default console, for possible recovery later on */
+	if (!defcsw)
+		defcsw = (struct consw *) conswitchp;
 
+	acquire_console_sem();
 	desc = csw->con_startup();
+
 	if (!desc) {
 		release_console_sem();
 		module_put(owner);
 		return -ENODEV;
 	}
+
 	if (deflt) {
 		if (conswitchp)
 			module_put(conswitchp->owner);
+
 		__module_get(owner);
 		conswitchp = csw;
 	}
@@ -2701,6 +2708,7 @@ int take_over_console(const struct consw
 			continue;
 
 		j = i;
+
 		if (CON_IS_VISIBLE(vc)) {
 			k = i;
 			save_screen(vc);
@@ -2709,10 +2717,8 @@ int take_over_console(const struct consw
 		old_was_color = vc->vc_can_do_color;
 		vc->vc_sw->con_deinit(vc);
 		vc->vc_origin = (unsigned long)vc->vc_screenbuf;
-		vc->vc_visible_origin = vc->vc_origin;
-		vc->vc_scr_end = vc->vc_origin + vc->vc_screenbuf_size;
-		vc->vc_pos = vc->vc_origin + vc->vc_size_row * vc->vc_y + 2 * vc->vc_x;
 		visual_init(vc, i, 0);
+		set_origin(vc);
 		update_attr(vc);
 
 		/* If the console changed between mono <-> color, then
@@ -2741,22 +2747,29 @@ int take_over_console(const struct consw
 		printk("to %s\n", desc);
 
 	release_console_sem();
-
 	module_put(owner);
 	return 0;
 }
 
 void give_up_console(const struct consw *csw)
 {
-	int i;
+	int i, first = -1, last = -1, deflt = 0;
 
-	for(i = 0; i < MAX_NR_CONSOLES; i++)
+	for (i = 0; i < MAX_NR_CONSOLES; i++)
 		if (con_driver_map[i] == csw) {
+			if (first == -1)
+				first = i;
+			last = i;
 			module_put(csw->owner);
 			con_driver_map[i] = NULL;
 		}
-}
 
+	if (first != -1 && defcsw) {
+		if (first == 0 && last == MAX_NR_CONSOLES - 1)
+			deflt = 1;
+		take_over_console(defcsw, first, last, deflt);
+	}
+}
 #endif
 
 /*
_

Patches currently in -mm which might be from adaplas@xxxxxxxxx are

git-intelfb.patch
savagefb-allocate-space-for-current-and-saved-register.patch
savagefb-add-state-save-and_restore-hooks.patch
savagefb-add-state-save-and_restore-hooks-fix.patch
fbdev-more-accurate-sync-range-extrapolation.patch
nvidiafb-revise-pci_device_id-table.patch
atyfb-fix-hardware-cursor-handling.patch
atyfb-remove-unneeded-calls-to-wait_for_idle.patch
atyfb-set-correct-acceleration-flags.patch
epson1355fb-update-platform-code.patch
vesafb-update-platform-code.patch
vfb-update-platform-code.patch
vga16fb-update-platform-code.patch
fbdev-static-pseudocolor-with-depth-less-than-4-does.patch
savagefb-whitespace-cleanup.patch
fbdev-firmware-edid-fixes.patch
nvidiafb-add-support-for-geforce-6100-and-related-chipsets.patch
vesafb-fix-return-code-of-vesafb_setcolreg.patch
vesafb-prefer-vga-registers-over-pmi.patch
atyfb-fix-dead-code.patch
fbdev-coverity-bug-85.patch
fbdev-coverity-bug-90.patch
backlight-fix-kconfig-dependency.patch
detaching-fbcon-fix-vgacon-to-allow-retaking-of-the.patch
detaching-fbcon-fix-give_up_console.patch
detaching-fbcon-remove-calls-to-pci_disable_device.patch
detaching-fbcon-add-sysfs-class-device-entry-for-fbcon.patch
detaching-fbcon-clean-up-exit-code.patch
detaching-fbcon-add-capability-to-attach-detach-fbcon.patch
detaching-fbcon-update-documentation.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux