This is obviously a bit skanky but I figured it might be useful to
others in the future even if it never gets further than the list
archive.
Ian.
On Mon, 2011-01-17 at 14:15 +0000, Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@xxxxxxxxxx>
> # Date 1295273570 0
> # Node ID 15e53a2463f084c3adbbb21b4deb30d0d4f79b45
> # Parent 711cbaa038cae8c03cf825165d2e07b0a3c94f89
> xen: debugging aid to track those who have disabled preemption.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> diff -r 711cbaa038ca -r 15e53a2463f0 xen/common/preempt.c
> --- a/xen/common/preempt.c Mon Jan 17 14:12:48 2011 +0000
> +++ b/xen/common/preempt.c Mon Jan 17 14:12:50 2011 +0000
> @@ -21,5 +21,48 @@
> */
>
> #include <xen/preempt.h>
> +#include <xen/symbols.h>
>
> DEFINE_PER_CPU(unsigned int, __preempt_count);
> +
> +#ifdef DEBUG_PREEMPT
> +
> +#define NR_PREEMPT_DEBUG 16
> +
> +struct preempt_info {
> + const char *file;
> + unsigned long line;
> + const char *func;
> + unsigned long r0, r1;
> +};
> +typedef struct preempt_info preempt_info_t[NR_PREEMPT_DEBUG];
> +
> +DEFINE_PER_CPU(preempt_info_t, __preempt_debug);
> +
> +void preempt_debug(const char *file, const unsigned long line, const char
> *func)
> +{
> + struct preempt_info *pi = &this_cpu(__preempt_debug)[preempt_count()];
> + if (preempt_count() >= NR_PREEMPT_DEBUG)
> + return;
> + pi->file = file;
> + pi->func = func;
> + pi->line = line;
> + pi->r0 = (unsigned long)__builtin_return_address(0);
> + pi->r1 = (unsigned long)__builtin_return_address(1);
> +}
> +
> +void preempt_debug_dump(void)
> +{
> + struct preempt_info *pi = this_cpu(__preempt_debug);
> + int i, count = preempt_count();
> +
> + printk("preempt debug on CPU%d, count %d:\n", smp_processor_id(),
> count);
> + count = min(count, NR_PREEMPT_DEBUG);
> + for(i=0;i<count;i++, pi++) {
> + printk("%d @ 0x%p\n", i, pi);
> + printk(" %s %s:%ld\n", pi->func, pi->file, pi->line);
> + printk(" %#lx", pi->r0); print_symbol(" %s\n", pi->r0);
> + printk(" %#lx", pi->r1); print_symbol(" %s\n", pi->r1);
> + }
> +}
> +#endif
> diff -r 711cbaa038ca -r 15e53a2463f0 xen/drivers/char/console.c
> --- a/xen/drivers/char/console.c Mon Jan 17 14:12:48 2011 +0000
> +++ b/xen/drivers/char/console.c Mon Jan 17 14:12:50 2011 +0000
> @@ -961,6 +961,7 @@ void panic(const char *fmt, ...)
> printk("Panic on CPU %d:\n", smp_processor_id());
> printk("%s", buf);
> printk("****************************************\n\n");
> + preempt_debug_dump();
> if ( opt_noreboot )
> printk("Manual reset required ('noreboot' specified)\n");
> else
> diff -r 711cbaa038ca -r 15e53a2463f0 xen/include/xen/preempt.h
> --- a/xen/include/xen/preempt.h Mon Jan 17 14:12:48 2011 +0000
> +++ b/xen/include/xen/preempt.h Mon Jan 17 14:12:50 2011 +0000
> @@ -18,7 +18,18 @@ DECLARE_PER_CPU(unsigned int, __preempt_
>
> #define preempt_count() (this_cpu(__preempt_count))
>
> +//#define DEBUG_PREEMPT
> +
> +#ifdef DEBUG_PREEMPT
> +extern void preempt_debug(const char *file, const unsigned long line, const
> char *func);
> +extern void preempt_debug_dump(void);
> +#else
> +static inline void preempt_debug(const char *file, const unsigned long line,
> const char *func) {}
> +static inline void preempt_debug_dump(void) {}
> +#endif
> +
> #define preempt_disable() do { \
> + preempt_debug(__FILE__, __LINE__, __func__);\
> preempt_count()++; \
> barrier(); \
> } while (0)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|