forked from luck/tmp_suning_uos_patched
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:
commit
a754292348
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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[];
|
||||||
|
|
|
@ -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) ({ \
|
||||||
|
|
43
include/linux/ratelimit_types.h
Normal file
43
include/linux/ratelimit_types.h
Normal 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 */
|
|
@ -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;
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user