2.6.0-ben3: Badness in redraw_screen
Kevin B. Hendricks
kevin.hendricks at sympatico.ca
Thu Jan 1 02:37:21 EST 2004
Hi,
In the first hunk of your patch you can possibly grab the semaphore and
then do a return 1 with the semaphore held.
If you really need to hold the semaphore to do a vc_allocate then you
should remember to release that semaphore before doing the return 1
So something along the lines of ...
acquire_console_sem();
if (vc_allocate(SUSPEND_CONSOLE)) {
release_console_sme();
return 1;
}
would be better I think if you really do need to hold the console_sem()
before calling vc_allocate.
Kevin
On Dec 31, 2003, at 9:15 AM, Michael Schmitz wrote:
> [CC to debian-powerpc as this was reported there as well ...]
>
>>> I'm getting this badness in redraw_screen when my iBook wakes up with
>>> 2.6.0-ben3:
>>>
>>> Badness in redraw_screen at drivers/char/vt.c:596
>>> Call trace:
>>> [c000bd50] dump_stack+0x18/0x28
>>> [c0008c44] check_bug_trap+0x84/0xac
>>> [c0008d34] ProgramCheckException+0xc8/0x180
>>> [c00082cc] ret_from_except_full+0x0/0x4c
>>> [c015a94c] redraw_screen+0x2c/0x1e0
>>> [c00376b4] pm_restore_console+0x38/0x48
>>> [c039ef14] 0xc039ef14
>>> [c039f468] 0xc039f468
>>> [c039fdc8] 0xc039fdc8
>>> [c00701d0] sys_ioctl+0x278/0x2f4
>>> [c0007d0c] ret_from_syscall+0x0/0x4c
>>>
>>
>> Similar badness can be had in set_origin (vt.c:568) and set_palette
>> (vt.c:2851), on my Lombard. That's called from pm_prepare_console,
>> for a
>> change.
>>
>>> (The three unnamed frames are inside pmac_wakeup_devices,
>>> powerbook_sleep_Core99 and pmu_ioctl). Does pm_restore_console need
>>> to acquire the console lock, or is that the duty of the callers?
>>
>> None of the other callers does this so I'd guess it needs to be done
>> in
>> pm_restore_console (and pm_prepare_console).
>
> The following patch works for me... should we submit that to lkml?
>
> Michael
>
> --- kernel/power/console.c.org 2003-12-31 14:08:04.000000000 +0100
> +++ kernel/power/console.c 2003-12-31 14:09:26.000000000 +0100
> @@ -20,12 +20,12 @@
> #ifdef SUSPEND_CONSOLE
> orig_fgconsole = fg_console;
>
> + acquire_console_sem();
> if (vc_allocate(SUSPEND_CONSOLE))
> /* we can't have a free VC for now. Too bad,
> * we don't want to mess the screen for now. */
> return 1;
>
> - acquire_console_sem();
> set_console(SUSPEND_CONSOLE);
> release_console_sem();
> if (vt_waitactive(SUSPEND_CONSOLE)) {
> @@ -42,12 +42,14 @@
> {
> console_loglevel = orig_loglevel;
> #ifdef SUSPEND_CONSOLE
> + acquire_console_sem();
> set_console(orig_fgconsole);
>
> /* FIXME:
> * This following part is left over from swsusp. Is it really needed?
> */
> update_screen(fg_console);
> + release_console_sem();
> #endif
> return;
> }
>
>
>
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-dev
mailing list