| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
 RE: [Xen-devel] Question about printk implementation.
 
 
 Hi Keir,
 Good to know that..the NMI handler (nmi_watchdog_tick) does have a printk but I supposed it is ok since we are going to reboot after, so we are not returning to the other code.  I assume that putting a printk in a timer function callback (set up with init_timer & set_timer, etc) or any other interrupt handler would not be safe either then.
 
 Roger
 
 
 
 -----Original Message-----
 From: Keir Fraser [mailto:keir.fraser@xxxxxxxxxxxxx]
 Sent: Wed 9/15/2010 5:03 PM
 To: Roger Cruz; xen-devel@xxxxxxxxxxxxxxxxxxx
 Subject: Re: [Xen-devel] Question about printk implementation.
 
 On 15/09/2010 21:24, "Roger Cruz" <roger.cruz@xxxxxxxxxxxxxxxxxxx> wrote:
 
 > I was looking over the implementation of printk (xenunstable) and I have a
 > question about the spin_lock_recursive use and the static "buf" variable in
 > this routine.  Suppose that that in a single processor system the hypervisor
 > is printing using this printk routine and has acquired the console_lock.  Is
 > it possible for a high level interrupt, like an NMI (just as an example, any
 > other interrupts that preempt the current work in the hypervisor will do), to
 > come in and then use printk.  Because we are in single CPU mode, the
 > spin_lock_recursive will succeed (if I interpreted the code correctly).  When
 > the higher level interrupt exits and returns to the hypervisor code that was
 > previously printing, the contents of the static "buf" would have changed.  Is
 > this a possibility??
 
 Well yeah, you know what? Don't do that then! Our printk (like very many Xen
 functions) is not NMI safe.
 
 -- Keir
 
 > Thanks
 > Roger R. Cruz
 >
 > void printk(const char *fmt, ...)
 > {
 >     static char   buf[1024];  <<<<<---------------
 >     static int    start_of_line = 1, do_print;
 >
 >     va_list       args;
 >     char         *p, *q;
 >     unsigned long flags;
 >
 >     /* console_lock can be acquired recursively from __printk_ratelimit(). */
 >     local_irq_save(flags);  <<<<-----------------
 >     spin_lock_recursive(&console_lock);
 >
 >     va_start(args, fmt);
 >     (void)vsnprintf(buf, sizeof(buf), fmt, args);
 >     va_end(args);
 >
 >     p = buf;
 >
 >     while ( (q = strchr(p, '\n')) != NULL )
 >     {
 >         *q = '\0';
 >         if ( start_of_line )
 >             do_print = printk_prefix_check(p, &p);
 >         if ( do_print )
 >         {
 >             if ( start_of_line )
 >                 printk_start_of_line();
 >             __putstr(p);
 >             __putstr("\n");
 >         }
 >         start_of_line = 1;
 >         p = q + 1;
 >
 
 
 
 No virus found in this incoming message.
 Checked by AVG - www.avg.com
 Version: 9.0.851 / Virus Database: 271.1.1/3134 - Release Date: 09/15/10 02:34:00
 
 
 _______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 
 |