Skip to content

Commit

Permalink
fbcon: untangle fbcon_exit
Browse files Browse the repository at this point in the history
There's a bunch of confusions going on here:
- The deferred fbcon setup notifier should only be cleaned up from
  fb_console_exit(), to be symmetric with fb_console_init()
- We also need to make sure we don't race with the work, which means
  temporarily dropping the console lock (or we can deadlock)
- That also means no point in clearing deferred_takeover, we are
  unloading everything anyway.
- Finally rename fbcon_exit to fbcon_release_all and move it, since
  that's what's it doing when being called from consw->con_deinit
  through fbcon_deinit.

To answer a question from Sam just quoting my own reply:

> We loose the call to fbcon_release_all() here [in fb_console_exit()].
> We have part of the old fbcon_exit() above, but miss the release parts.

Ah yes that's the entire point of this change. The release_all in the
fbcon exit path was only needed when fbcon was a separate module
indepedent from core fb.ko. Which means it was possible to unload fbcon
while having fbdev drivers registered.

But since we've merged them that has become impossible, so by the time the
fb.ko module can be unloaded, there's guaranteed to be no fbdev drivers
left. And hence removing them is pointless.

v2: Explain the why better (Sam)

Acked-by: Sam Ravnborg <[email protected]>
Signed-off-by: Daniel Vetter <[email protected]>
Cc: Daniel Vetter <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: Claudio Suarez <[email protected]>
Cc: Du Cheng <[email protected]>
Cc: Tetsuo Handa <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
  • Loading branch information
danvet committed Apr 7, 2022
1 parent 3647d6d commit c75300b
Showing 1 changed file with 32 additions and 31 deletions.
63 changes: 32 additions & 31 deletions drivers/video/fbdev/core/fbcon.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,6 @@ static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p,
int line, int count, int dy);
static void fbcon_modechanged(struct fb_info *info);
static void fbcon_set_all_vcs(struct fb_info *info);
static void fbcon_exit(void);

static struct device *fbcon_device;

Expand Down Expand Up @@ -1146,6 +1145,27 @@ static void fbcon_free_font(struct fbcon_display *p, bool freefont)

static void set_vc_hi_font(struct vc_data *vc, bool set);

static void fbcon_release_all(void)
{
struct fb_info *info;
int i, j, mapped;

for_each_registered_fb(i) {
mapped = 0;
info = registered_fb[i];

for (j = first_fb_vc; j <= last_fb_vc; j++) {
if (con2fb_map[j] == i) {
mapped = 1;
con2fb_map[j] = -1;
}
}

if (mapped)
fbcon_release(info);
}
}

static void fbcon_deinit(struct vc_data *vc)
{
struct fbcon_display *p = &fb_display[vc->vc_num];
Expand Down Expand Up @@ -1185,7 +1205,7 @@ static void fbcon_deinit(struct vc_data *vc)
set_vc_hi_font(vc, false);

if (!con_is_bound(&fb_con))
fbcon_exit();
fbcon_release_all();

if (vc->vc_num == logo_shown)
logo_shown = FBCON_LOGO_CANSHOW;
Expand Down Expand Up @@ -3296,34 +3316,6 @@ static void fbcon_start(void)
#endif
}

static void fbcon_exit(void)
{
struct fb_info *info;
int i, j, mapped;

#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
if (deferred_takeover) {
dummycon_unregister_output_notifier(&fbcon_output_nb);
deferred_takeover = false;
}
#endif

for_each_registered_fb(i) {
mapped = 0;
info = registered_fb[i];

for (j = first_fb_vc; j <= last_fb_vc; j++) {
if (con2fb_map[j] == i) {
mapped = 1;
con2fb_map[j] = -1;
}
}

if (mapped)
fbcon_release(info);
}
}

void __init fb_console_init(void)
{
int i;
Expand Down Expand Up @@ -3363,10 +3355,19 @@ static void __exit fbcon_deinit_device(void)

void __exit fb_console_exit(void)
{
#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
console_lock();
if (deferred_takeover)
dummycon_unregister_output_notifier(&fbcon_output_nb);
console_unlock();

cancel_work_sync(&fbcon_deferred_takeover_work);
#endif

console_lock();
fbcon_deinit_device();
device_destroy(fb_class, MKDEV(0, 0));
fbcon_exit();

do_unregister_con_driver(&fb_con);
console_unlock();
}
Expand Down

0 comments on commit c75300b

Please sign in to comment.