Hi Rui, On 07/29/2013 10:31 AM, Rui Xiang wrote: > Add a new interface named ns_printk, and assign an > patamater ns. Log which belong to a container can > be printed by ns_printk. One question, with the syslog_ns used, do the log we print by *printk* in the host contains the log in each syslog_ns(print out with ns_printk) or not? Thanks, Gu > > Signed-off-by: Rui Xiang <rui.xiang@xxxxxxxxxx> > --- > 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 <linux/kern_levels.h> > #include <linux/linkage.h> > > +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 6b561db..56a8b27 100644 > --- a/kernel/printk.c > +++ b/kernel/printk.c > @@ -1554,9 +1554,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]; > @@ -1566,7 +1567,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(); > @@ -1697,6 +1697,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) > @@ -1762,6 +1770,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); > + Here can we do some clean up to printk using ns_printk? > #else /* CONFIG_PRINTK */ > > #define LOG_LINE_MAX 0 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers