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
 
 |