Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753262AbaLOPFh (ORCPT ); Mon, 15 Dec 2014 10:05:37 -0500 Received: from mail-ig0-f173.google.com ([209.85.213.173]:50054 "EHLO mail-ig0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750944AbaLOPFc (ORCPT ); Mon, 15 Dec 2014 10:05:32 -0500 MIME-Version: 1.0 X-Originating-IP: [84.73.67.144] In-Reply-To: <1418505257-5591-1-git-send-email-imre.deak@intel.com> References: <1418402285-9578-1-git-send-email-imre.deak@intel.com> <1418505257-5591-1-git-send-email-imre.deak@intel.com> Date: Mon, 15 Dec 2014 16:05:31 +0100 Message-ID: Subject: Re: [PATCH v2 1/3] vt: fix check for system/busy console drivers when unregistering them From: Daniel Vetter To: Imre Deak Cc: Greg Kroah-Hartman , Jiri Slaby , Peter Hurley , Linux Kernel Mailing List Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This seems to partially revert commit d9c660e750fdf982e1e2bdd0e76c1e6c4db4217b Author: Daniel Vetter Date: Thu Jun 5 16:29:56 2014 +0200 vt: Fix up unregistration of vt drivers A bunch of issues: - We should not kick out the default console (which is tracked in conswitchp), so check for that. - Add better error codes so callers can differentiate between "something went wrong" and "your driver isn't registered already". i915 needs that so it doesn't fall over when reloading the driver and hence vga_con is already unregistered. - There's a mess with the driver flags: What we need to check for is that the driver isn't used any more, i.e. unbound completely (FLAG_INIT). And not whether it's the boot console or not (which is the only one which doesn't have FLAG_MODULE). Otherwise there's no way to kick out the boot console, which i915 wants to do to prevent havoc with vga_con interferring (which tends to hang machines). Cc: Greg Kroah-Hartman Cc: Jiri Slaby Reviewed-by: David Herrmann Acked-by: Greg Kroah-Hartman Signed-off-by: Daniel Vetter We really need to unregister vgacon when i915 loads since we completely kill vga support - just unbinding is not enough since then vgacon will be resurrect on module unload, killing the machine. And module unload is really important to stay sane as kernel driver hacker. If we need more precise checks for unregistering then I think we need to fix up that mess with the flags ... -Daniel On Sat, Dec 13, 2014 at 10:14 PM, Imre Deak wrote: > System console drivers (without the CON_DRIVER_FLAG_MODULE flag) and > busy drivers bound to a console (as reported by con_is_bound()) > shouldn't be unregistered. The current code checks for the > CON_DRIVER_FLAG_INIT flag but this doesn't really correspond to either > of the above two conditions. CON_DRIVER_FLAG_INIT is set whenever its > associated console's con_startup() function is called, which first > happens when the console driver is registered (so before the console > gets bound) and gets cleared when the console gets unbound. The > purpose of this flag is to show if we need to call con_startup() on a > console before we use it. > > Based on the above, do_unregister_con_driver() in its current form will > incorrectly allow unregistering a console driver only if it was never > bound, but will refuse to unregister one that was bound and later > unbound. It will also allow unregistering a system console driver. > > Fix this by checking for CON_DRIVER_FLAG_MODULE to allow non-system > console drivers to unregister and prevent system console drivers from > unregistering. Rely on the existing con_is_bound() check earlier in the > function to refuse unregistering a busy console driver. > > v2: > - reword the third paragraph to clarify how the fix works (Peter Hurley) > > Signed-off-by: Imre Deak > --- > drivers/tty/vt/vt.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c > index b33b00b..1862e89 100644 > --- a/drivers/tty/vt/vt.c > +++ b/drivers/tty/vt/vt.c > @@ -3660,7 +3660,7 @@ int do_unregister_con_driver(const struct consw *csw) > struct con_driver *con_driver = ®istered_con_driver[i]; > > if (con_driver->con == csw && > - con_driver->flag & CON_DRIVER_FLAG_INIT) { > + con_driver->flag & CON_DRIVER_FLAG_MODULE) { > vtconsole_deinit_device(con_driver); > device_destroy(vtconsole_class, > MKDEV(0, con_driver->node)); > -- > 1.8.4 > -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/