Skip to content

Commit

Permalink
fb: Yet another band-aid for fixing lockdep mess
Browse files Browse the repository at this point in the history
I've still got lockdep warnings even after Alan's patch, and it seems that
yet more band aids are required to paper over similar paths for
unbind_con_driver() and unregister_con_driver().  After this hack, lockdep
warnings are finally gone.

Signed-off-by: Takashi Iwai <[email protected]>
Cc: Alan Cox <[email protected]>
Cc: Florian Tobias Schandinat <[email protected]>
Cc: Jiri Kosina <[email protected]>
Cc: stable <[email protected]>
Tested-by: Sedat Dilek <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
  • Loading branch information
tiwai authored and airlied committed Feb 8, 2013
1 parent 50e244c commit e93a9a8
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 17 deletions.
43 changes: 28 additions & 15 deletions drivers/tty/vt/vt.c
Original file line number Diff line number Diff line change
Expand Up @@ -3134,6 +3134,18 @@ static int con_is_graphics(const struct consw *csw, int first, int last)
* or 0 on success.
*/
int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
{
int retval;

console_lock();
retval = do_unbind_con_driver(csw, first, last, deflt);
console_unlock();
return retval;
}
EXPORT_SYMBOL(unbind_con_driver);

/* unlocked version of unbind_con_driver() */
int do_unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
{
struct module *owner = csw->owner;
const struct consw *defcsw = NULL;
Expand All @@ -3143,7 +3155,7 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
if (!try_module_get(owner))
return -ENODEV;

console_lock();
WARN_CONSOLE_UNLOCKED();

/* check if driver is registered and if it is unbindable */
for (i = 0; i < MAX_NR_CON_DRIVER; i++) {
Expand All @@ -3156,10 +3168,8 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
}
}

if (retval) {
console_unlock();
if (retval)
goto err;
}

retval = -ENODEV;

Expand All @@ -3175,15 +3185,11 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
}
}

if (retval) {
console_unlock();
if (retval)
goto err;
}

if (!con_is_bound(csw)) {
console_unlock();
if (!con_is_bound(csw))
goto err;
}

first = max(first, con_driver->first);
last = min(last, con_driver->last);
Expand Down Expand Up @@ -3212,13 +3218,12 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)

/* ignore return value, binding should not fail */
do_bind_con_driver(defcsw, first, last, deflt);
console_unlock();
err:
module_put(owner);
return retval;

}
EXPORT_SYMBOL(unbind_con_driver);
EXPORT_SYMBOL_GPL(do_unbind_con_driver);

static int vt_bind(struct con_driver *con)
{
Expand Down Expand Up @@ -3605,9 +3610,18 @@ EXPORT_SYMBOL(register_con_driver);
*/
int unregister_con_driver(const struct consw *csw)
{
int i, retval = -ENODEV;
int retval;

console_lock();
retval = do_unregister_con_driver(csw);
console_unlock();
return retval;
}
EXPORT_SYMBOL(unregister_con_driver);

int do_unregister_con_driver(const struct consw *csw)
{
int i, retval = -ENODEV;

/* cannot unregister a bound driver */
if (con_is_bound(csw))
Expand All @@ -3633,10 +3647,9 @@ int unregister_con_driver(const struct consw *csw)
}
}
err:
console_unlock();
return retval;
}
EXPORT_SYMBOL(unregister_con_driver);
EXPORT_SYMBOL_GPL(do_unregister_con_driver);

/*
* If we support more console drivers, this function is used
Expand Down
4 changes: 2 additions & 2 deletions drivers/video/console/fbcon.c
Original file line number Diff line number Diff line change
Expand Up @@ -3004,7 +3004,7 @@ static int fbcon_unbind(void)
{
int ret;

ret = unbind_con_driver(&fb_con, first_fb_vc, last_fb_vc,
ret = do_unbind_con_driver(&fb_con, first_fb_vc, last_fb_vc,
fbcon_is_default);

if (!ret)
Expand Down Expand Up @@ -3077,7 +3077,7 @@ static int fbcon_fb_unregistered(struct fb_info *info)
primary_device = -1;

if (!num_registered_fb)
unregister_con_driver(&fb_con);
do_unregister_con_driver(&fb_con);

return 0;
}
Expand Down
4 changes: 4 additions & 0 deletions drivers/video/fbmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1668,8 +1668,10 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)

if (!lock_fb_info(fb_info))
return -ENODEV;
console_lock();
event.info = fb_info;
ret = fb_notifier_call_chain(FB_EVENT_FB_UNBIND, &event);
console_unlock();
unlock_fb_info(fb_info);

if (ret)
Expand All @@ -1684,7 +1686,9 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
num_registered_fb--;
fb_cleanup_device(fb_info);
event.info = fb_info;
console_lock();
fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event);
console_unlock();

/* this may free fb info */
put_fb_info(fb_info);
Expand Down
1 change: 1 addition & 0 deletions include/linux/console.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ extern const struct consw prom_con; /* SPARC PROM console */
int con_is_bound(const struct consw *csw);
int register_con_driver(const struct consw *csw, int first, int last);
int unregister_con_driver(const struct consw *csw);
int do_unregister_con_driver(const struct consw *csw);
int take_over_console(const struct consw *sw, int first, int last, int deflt);
int do_take_over_console(const struct consw *sw, int first, int last, int deflt);
void give_up_console(const struct consw *sw);
Expand Down
2 changes: 2 additions & 0 deletions include/linux/vt_kern.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ void vt_event_post(unsigned int event, unsigned int old, unsigned int new);
int vt_waitactive(int n);
void change_console(struct vc_data *new_vc);
void reset_vc(struct vc_data *vc);
extern int do_unbind_con_driver(const struct consw *csw, int first, int last,
int deflt);
extern int unbind_con_driver(const struct consw *csw, int first, int last,
int deflt);
int vty_init(const struct file_operations *console_fops);
Expand Down

0 comments on commit e93a9a8

Please sign in to comment.