aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/multicall.c
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2004-11-25 22:09:38 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2004-11-25 22:09:38 +0000
commit9ce92d7114a910ffa57b0e62c50777991a65fd15 (patch)
tree7b1202eb05627a6fc324e08628444ecea84b4a10 /xen/common/multicall.c
parentdf4685e4eac7bb99681fb3dd49345bb802178d39 (diff)
downloadxen-9ce92d7114a910ffa57b0e62c50777991a65fd15.tar.gz
xen-9ce92d7114a910ffa57b0e62c50777991a65fd15.tar.bz2
xen-9ce92d7114a910ffa57b0e62c50777991a65fd15.zip
bitkeeper revision 1.1159.187.19 (41a65822miLPeexZ6MOkyk4Usl-Rpw)
Fix multicall preemption.
Diffstat (limited to 'xen/common/multicall.c')
-rw-r--r--xen/common/multicall.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/xen/common/multicall.c b/xen/common/multicall.c
index dfe5e8d691..04605ebb2a 100644
--- a/xen/common/multicall.c
+++ b/xen/common/multicall.c
@@ -52,9 +52,15 @@ long do_multicall(multicall_entry_t *call_list, unsigned int nr_calls)
if ( hypercall_preempt_check() )
{
- /* If the sub-call wasn't preempted, skip over it. */
+ /*
+ * Copy the sub-call continuation if it was preempted.
+ * Otherwise skip over the sub-call entirely.
+ */
if ( !test_bit(_MCSF_call_preempted, &mcs->flags) )
i++;
+ else
+ (void)__copy_to_user(&call_list[i], &mcs->call,
+ sizeof(*call_list));
/* Only create a continuation if there is work left to be done. */
if ( i < nr_calls )