From patchwork Wed Aug 7 07:37:12 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Xiang X-Patchwork-Id: 265377 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 5794F2C0209 for ; Wed, 7 Aug 2013 17:40:23 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932289Ab3HGHhr (ORCPT ); Wed, 7 Aug 2013 03:37:47 -0400 Received: from szxga01-in.huawei.com ([119.145.14.64]:28483 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932266Ab3HGHhn (ORCPT ); Wed, 7 Aug 2013 03:37:43 -0400 Received: from 172.24.2.119 (EHLO szxeml207-edg.china.huawei.com) ([172.24.2.119]) by szxrg01-dlp.huawei.com (MOS 4.3.4-GA FastPath queued) with ESMTP id BGI29506; Wed, 07 Aug 2013 15:37:40 +0800 (CST) Received: from SZXEML402-HUB.china.huawei.com (10.82.67.32) by szxeml207-edg.china.huawei.com (172.24.2.56) with Microsoft SMTP Server (TLS) id 14.1.323.7; Wed, 7 Aug 2013 15:37:37 +0800 Received: from localhost (10.135.72.188) by szxeml402-hub.china.huawei.com (10.82.67.32) with Microsoft SMTP Server id 14.1.323.7; Wed, 7 Aug 2013 15:37:29 +0800 From: Rui Xiang To: , CC: , , , , , , , , Rui Xiang Subject: [PATCH v3 08/11] syslog_ns: implement ns_printk for specific syslog_ns Date: Wed, 7 Aug 2013 15:37:12 +0800 Message-ID: <1375861035-24320-9-git-send-email-rui.xiang@huawei.com> X-Mailer: git-send-email 1.8.1.msysgit.1 In-Reply-To: <1375861035-24320-1-git-send-email-rui.xiang@huawei.com> References: <1375861035-24320-1-git-send-email-rui.xiang@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.135.72.188] X-CFilter-Loop: Reflected Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add a new interface named ns_printk, and assign an patamater ns. Log which belong to a container can be printed by ns_printk. Signed-off-by: Rui Xiang --- include/linux/printk.h | 4 ++++ kernel/printk.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/include/linux/printk.h b/include/linux/printk.h index 29e3f85..bf83ad9 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -6,6 +6,7 @@ #include #include +struct syslog_namespace; extern const char linux_banner[]; extern const char linux_proc_banner[]; @@ -123,6 +124,9 @@ asmlinkage int printk_emit(int facility, int level, asmlinkage __printf(1, 2) __cold int printk(const char *fmt, ...); +asmlinkage __printf(2, 3) __cold +int ns_printk(struct syslog_namespace *ns, const char *fmt, ...); + /* * Special printk facility for scheduler use only, _DO_NOT_USE_ ! */ diff --git a/kernel/printk.c b/kernel/printk.c index a812a88..38e8869 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -1548,9 +1548,10 @@ static size_t cont_print_text(char *text, size_t size) return textlen; } -asmlinkage int vprintk_emit(int facility, int level, - const char *dict, size_t dictlen, - const char *fmt, va_list args) +static int ns_vprintk_emit(int facility, int level, + const char *dict, size_t dictlen, + const char *fmt, va_list args, + struct syslog_namespace *ns) { static int recursion_bug; static char textbuf[LOG_LINE_MAX]; @@ -1560,7 +1561,6 @@ asmlinkage int vprintk_emit(int facility, int level, unsigned long flags; int this_cpu; int printed_len = 0; - struct syslog_namespace *ns = &init_syslog_ns; boot_delay_msec(level); printk_delay(); @@ -1691,6 +1691,14 @@ out_restore_irqs: return printed_len; } + +asmlinkage int vprintk_emit(int facility, int level, + const char *dict, size_t dictlen, + const char *fmt, va_list args) +{ + return ns_vprintk_emit(facility, level, dict, dictlen, fmt, args, + &init_syslog_ns); +} EXPORT_SYMBOL(vprintk_emit); asmlinkage int vprintk(const char *fmt, va_list args) @@ -1756,6 +1764,43 @@ asmlinkage int printk(const char *fmt, ...) } EXPORT_SYMBOL(printk); +/** + * ns_printk - print a kernel message in syslog_ns + * @ns: syslog namespace + * @fmt: format string + * + * This is ns_printk(). + * It can be called from container context. We add a param + * ns to record current syslog namespace, because we need to + * print some log which are not generated by host, but contaner. + * + * See the vsnprintf() documentation for format string extensions over C99. + **/ +asmlinkage int ns_printk(struct syslog_namespace *ns, + const char *fmt, ...) +{ + va_list args; + int r; + + if (!ns) + ns = current_user_ns()->syslog_ns; + +#ifdef CONFIG_KGDB_KDB + if (unlikely(kdb_trap_printk)) { + va_start(args, fmt); + r = vkdb_printf(fmt, args); + va_end(args); + return r; + } +#endif + va_start(args, fmt); + r = ns_vprintk_emit(0, -1, NULL, 0, fmt, args, ns); + va_end(args); + + return r; +} +EXPORT_SYMBOL(ns_printk); + #else /* CONFIG_PRINTK */ #define LOG_LINE_MAX 0