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;
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|