summaryrefslogtreecommitdiff
path: root/arch/x86/xen/multicalls.c
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2009-02-06 13:35:57 -0800
committerIngo Molnar <mingo@elte.hu>2009-02-16 08:56:11 +0100
commitb93d51dc62a41b5c2d6f32a0870709dc0cc55545 (patch)
tree173035613b5a51b733c339b2ba5b7bf07a9798cd /arch/x86/xen/multicalls.c
parent9033304a1520df346862c95743a6c2023f21f057 (diff)
downloadlwn-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.c9
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;