[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] xenbus stress testing



> 
> James Harper writes ("RE: [Xen-devel] xenbus stress testing"):
> > I think I have found the error and it was probably a 1 in a million
race
> > so stress testing might not have helped anyway. My code went:
> >
> > len = min(ring->rsp_prod - ring->rsp_cons, msg_size)
> >
> > and the ASSERT was hit because len was > msg_size, and the only
possible
> > way I can ever see that happening is if ring->rsp_prod changed
between
> > the if in the min() and the assignment. I'm now snapshotting
rsp_prod to
> > a local variable at the start. Kind of embarrassing really as plenty
of
> > example code exists.
> 
> You need to think about memory barriers and/or volatile.  Simply
> "snapshotting" with an ordinary assignment doesn't work.
> 
> I don't know how this is done in Windows but the Linux kernel has a
> clear explanation of the problem and how it's solved in Linux.  Look
> in the kernel source tree in Documentation/memory-barriers.txt.
> 

I issue a barrier (KeMemoryBarrier() which is a compiler and a memory
barrier) after copying rsp_prod, eg:

rsp_prod = ring->rsp_prod;
KeMemoryBarrier();
Access the actual ring buffer

Is there anything else required?

James

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.