[Devel] [PATCH RHEL COMMIT] ve/printk: Introduce ve_printk()
Konstantin Khorenko
khorenko at virtuozzo.com
Fri Oct 1 18:24:07 MSK 2021
The commit is pushed to "branch-rh9-5.14.vz9.1.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after ark-5.14
------>
commit 5bfb9c989746962bfaf7a2f63918c3823ee47e82
Author: Vladimir Davydov <vdavydov.dev at gmail.com>
Date: Wed Sep 29 21:33:15 2021 +0300
ve/printk: Introduce ve_printk()
https://jira.sw.ru/browse/PSBM-17899
Signed-off-by: Vladimir Davydov <vdavydov at parallels.com>
Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
+++
ve/printk: Fix printk virtualization
ve_printk() corrupts host's dmesg:
# dmesg|wc -l
599
# vzctl create 101
# vzctl set 101 --netif_add eth0 --save
# vzctl start 101
# vzctl exec 101 'tcpdump -w tcpdump.out -U -n -i eth0 esp'
# dmesg|wc -l
2
Add missing parts of prinkt virtualization to fix this.
https://jira.sw.ru/browse/PSBM-17899
https://jira.sw.ru/browse/PSBM-105442
Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
Rebasing to vz9: part of vz8 commit:
d63aeb311a64 ("ve/printk: printk virtualization")
https://jira.sw.ru/browse/PSBM-133985
Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
---
include/linux/printk.h | 20 ++++++++++++++++++++
kernel/printk/printk.c | 31 +++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/include/linux/printk.h b/include/linux/printk.h
index f178e2e5d7f5..6e14c410a2df 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -70,6 +70,10 @@ extern int console_printk[];
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])
+#define VE0_LOG 1
+#define VE_LOG 2
+#define VE_LOG_BOTH (VE0_LOG | VE_LOG)
+
static inline void console_silent(void)
{
console_loglevel = CONSOLE_LOGLEVEL_SILENT;
@@ -176,6 +180,12 @@ int vprintk(const char *fmt, va_list args);
asmlinkage __printf(1, 2) __cold
int printk(const char *fmt, ...);
+asmlinkage __printf(2, 0)
+int ve_vprintk(int dst, const char *fmt, va_list args);
+
+asmlinkage __printf(2, 3) __cold
+int ve_printk(int dst, const char *fmt, ...);
+
struct ve_struct;
int ve_log_init(struct ve_struct *ve);
void ve_log_destroy(struct ve_struct *ve);
@@ -226,6 +236,16 @@ int printk(const char *s, ...)
{
return 0;
}
+static inline __printf(2, 0)
+int ve_vprintk(int dst, const char *s, va_list args)
+{
+ return 0;
+}
+static inline __printf(2, 3) __cold
+int ve_printk(int dst, const char *s, ...)
+{
+ return 0;
+}
static inline
int ve_log_init(struct ve_struct *ve)
{
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 7f1bec17866d..f3b5dbd9db6d 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2278,6 +2278,37 @@ int vprintk_default(const char *fmt, va_list args)
}
EXPORT_SYMBOL_GPL(vprintk_default);
+asmlinkage int ve_vprintk(int dst, const char *fmt, va_list args)
+{
+ va_list args2;
+ int r = 0;
+
+ va_copy(args2, args);
+ if (ve_is_super(get_exec_env()) || (dst & VE0_LOG))
+ r = vprintk(fmt, args);
+ if (!ve_is_super(get_exec_env()) && (dst & VE_LOG))
+ r = __vprintk(fmt, args2);
+
+ return r;
+}
+
+/*
+ * Do not use it from scheduler code - can lead to deadlocks.
+ */
+
+asmlinkage int ve_printk(int dst, const char *fmt, ...)
+{
+ va_list args;
+ int r;
+
+ va_start(args, fmt);
+ r = ve_vprintk(dst, fmt, args);
+ va_end(args);
+
+ return r;
+}
+EXPORT_SYMBOL(ve_printk);
+
/**
* printk - print a kernel message
* @fmt: format string
More information about the Devel
mailing list