diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2004-11-25 22:09:38 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2004-11-25 22:09:38 +0000 |
commit | 9ce92d7114a910ffa57b0e62c50777991a65fd15 (patch) | |
tree | 7b1202eb05627a6fc324e08628444ecea84b4a10 /xen/common/multicall.c | |
parent | df4685e4eac7bb99681fb3dd49345bb802178d39 (diff) | |
download | xen-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.c | 8 |
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 ) |