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; |