Am 08.02.22 um 22:08 schrieb Daniel Vetter:
No idea why con2fb_acquire_newinfo() initializes much less than
fbcon_startup(), but so be it. From a quick look most of the
un-initialized stuff should be fairly harmless, but who knows.

Note that the error handling for the con2fb_acquire_newinfo() failure
case was very strange: Callers updated con2fb_map to the new value
before calling this function, but upon error con2fb_acquire_newinfo
reset it to the old value. Since I removed the call to fbcon_release
anyway that strange error path was sticking out like a sore thumb,
hence I removed it. Which also allows us to remove the oldidx
parameter from that function.

v2: Explain what's going on with oldidx and error paths (Sam)

v3: Drop unused variable (0day)

Acked-by: Sam Ravnborg <s...@ravnborg.org> (v2)
Cc: kernel test robot <l...@intel.com>
Signed-off-by: Daniel Vetter <daniel.vet...@intel.com>
Cc: Daniel Vetter <dan...@ffwll.ch>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
Cc: Tetsuo Handa <penguin-ker...@i-love.sakura.ne.jp>
Cc: Thomas Zimmermann <tzimmerm...@suse.de>
Cc: Claudio Suarez <c...@net-c.es>
Cc: Du Cheng <duche...@gmail.com>

Acked-by: Thomas Zimmermann <tzimmerm...@suse.de>

That's the init function I was looking for, I guess.

---
  drivers/video/fbdev/core/fbcon.c | 75 +++++++++++++-------------------
  1 file changed, 30 insertions(+), 45 deletions(-)

diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index a60891005d44..f0213a0e3870 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -682,8 +682,18 @@ static int fbcon_invalid_charcount(struct fb_info *info, 
unsigned charcount)
#endif /* CONFIG_MISC_TILEBLITTING */ +static void fbcon_release(struct fb_info *info)
+{
+       if (info->fbops->fb_release)
+               info->fbops->fb_release(info, 0);
+
+       module_put(info->fbops->owner);
+}
+
  static int fbcon_open(struct fb_info *info)
  {
+       struct fbcon_ops *ops;
+
        if (!try_module_get(info->fbops->owner))
                return -ENODEV;
@@ -693,48 +703,31 @@ static int fbcon_open(struct fb_info *info)
                return -ENODEV;
        }
- return 0;
-}
+       ops = kzalloc(sizeof(struct fbcon_ops), GFP_KERNEL);
+       if (!ops) {
+               fbcon_release(info);
+               return -ENOMEM;
+       }
-static void fbcon_release(struct fb_info *info)
-{
-       if (info->fbops->fb_release)
-               info->fbops->fb_release(info, 0);
+       INIT_DELAYED_WORK(&ops->cursor_work, fb_flashcursor);
+       ops->info = info;
+       info->fbcon_par = ops;
+       ops->cur_blink_jiffies = HZ / 5;
- module_put(info->fbops->owner);
+       return 0;
  }
static int con2fb_acquire_newinfo(struct vc_data *vc, struct fb_info *info,
-                                 int unit, int oldidx)
+                                 int unit)
  {
-       struct fbcon_ops *ops = NULL;
        int err;
err = fbcon_open(info);
        if (err)
                return err;
- if (!err) {
-               ops = kzalloc(sizeof(struct fbcon_ops), GFP_KERNEL);
-               if (!ops)
-                       err = -ENOMEM;
-
-               INIT_DELAYED_WORK(&ops->cursor_work, fb_flashcursor);
-       }
-
-       if (!err) {
-               ops->cur_blink_jiffies = HZ / 5;
-               ops->info = info;
-               info->fbcon_par = ops;
-
-               if (vc)
-                       set_blitting_type(vc, info);
-       }
-
-       if (err) {
-               con2fb_map[unit] = oldidx;
-               fbcon_release(info);
-       }
+       if (vc)
+               set_blitting_type(vc, info);
return err;
  }
@@ -842,9 +835,11 @@ static int set_con2fb_map(int unit, int newidx, int user)
found = search_fb_in_map(newidx); - con2fb_map[unit] = newidx;
-       if (!err && !found)
-               err = con2fb_acquire_newinfo(vc, info, unit, oldidx);
+       if (!err && !found) {
+               err = con2fb_acquire_newinfo(vc, info, unit);
+               if (!err)
+                       con2fb_map[unit] = newidx;
+       }
/*
         * If old fb is not mapped to any of the consoles,
@@ -941,20 +936,10 @@ static const char *fbcon_startup(void)
        if (fbcon_open(info))
                return NULL;
- ops = kzalloc(sizeof(struct fbcon_ops), GFP_KERNEL);
-       if (!ops) {
-               fbcon_release(info);
-               return NULL;
-       }
-
-       INIT_DELAYED_WORK(&ops->cursor_work, fb_flashcursor);
-
+       ops = info->fbcon_par;
        ops->currcon = -1;
        ops->graphics = 1;
        ops->cur_rotate = -1;
-       ops->cur_blink_jiffies = HZ / 5;
-       ops->info = info;
-       info->fbcon_par = ops;
p->con_rotate = initial_rotation;
        if (p->con_rotate == -1)
@@ -1024,7 +1009,7 @@ static void fbcon_init(struct vc_data *vc, int init)
                return;
if (!info->fbcon_par)
-               con2fb_acquire_newinfo(vc, info, vc->vc_num, -1);
+               con2fb_acquire_newinfo(vc, info, vc->vc_num);
/* If we are not the first console on this
           fb, copy the font from that console */

--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Reply via email to