[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] 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; > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |