[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.