diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2009-02-06 13:35:57 -0800 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-16 08:56:11 +0100 |
commit | b93d51dc62a41b5c2d6f32a0870709dc0cc55545 (patch) | |
tree | 173035613b5a51b733c339b2ba5b7bf07a9798cd /arch/x86/xen/multicalls.c | |
parent | 9033304a1520df346862c95743a6c2023f21f057 (diff) | |
download | lwn-b93d51dc62a41b5c2d6f32a0870709dc0cc55545.tar.gz lwn-b93d51dc62a41b5c2d6f32a0870709dc0cc55545.zip |
x86, xen: record and display initiator of each multicall when debugging
Store the caller for each multicall so we can report it on failure.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/xen/multicalls.c')
-rw-r--r-- | arch/x86/xen/multicalls.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86/xen/multicalls.c b/arch/x86/xen/multicalls.c index c738644b5435..82f2513e9758 100644 --- a/arch/x86/xen/multicalls.c +++ b/arch/x86/xen/multicalls.c @@ -39,6 +39,7 @@ struct mc_buffer { struct multicall_entry entries[MC_BATCH]; #if MC_DEBUG struct multicall_entry debug[MC_BATCH]; + void *caller[MC_BATCH]; #endif unsigned char args[MC_ARGS]; struct callback { @@ -154,11 +155,12 @@ void xen_mc_flush(void) ret, smp_processor_id()); dump_stack(); for (i = 0; i < b->mcidx; i++) { - printk(KERN_DEBUG " call %2d/%d: op=%lu arg=[%lx] result=%ld\n", + printk(KERN_DEBUG " call %2d/%d: op=%lu arg=[%lx] result=%ld\t%pF\n", i+1, b->mcidx, b->debug[i].op, b->debug[i].args[0], - b->entries[i].result); + b->entries[i].result, + b->caller[i]); } } #endif @@ -197,6 +199,9 @@ struct multicall_space __xen_mc_entry(size_t args) } ret.mc = &b->entries[b->mcidx]; +#ifdef MC_DEBUG + b->caller[b->mcidx] = __builtin_return_address(0); +#endif b->mcidx++; ret.args = &b->args[argidx]; b->argidx = argidx + args; |