]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/xen/multicalls.c
Merge branches 'tracing/doc', 'tracing/ftrace', 'tracing/printk' and 'linus' into...
[linux-2.6-omap-h63xx.git] / arch / x86 / xen / multicalls.c
index c738644b543502d6577ee07b42c25f6e52493131..8bff7e7c290b7d30ef805061115690e7267dc4a9 100644 (file)
@@ -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
@@ -168,8 +170,6 @@ void xen_mc_flush(void)
        } else
                BUG_ON(b->argidx != 0);
 
-       local_irq_restore(flags);
-
        for (i = 0; i < b->cbidx; i++) {
                struct callback *cb = &b->callbacks[i];
 
@@ -177,7 +177,9 @@ void xen_mc_flush(void)
        }
        b->cbidx = 0;
 
-       BUG_ON(ret);
+       local_irq_restore(flags);
+
+       WARN_ON(ret);
 }
 
 struct multicall_space __xen_mc_entry(size_t args)
@@ -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;