diff options
Diffstat (limited to 'arch/x86/xen/multicalls.c')
| -rw-r--r-- | arch/x86/xen/multicalls.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/arch/x86/xen/multicalls.c b/arch/x86/xen/multicalls.c index c738644b5435..8bff7e7c290b 100644 --- a/arch/x86/xen/multicalls.c +++ b/arch/x86/xen/multicalls.c | |||
| @@ -39,6 +39,7 @@ struct mc_buffer { | |||
| 39 | struct multicall_entry entries[MC_BATCH]; | 39 | struct multicall_entry entries[MC_BATCH]; |
| 40 | #if MC_DEBUG | 40 | #if MC_DEBUG |
| 41 | struct multicall_entry debug[MC_BATCH]; | 41 | struct multicall_entry debug[MC_BATCH]; |
| 42 | void *caller[MC_BATCH]; | ||
| 42 | #endif | 43 | #endif |
| 43 | unsigned char args[MC_ARGS]; | 44 | unsigned char args[MC_ARGS]; |
| 44 | struct callback { | 45 | struct callback { |
| @@ -154,11 +155,12 @@ void xen_mc_flush(void) | |||
| 154 | ret, smp_processor_id()); | 155 | ret, smp_processor_id()); |
| 155 | dump_stack(); | 156 | dump_stack(); |
| 156 | for (i = 0; i < b->mcidx; i++) { | 157 | for (i = 0; i < b->mcidx; i++) { |
| 157 | printk(KERN_DEBUG " call %2d/%d: op=%lu arg=[%lx] result=%ld\n", | 158 | printk(KERN_DEBUG " call %2d/%d: op=%lu arg=[%lx] result=%ld\t%pF\n", |
| 158 | i+1, b->mcidx, | 159 | i+1, b->mcidx, |
| 159 | b->debug[i].op, | 160 | b->debug[i].op, |
| 160 | b->debug[i].args[0], | 161 | b->debug[i].args[0], |
| 161 | b->entries[i].result); | 162 | b->entries[i].result, |
| 163 | b->caller[i]); | ||
| 162 | } | 164 | } |
| 163 | } | 165 | } |
| 164 | #endif | 166 | #endif |
| @@ -168,8 +170,6 @@ void xen_mc_flush(void) | |||
| 168 | } else | 170 | } else |
| 169 | BUG_ON(b->argidx != 0); | 171 | BUG_ON(b->argidx != 0); |
| 170 | 172 | ||
| 171 | local_irq_restore(flags); | ||
| 172 | |||
| 173 | for (i = 0; i < b->cbidx; i++) { | 173 | for (i = 0; i < b->cbidx; i++) { |
| 174 | struct callback *cb = &b->callbacks[i]; | 174 | struct callback *cb = &b->callbacks[i]; |
| 175 | 175 | ||
| @@ -177,7 +177,9 @@ void xen_mc_flush(void) | |||
| 177 | } | 177 | } |
| 178 | b->cbidx = 0; | 178 | b->cbidx = 0; |
| 179 | 179 | ||
| 180 | BUG_ON(ret); | 180 | local_irq_restore(flags); |
| 181 | |||
| 182 | WARN_ON(ret); | ||
| 181 | } | 183 | } |
| 182 | 184 | ||
| 183 | struct multicall_space __xen_mc_entry(size_t args) | 185 | struct multicall_space __xen_mc_entry(size_t args) |
| @@ -197,6 +199,9 @@ struct multicall_space __xen_mc_entry(size_t args) | |||
| 197 | } | 199 | } |
| 198 | 200 | ||
| 199 | ret.mc = &b->entries[b->mcidx]; | 201 | ret.mc = &b->entries[b->mcidx]; |
| 202 | #ifdef MC_DEBUG | ||
| 203 | b->caller[b->mcidx] = __builtin_return_address(0); | ||
| 204 | #endif | ||
| 200 | b->mcidx++; | 205 | b->mcidx++; |
| 201 | ret.args = &b->args[argidx]; | 206 | ret.args = &b->args[argidx]; |
| 202 | b->argidx = argidx + args; | 207 | b->argidx = argidx + args; |
