[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] multicall: don't ignore failure from __copy_to_guest() upon preemption
On 11/11/2011 11:16, "Jan Beulich" <JBeulich@xxxxxxxx> wrote: > At once adjust perf counter updates to also count calls from here even > if a guest memory access failed. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Keir Fraser <keir@xxxxxxx> > --- a/xen/common/multicall.c > +++ b/xen/common/multicall.c > @@ -25,6 +25,7 @@ do_multicall( > { > struct mc_state *mcs = ¤t->mc_state; > unsigned int i; > + int rc = 0; > > if ( unlikely(__test_and_set_bit(_MCSF_in_multicall, &mcs->flags)) ) > { > @@ -33,15 +34,18 @@ do_multicall( > } > > if ( unlikely(!guest_handle_okay(call_list, nr_calls)) ) > - goto fault; > + rc = -EFAULT; > > - for ( i = 0; i < nr_calls; i++ ) > + for ( i = 0; !rc && i < nr_calls; i++ ) > { > if ( hypercall_preempt_check() ) > goto preempted; > > if ( unlikely(__copy_from_guest(&mcs->call, call_list, 1)) ) > - goto fault; > + { > + rc = -EFAULT; > + break; > + } > > do_multicall_call(&mcs->call); > > @@ -58,30 +62,25 @@ do_multicall( > #endif > > if ( unlikely(__copy_field_to_guest(call_list, &mcs->call, result)) ) > - goto fault; > - > - if ( test_bit(_MCSF_call_preempted, &mcs->flags) ) > + rc = -EFAULT; > + else if ( test_bit(_MCSF_call_preempted, &mcs->flags) ) > { > /* Translate sub-call continuation to guest layout */ > xlat_multicall_entry(mcs); > > /* Copy the sub-call continuation. */ > - (void)__copy_to_guest(call_list, &mcs->call, 1); > - goto preempted; > + if ( likely(!__copy_to_guest(call_list, &mcs->call, 1)) ) > + goto preempted; > + rc = -EFAULT; > } > - > - guest_handle_add_offset(call_list, 1); > + else > + guest_handle_add_offset(call_list, 1); > } > > perfc_incr(calls_to_multicall); > - perfc_add(calls_from_multicall, nr_calls); > - mcs->flags = 0; > - return 0; > - > - fault: > - perfc_incr(calls_to_multicall); > + perfc_add(calls_from_multicall, i); > mcs->flags = 0; > - return -EFAULT; > + return rc; > > preempted: > perfc_add(calls_from_multicall, i); > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |