Samuel Thibault
2008-May-08 10:18 UTC
[Xen-devel] evtchn_do_upcall() barrier between upcall_pending and pending_sel
Hello, In evtchn_do_upcall() there is a barrier between setting upcall_pending and pending_sel, which makes sense to avoid losing events, however I don''t understand why it is a rmb(). memory-barriers.txt says that rmb() only provides ordering of reads, not stores. Shouldn''t that be a wmb() instead then? Samuel _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2008-May-08 10:25 UTC
Re: [Xen-devel] evtchn_do_upcall() barrier between upcall_pending and pending_sel
Makes sense, yes. -- Keir On 8/5/08 11:18, "Samuel Thibault" <samuel.thibault@eu.citrix.com> wrote:> Hello, > > In evtchn_do_upcall() there is a barrier between setting upcall_pending > and pending_sel, which makes sense to avoid losing events, however I > don''t understand why it is a rmb(). memory-barriers.txt says that rmb() > only provides ordering of reads, not stores. Shouldn''t that be a wmb() > instead then? > > Samuel > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Samuel Thibault
2008-May-08 10:34 UTC
Re: [Xen-devel] evtchn_do_upcall() barrier between upcall_pending and pending_sel
Keir Fraser, le Thu 08 May 2008 11:25:59 +0100, a écrit :> Makes sense, yes.Here are fixes then. evtchn: Use wmb instead of rmb to enforce ordering between evtchn_upcall_pending and evtchn_pending_sel stores. Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com> diff -r e39cf97647af drivers/xen/core/evtchn.c --- a/drivers/xen/core/evtchn.c Mon May 05 10:17:41 2008 +0100 +++ b/drivers/xen/core/evtchn.c Thu May 08 11:33:59 2008 +0100 @@ -246,7 +246,7 @@ asmlinkage void evtchn_do_upcall(struct #ifndef CONFIG_X86 /* No need for a barrier -- XCHG is a barrier on x86. */ /* Clear master flag /before/ clearing selector flag. */ - rmb(); + wmb(); #endif l1 = xchg(&vcpu_info->evtchn_pending_sel, 0); minios: in non-x86 case, use wmb to enforce ordering between evtchn_upcall_pending and evtchn_pending_sel stores. Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com> diff -r 4965e711fee8 extras/mini-os/hypervisor.c --- a/extras/mini-os/hypervisor.c Wed May 07 15:36:32 2008 +0100 +++ b/extras/mini-os/hypervisor.c Thu May 08 11:31:35 2008 +0100 @@ -46,7 +46,11 @@ void do_hypervisor_callback(struct pt_re in_callback = 1; vcpu_info->evtchn_upcall_pending = 0; - /* NB. No need for a barrier here -- XCHG is a barrier on x86. */ + /* NB x86. No need for a barrier here -- XCHG is a barrier on x86. */ +#if !defined(__i386__) && !defined(__x86_64__) + /* clear master flag /before/ clearing selector flag. */ + wmb(); +#endif l1 = xchg(&vcpu_info->evtchn_pending_sel, 0); while ( l1 != 0 ) { _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel