Printk changes for 5.9

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEESH4wyp42V4tXvYsjUqAMR0iAlPIFAl8pk84ACgkQUqAMR0iA
 lPIrTxAAhD6fosJx+7LCrDRABIw/ZybeS5MIxTuPsNtdMmGBemigew5Ao1wYY6Ww
 3BFiNC2LpDXPxSOCQpz0Zm5/oCLhShPJmS6ukjLbufDsiw0MezliKCAa2Bfw3W31
 6xntQtf7ps+bmTEQDyuznu8Kfg+I3lmdGUOEBBluHIP4gb7XKQE8ttyUHB6qdiXI
 3eAl53Q8dOMMjtk5eNBXA19JY43g4JmLZRBumrAUc1vsv15KTDmSyWKlV8+tLH9K
 JbQAHe0pNVec4sJUIYLvIwDZXvtsvxjdJyX3tTeZ7xJ/ARcvRLoixVGqWxKhqdth
 j5U/L+YQfCJifyqvEVo03yy4Ti+OraliRpGcRf/bM2HpmFBA2+dISr7/VEqRwkG7
 Sy8HuvBHHyUqdrPjB7izhv8iyRN+LxFfpdT5LMnzsvxMxAJ+QwNjxb13RA4kkeRU
 5SgOhfGWgTsLy71J6qdSeXYB2oPFw4Onp5yAtoUsOJVYqWkN9x0zdl+9HmqIHF7T
 dY+KNriEO6gmpsQrMR4FC/GVMtwYWf8AoqeZen5O5SQULmzuKQ5AkOo0IAMrU92i
 iAdFrSZj35HAQjIJRccPNGZ3FwTd1Z4r5GT7VRvrN+nq2wVopzbbz924/lmsGoAS
 YppAw31sKfXDc5uWE8jP8GP3OJqhORn2PPXq3D5Q3XSVbGgey0Q=
 =ZcMq
 -----END PGP SIGNATURE-----

Merge tag 'printk-for-5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux

Pull printk updates from Petr Mladek:

 - Herbert Xu made printk header file self-contained.

 - Andy Shevchenko and Sergey Senozhatsky cleaned up console->setup()
   error handling.

 - Andy Shevchenko did some cleanups (e.g. sparse warning) in vsprintf
   code.

 - Minor documentation updates.

* tag 'printk-for-5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux:
  lib/vsprintf: Force type of flags value for gfp_t
  lib/vsprintf: Replace custom spec to print decimals with generic one
  lib/vsprintf: Replace hidden BUILD_BUG_ON() with static_assert()
  printk: Make linux/printk.h self-contained
  doc:kmsg: explicitly state the return value in case of SEEK_CUR
  Replace HTTP links with HTTPS ones: vsprintf
  hvc: unify console setup naming
  console: Fix trivia typo 'change' -> 'chance'
  console: Propagate error code from console ->setup()
  tty: hvc: Return proper error code from console ->setup() hook
  serial: sunzilog: Return proper error code from console ->setup() hook
  serial: sunsab: Return proper error code from console ->setup() hook
  mips: Return proper error code from console ->setup() hook
This commit is contained in:
Linus Torvalds 2020-08-04 22:22:25 -07:00
commit a754292348
13 changed files with 86 additions and 58 deletions

View File

@ -56,6 +56,17 @@ Description: The /dev/kmsg character device node provides userspace access
seek after the last record available at the time seek after the last record available at the time
the last SYSLOG_ACTION_CLEAR was issued. the last SYSLOG_ACTION_CLEAR was issued.
Other seek operations or offsets are not supported because of
the special behavior this device has. The device allows to read
or write only whole variable length messages (records) that are
stored in a ring buffer.
Because of the non-standard behavior also the error values are
non-standard. -ESPIPE is returned for non-zero offset. -EINVAL
is returned for other operations, e.g. SEEK_CUR. This behavior
and values are historical and could not be modified without the
risk of breaking userspace.
The output format consists of a prefix carrying the syslog The output format consists of a prefix carrying the syslog
prefix including priority and facility, the 64 bit message prefix including priority and facility, the 64 bit message
sequence number and the monotonic timestamp in microseconds, sequence number and the monotonic timestamp in microseconds,

View File

@ -317,7 +317,7 @@ colon-separators. Leading zeros are always used.
The additional ``c`` specifier can be used with the ``I`` specifier to The additional ``c`` specifier can be used with the ``I`` specifier to
print a compressed IPv6 address as described by print a compressed IPv6 address as described by
http://tools.ietf.org/html/rfc5952 https://tools.ietf.org/html/rfc5952
Passed by reference. Passed by reference.
@ -341,7 +341,7 @@ The additional ``p``, ``f``, and ``s`` specifiers are used to specify port
flowinfo a ``/`` and scope a ``%``, each followed by the actual value. flowinfo a ``/`` and scope a ``%``, each followed by the actual value.
In case of an IPv6 address the compressed IPv6 address as described by In case of an IPv6 address the compressed IPv6 address as described by
http://tools.ietf.org/html/rfc5952 is being used if the additional https://tools.ietf.org/html/rfc5952 is being used if the additional
specifier ``c`` is given. The IPv6 address is surrounded by ``[``, ``]`` in specifier ``c`` is given. The IPv6 address is surrounded by ``[``, ``]`` in
case of additional specifiers ``p``, ``f`` or ``s`` as suggested by case of additional specifiers ``p``, ``f`` or ``s`` as suggested by
https://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-07 https://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-07

View File

@ -28,7 +28,9 @@ static void prom_console_write(struct console *co, const char *s,
static int prom_console_setup(struct console *co, char *options) static int prom_console_setup(struct console *co, char *options)
{ {
return !(prom_flags & PROM_FLAG_USE_AS_CONSOLE); if (prom_flags & PROM_FLAG_USE_AS_CONSOLE)
return 0;
return -ENODEV;
} }
static struct console arc_cons = { static struct console arc_cons = {

View File

@ -2,7 +2,7 @@
#ifndef _ASM_S390_BUG_H #ifndef _ASM_S390_BUG_H
#define _ASM_S390_BUG_H #define _ASM_S390_BUG_H
#include <linux/kernel.h> #include <linux/compiler.h>
#ifdef CONFIG_BUG #ifdef CONFIG_BUG

View File

@ -603,7 +603,7 @@ static void xen_hvm_early_write(uint32_t vtermno, const char *str, int len) { }
#endif #endif
#ifdef CONFIG_EARLY_PRINTK #ifdef CONFIG_EARLY_PRINTK
static int __init xenboot_setup_console(struct console *console, char *string) static int __init xenboot_console_setup(struct console *console, char *string)
{ {
static struct xencons_info xenboot; static struct xencons_info xenboot;
@ -647,7 +647,7 @@ static void xenboot_write_console(struct console *console, const char *string,
struct console xenboot_console = { struct console xenboot_console = {
.name = "xenboot", .name = "xenboot",
.write = xenboot_write_console, .write = xenboot_write_console,
.setup = xenboot_setup_console, .setup = xenboot_console_setup,
.flags = CON_PRINTBUFFER | CON_BOOT | CON_ANYTIME, .flags = CON_PRINTBUFFER | CON_BOOT | CON_ANYTIME,
.index = -1, .index = -1,
}; };

View File

@ -1128,7 +1128,7 @@ static int __init hvsi_console_setup(struct console *console, char *options)
int ret; int ret;
if (console->index < 0 || console->index >= hvsi_count) if (console->index < 0 || console->index >= hvsi_count)
return -1; return -EINVAL;
hp = &hvsi_ports[console->index]; hp = &hvsi_ports[console->index];
/* give the FSP a chance to change the baud rate when we re-open */ /* give the FSP a chance to change the baud rate when we re-open */

View File

@ -886,7 +886,7 @@ static int sunsab_console_setup(struct console *con, char *options)
* though... * though...
*/ */
if (up->port.type != PORT_SUNSAB) if (up->port.type != PORT_SUNSAB)
return -1; return -EINVAL;
printk("Console: ttyS%d (SAB82532)\n", printk("Console: ttyS%d (SAB82532)\n",
(sunsab_reg.minor - 64) + con->index); (sunsab_reg.minor - 64) + con->index);

View File

@ -1221,7 +1221,7 @@ static int __init sunzilog_console_setup(struct console *con, char *options)
int baud, brg; int baud, brg;
if (up->port.type != PORT_SUNZILOG) if (up->port.type != PORT_SUNZILOG)
return -1; return -EINVAL;
printk(KERN_INFO "Console: ttyS%d (SunZilog zs%d)\n", printk(KERN_INFO "Console: ttyS%d (SunZilog zs%d)\n",
(sunzilog_reg.minor - 64) + con->index, con->index); (sunzilog_reg.minor - 64) + con->index, con->index);

View File

@ -7,6 +7,7 @@
#include <linux/kern_levels.h> #include <linux/kern_levels.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/cache.h> #include <linux/cache.h>
#include <linux/ratelimit_types.h>
extern const char linux_banner[]; extern const char linux_banner[];
extern const char linux_proc_banner[]; extern const char linux_proc_banner[];

View File

@ -2,41 +2,10 @@
#ifndef _LINUX_RATELIMIT_H #ifndef _LINUX_RATELIMIT_H
#define _LINUX_RATELIMIT_H #define _LINUX_RATELIMIT_H
#include <linux/param.h> #include <linux/ratelimit_types.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#define DEFAULT_RATELIMIT_INTERVAL (5 * HZ)
#define DEFAULT_RATELIMIT_BURST 10
/* issue num suppressed message on exit */
#define RATELIMIT_MSG_ON_RELEASE BIT(0)
struct ratelimit_state {
raw_spinlock_t lock; /* protect the state */
int interval;
int burst;
int printed;
int missed;
unsigned long begin;
unsigned long flags;
};
#define RATELIMIT_STATE_INIT(name, interval_init, burst_init) { \
.lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \
.interval = interval_init, \
.burst = burst_init, \
}
#define RATELIMIT_STATE_INIT_DISABLED \
RATELIMIT_STATE_INIT(ratelimit_state, 0, DEFAULT_RATELIMIT_BURST)
#define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init) \
\
struct ratelimit_state name = \
RATELIMIT_STATE_INIT(name, interval_init, burst_init) \
static inline void ratelimit_state_init(struct ratelimit_state *rs, static inline void ratelimit_state_init(struct ratelimit_state *rs,
int interval, int burst) int interval, int burst)
{ {
@ -73,9 +42,6 @@ ratelimit_set_flags(struct ratelimit_state *rs, unsigned long flags)
extern struct ratelimit_state printk_ratelimit_state; extern struct ratelimit_state printk_ratelimit_state;
extern int ___ratelimit(struct ratelimit_state *rs, const char *func);
#define __ratelimit(state) ___ratelimit(state, __func__)
#ifdef CONFIG_PRINTK #ifdef CONFIG_PRINTK
#define WARN_ON_RATELIMIT(condition, state) ({ \ #define WARN_ON_RATELIMIT(condition, state) ({ \

View File

@ -0,0 +1,43 @@
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_RATELIMIT_TYPES_H
#define _LINUX_RATELIMIT_TYPES_H
#include <linux/bits.h>
#include <linux/param.h>
#include <linux/spinlock_types.h>
#define DEFAULT_RATELIMIT_INTERVAL (5 * HZ)
#define DEFAULT_RATELIMIT_BURST 10
/* issue num suppressed message on exit */
#define RATELIMIT_MSG_ON_RELEASE BIT(0)
struct ratelimit_state {
raw_spinlock_t lock; /* protect the state */
int interval;
int burst;
int printed;
int missed;
unsigned long begin;
unsigned long flags;
};
#define RATELIMIT_STATE_INIT(name, interval_init, burst_init) { \
.lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \
.interval = interval_init, \
.burst = burst_init, \
}
#define RATELIMIT_STATE_INIT_DISABLED \
RATELIMIT_STATE_INIT(ratelimit_state, 0, DEFAULT_RATELIMIT_BURST)
#define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init) \
\
struct ratelimit_state name = \
RATELIMIT_STATE_INIT(name, interval_init, burst_init) \
extern int ___ratelimit(struct ratelimit_state *rs, const char *func);
#define __ratelimit(state) ___ratelimit(state, __func__)
#endif /* _LINUX_RATELIMIT_TYPES_H */

View File

@ -943,6 +943,14 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
return ret; return ret;
} }
/*
* Be careful when modifying this function!!!
*
* Only few operations are supported because the device works only with the
* entire variable length messages (records). Non-standard values are
* returned in the other cases and has been this way for quite some time.
* User space applications might depend on this behavior.
*/
static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
{ {
struct devkmsg_user *user = file->private_data; struct devkmsg_user *user = file->private_data;
@ -2658,7 +2666,7 @@ early_param("keep_bootcon", keep_bootcon_setup);
static int try_enable_new_console(struct console *newcon, bool user_specified) static int try_enable_new_console(struct console *newcon, bool user_specified)
{ {
struct console_cmdline *c; struct console_cmdline *c;
int i; int i, err;
for (i = 0, c = console_cmdline; for (i = 0, c = console_cmdline;
i < MAX_CMDLINECONSOLES && c->name[0]; i < MAX_CMDLINECONSOLES && c->name[0];
@ -2681,8 +2689,8 @@ static int try_enable_new_console(struct console *newcon, bool user_specified)
return 0; return 0;
if (newcon->setup && if (newcon->setup &&
newcon->setup(newcon, c->options) != 0) (err = newcon->setup(newcon, c->options)) != 0)
return -EIO; return err;
} }
newcon->flags |= CON_ENABLED; newcon->flags |= CON_ENABLED;
if (i == preferred_console) { if (i == preferred_console) {
@ -2695,7 +2703,7 @@ static int try_enable_new_console(struct console *newcon, bool user_specified)
/* /*
* Some consoles, such as pstore and netconsole, can be enabled even * Some consoles, such as pstore and netconsole, can be enabled even
* without matching. Accept the pre-enabled consoles only when match() * without matching. Accept the pre-enabled consoles only when match()
* and setup() had a change to be called. * and setup() had a chance to be called.
*/ */
if (newcon->flags & CON_ENABLED && c->user_specified == user_specified) if (newcon->flags & CON_ENABLED && c->user_specified == user_specified)
return 0; return 0;

View File

@ -381,6 +381,9 @@ int num_to_str(char *buf, int size, unsigned long long num, unsigned int width)
#define SMALL 32 /* use lowercase in hex (must be 32 == 0x20) */ #define SMALL 32 /* use lowercase in hex (must be 32 == 0x20) */
#define SPECIAL 64 /* prefix hex with "0x", octal with "0" */ #define SPECIAL 64 /* prefix hex with "0x", octal with "0" */
static_assert(ZEROPAD == ('0' - ' '));
static_assert(SMALL == ' ');
enum format_type { enum format_type {
FORMAT_TYPE_NONE, /* Just a string part */ FORMAT_TYPE_NONE, /* Just a string part */
FORMAT_TYPE_WIDTH, FORMAT_TYPE_WIDTH,
@ -507,7 +510,7 @@ char *number(char *buf, char *end, unsigned long long num,
/* zero or space padding */ /* zero or space padding */
if (!(spec.flags & LEFT)) { if (!(spec.flags & LEFT)) {
char c = ' ' + (spec.flags & ZEROPAD); char c = ' ' + (spec.flags & ZEROPAD);
BUILD_BUG_ON(' ' + ZEROPAD != '0');
while (--field_width >= 0) { while (--field_width >= 0) {
if (buf < end) if (buf < end)
*buf = c; *buf = c;
@ -1934,7 +1937,7 @@ char *flags_string(char *buf, char *end, void *flags_ptr,
names = vmaflag_names; names = vmaflag_names;
break; break;
case 'g': case 'g':
flags = *(gfp_t *)flags_ptr; flags = (__force unsigned long)(*(gfp_t *)flags_ptr);
names = gfpflag_names; names = gfpflag_names;
break; break;
default: default:
@ -1976,12 +1979,6 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
char *buf_start = buf; char *buf_start = buf;
struct property *prop; struct property *prop;
bool has_mult, pass; bool has_mult, pass;
static const struct printf_spec num_spec = {
.flags = SMALL,
.field_width = -1,
.precision = -1,
.base = 10,
};
struct printf_spec str_spec = spec; struct printf_spec str_spec = spec;
str_spec.field_width = -1; str_spec.field_width = -1;
@ -2021,7 +2018,7 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
str_spec.precision = precision; str_spec.precision = precision;
break; break;
case 'p': /* phandle */ case 'p': /* phandle */
buf = number(buf, end, (unsigned int)dn->phandle, num_spec); buf = number(buf, end, (unsigned int)dn->phandle, default_dec_spec);
break; break;
case 'P': /* path-spec */ case 'P': /* path-spec */
p = fwnode_get_name(of_fwnode_handle(dn)); p = fwnode_get_name(of_fwnode_handle(dn));
@ -2134,7 +2131,7 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode,
* [4] or [6] and is able to print port [p], flowinfo [f], scope [s] * [4] or [6] and is able to print port [p], flowinfo [f], scope [s]
* - '[Ii][4S][hnbl]' IPv4 addresses in host, network, big or little endian order * - '[Ii][4S][hnbl]' IPv4 addresses in host, network, big or little endian order
* - 'I[6S]c' for IPv6 addresses printed as specified by * - 'I[6S]c' for IPv6 addresses printed as specified by
* http://tools.ietf.org/html/rfc5952 * https://tools.ietf.org/html/rfc5952
* - 'E[achnops]' For an escaped buffer, where rules are defined by combination * - 'E[achnops]' For an escaped buffer, where rules are defined by combination
* of the following flags (see string_escape_mem() for the * of the following flags (see string_escape_mem() for the
* details): * details):