[PATCH v5 5/6] drm/log: Implement suspend/resume
Petr Mladek
pmladek at suse.com
Tue Nov 5 12:19:49 UTC 2024
On Mon 2024-11-04 16:38:53, John Ogness wrote:
> On 2024-11-04, Petr Mladek <pmladek at suse.com> wrote:
> > I wonder whether console_start()/console_stop() should really
> > manipulate CON_ENABLE flag. It might be historical solution when
> > @console_suspended was a global variable.
> >
> > But it has changed with the commit 9e70a5e109a4a2336 ("printk: Add
> > per-console suspended state").
> >
> > It might make more sense when console_start()/console_stop()
> > manipulates CON_SUSPENDED flag. Then it would make sense
> > to rename them suspend_this_console()/resume_this_console().
>
> I worry about letting console drivers and printk.c both modify this flag
> during normal runtime. One might clear CON_SUSPENDED too soon and cause
> trouble.
>
> CON_ENABLE and @console_suspended were always orthogonal. Moving
> @console_suspended to CON_SUSPENDED did not change that relationship.
>
> IMHO we should continue to keep them separate. But your point about the
> console not being registered is a good one. We should update
> console_stop()/console_start() to only operate on @console if it is
> registered. Since those functions take the console_list_lock anyway, it
> would be a simple change.
First, I am fine with using console_start()/console_stop() in this
patchset. I agree that this API was created for this purpose
and should still work fine.
But I think that the API is a bit messy and would deserve a clean up.
We should do it in a separate patchset.
History:
+ commit 56dafec3913935c997 ("Import 2.1.71") in v2.1.71, Nov 2007 [1]
This version introduced "console=" parameter which allowed to
choose the consoles on the commandline. Before, they were
selected at build time.
The @flags and CON_ENABLED flag were added here as well.
It looks to me like all available console drivers were registered
but only consoles with CON_ENABLE flag printed the messages.
+ commit 33c0d1b0c3ebb61243d9b ("[PATCH] Serial driver stuff")
in v2.5.28, Jul 2002 [1]
Added generic serial_core. The CON_ENABLED flag was re-used
to disable console when suspending the serial drivers.
+ commit 557240b48e2dc4f6fa878 ("Add support for suspending and
resuming the whole console subsystem") in v2.6.18, Jun 2006
Added @console_suspended global variable. It was used as a big hammer
to block all console drivers and avoid subtle problems during suspend.
+ commit 9e70a5e109a4a233678 ("printk: Add per-console suspended state")
in v6.6, Jul 2023
Replaced the global @console_supended global variable with
per-console CON_SUSPENDED flag.
The motivation seems to be to remove dependency on console_lock.
The per-CPU flag allows to query the state via SRCU.
But the flag is set for all consoles at the same time in
console_suspend()/console_resume()
=> it still works as the big hammer.
Observation:
+ CON_ENABLED is not needed for the original purpose. Only enabled
consoles are added into @console_list.
+ CON_ENABLED is still used to explicitely block the console driver
during suspend by console_stop()/console_start() in serial_core.c.
It is not bad. But it is a bit confusing because we have
CON_SUSPENDED flag now and this is about suspend/resume.
+ CON_SUSPENDED is per-console flag but it is set synchronously
for all consoles.
IMHO, a global variable would make more sense for the big hammer
purpose.
Big question:
Does the driver really needs to call console_stop()/console_start()
when there is the big hammer?
I would preserve it because it makes the design more robust.
Anyway, the driver-specific handling looks like the right solution.
The big hammer feels like a workaround.
Reasonable semantic:
1. Rename:
console_suspend() -> console_suspend_all()
console_resume() -> console_resume_all()
and manipulate a global @consoles_suspended variable agagin.
It is the big hammer API.
2. Rename:
console_stop(con) -> console_suspend(con)
console_start(con) -> console_resume(con)
and manipulare the per-console CON_SUSPENDED flag here.
3. Get rid of the ambiguous CON_ENABLED flag. It won't longer
have any purpose.
Except that it is also used to force console registration.
But it can be done a better way, e.g. by introducing
register_console_force() API.
As I said, we could/should this clean up in a separate patchset.
Like printk-people should fix the printk-mess.
[1] pre-git linux kernel history:
git://git.kernel.org/pub/scm/linux/kernel/git/history/history.git
Best Regards,
Petr
More information about the dri-devel
mailing list