Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
d12013c8
Commit
d12013c8
authored
Jan 10, 2022
by
Petr Mladek
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'console-registration-cleanup' into for-linus
parents
73d86812
5e8ba485
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
58 additions
and
46 deletions
+58
-46
kernel/printk/printk.c
kernel/printk/printk.c
+58
-46
No files found.
kernel/printk/printk.c
View file @
d12013c8
...
...
@@ -280,7 +280,6 @@ static struct console *exclusive_console;
static
struct
console_cmdline
console_cmdline
[
MAX_CMDLINECONSOLES
];
static
int
preferred_console
=
-
1
;
static
bool
has_preferred_console
;
int
console_set_on_cmdline
;
EXPORT_SYMBOL
(
console_set_on_cmdline
);
...
...
@@ -2861,7 +2860,8 @@ early_param("keep_bootcon", keep_bootcon_setup);
* Care need to be taken with consoles that are statically
* enabled such as netconsole
*/
static
int
try_enable_new_console
(
struct
console
*
newcon
,
bool
user_specified
)
static
int
try_enable_preferred_console
(
struct
console
*
newcon
,
bool
user_specified
)
{
struct
console_cmdline
*
c
;
int
i
,
err
;
...
...
@@ -2891,10 +2891,8 @@ static int try_enable_new_console(struct console *newcon, bool user_specified)
return
err
;
}
newcon
->
flags
|=
CON_ENABLED
;
if
(
i
==
preferred_console
)
{
if
(
i
==
preferred_console
)
newcon
->
flags
|=
CON_CONSDEV
;
has_preferred_console
=
true
;
}
return
0
;
}
...
...
@@ -2909,6 +2907,21 @@ static int try_enable_new_console(struct console *newcon, bool user_specified)
return
-
ENOENT
;
}
/* Try to enable the console unconditionally */
static
void
try_enable_default_console
(
struct
console
*
newcon
)
{
if
(
newcon
->
index
<
0
)
newcon
->
index
=
0
;
if
(
newcon
->
setup
&&
newcon
->
setup
(
newcon
,
NULL
)
!=
0
)
return
;
newcon
->
flags
|=
CON_ENABLED
;
if
(
newcon
->
device
)
newcon
->
flags
|=
CON_CONSDEV
;
}
/*
* The console driver calls this routine during kernel initialization
* to register the console printing procedure with printk() and to
...
...
@@ -2930,59 +2943,56 @@ static int try_enable_new_console(struct console *newcon, bool user_specified)
*/
void
register_console
(
struct
console
*
newcon
)
{
struct
console
*
bcon
=
NULL
;
struct
console
*
con
;
bool
bootcon_enabled
=
false
;
bool
realcon_enabled
=
false
;
int
err
;
for_each_console
(
b
con
)
{
if
(
WARN
(
b
con
==
newcon
,
"console '%s%d' already registered
\n
"
,
bcon
->
name
,
b
con
->
index
))
for_each_console
(
con
)
{
if
(
WARN
(
con
==
newcon
,
"console '%s%d' already registered
\n
"
,
con
->
name
,
con
->
index
))
return
;
}
/*
* before we register a new CON_BOOT console, make sure we don't
* already have a valid console
*/
if
(
newcon
->
flags
&
CON_BOOT
)
{
for_each_console
(
bcon
)
{
if
(
!
(
bcon
->
flags
&
CON_BOOT
))
{
pr_info
(
"Too late to register bootconsole %s%d
\n
"
,
newcon
->
name
,
newcon
->
index
);
return
;
}
}
for_each_console
(
con
)
{
if
(
con
->
flags
&
CON_BOOT
)
bootcon_enabled
=
true
;
else
realcon_enabled
=
true
;
}
if
(
console_drivers
&&
console_drivers
->
flags
&
CON_BOOT
)
bcon
=
console_drivers
;
if
(
!
has_preferred_console
||
bcon
||
!
console_drivers
)
has_preferred_console
=
preferred_console
>=
0
;
/* Do not register boot consoles when there already is a real one. */
if
(
newcon
->
flags
&
CON_BOOT
&&
realcon_enabled
)
{
pr_info
(
"Too late to register bootconsole %s%d
\n
"
,
newcon
->
name
,
newcon
->
index
);
return
;
}
/*
* See if we want to use this console driver. If we
* didn't select a console we take the first one
* that registers here.
* See if we want to enable this console driver by default.
*
* Nope when a console is preferred by the command line, device
* tree, or SPCR.
*
* The first real console with tty binding (driver) wins. More
* consoles might get enabled before the right one is found.
*
* Note that a console with tty binding will have CON_CONSDEV
* flag set and will be first in the list.
*/
if
(
!
has_preferred_console
)
{
if
(
newcon
->
index
<
0
)
newcon
->
index
=
0
;
if
(
newcon
->
setup
==
NULL
||
newcon
->
setup
(
newcon
,
NULL
)
==
0
)
{
newcon
->
flags
|=
CON_ENABLED
;
if
(
newcon
->
device
)
{
newcon
->
flags
|=
CON_CONSDEV
;
has_preferred_console
=
true
;
}
if
(
preferred_console
<
0
)
{
if
(
!
console_drivers
||
!
console_drivers
->
device
||
console_drivers
->
flags
&
CON_BOOT
)
{
try_enable_default_console
(
newcon
);
}
}
/* See if this console matches one we selected on the command line */
err
=
try_enable_
new
_console
(
newcon
,
true
);
err
=
try_enable_
preferred
_console
(
newcon
,
true
);
/* If not, try to match against the platform default(s) */
if
(
err
==
-
ENOENT
)
err
=
try_enable_
new
_console
(
newcon
,
false
);
err
=
try_enable_
preferred
_console
(
newcon
,
false
);
/* printk() messages are not printed to the Braille console. */
if
(
err
||
newcon
->
flags
&
CON_BRL
)
...
...
@@ -2994,8 +3004,10 @@ void register_console(struct console *newcon)
* the real console are the same physical device, it's annoying to
* see the beginning boot messages twice
*/
if
(
bcon
&&
((
newcon
->
flags
&
(
CON_CONSDEV
|
CON_BOOT
))
==
CON_CONSDEV
))
if
(
bootcon_enabled
&&
((
newcon
->
flags
&
(
CON_CONSDEV
|
CON_BOOT
))
==
CON_CONSDEV
))
{
newcon
->
flags
&=
~
CON_PRINTBUFFER
;
}
/*
* Put this console in the list - keep the
...
...
@@ -3051,15 +3063,15 @@ void register_console(struct console *newcon)
pr_info
(
"%sconsole [%s%d] enabled
\n
"
,
(
newcon
->
flags
&
CON_BOOT
)
?
"boot"
:
""
,
newcon
->
name
,
newcon
->
index
);
if
(
b
con
&&
if
(
b
ootcon_enabled
&&
((
newcon
->
flags
&
(
CON_CONSDEV
|
CON_BOOT
))
==
CON_CONSDEV
)
&&
!
keep_bootcon
)
{
/* We need to iterate through all boot consoles, to make
* sure we print everything out, before we unregister them.
*/
for_each_console
(
b
con
)
if
(
b
con
->
flags
&
CON_BOOT
)
unregister_console
(
b
con
);
for_each_console
(
con
)
if
(
con
->
flags
&
CON_BOOT
)
unregister_console
(
con
);
}
}
EXPORT_SYMBOL
(
register_console
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment