[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v6 1/3] evtchn: slightly defer lock acquire where possible
On 28.05.2021 10:30, Roger Pau Monné wrote: > On Thu, May 27, 2021 at 07:48:41PM +0100, Julien Grall wrote: >> On 27/05/2021 12:28, Jan Beulich wrote: >>> port_is_valid() and evtchn_from_port() are fine to use without holding >>> any locks. Accordingly acquire the per-domain lock slightly later in >>> evtchn_close() and evtchn_bind_vcpu(). >> >> So I agree that port_is_valid() and evtchn_from_port() are fine to use >> without holding any locks in evtchn_bind_vcpu(). However, this is misleading >> to say there is no problem with evtchn_close(). >> >> evtchn_close() can be called with current != d and therefore, there is a > > The only instances evtchn_close is called with current != d and the > domain could be unpaused is in free_xen_event_channel AFAICT. As long as the domain is not paused, ->valid_evtchns can't ever decrease: The only point where this gets done is in evtchn_destroy(). Hence ... >> risk that port_is_valid() may be valid and then invalid because >> d->valid_evtchns is decremented in evtchn_destroy(). > > Hm, I guess you could indeed have parallel calls to > free_xen_event_channel and evtchn_destroy in a way that > free_xen_event_channel could race with valid_evtchns getting > decreased? ... I don't see this as relevant. >> Thankfully the memory is still there. So the current code is okayish and I >> could reluctantly accept this behavior to be spread. However, I don't think >> this should be left uncommented in both the code (maybe on top of >> port_is_valid()?) and the commit message. > > Indeed, I think we need some expansion of the comment in port_is_valid > to clarify all this. I'm not sure I understand it properly myself when > it's fine to use port_is_valid without holding the per domain event > lock. Because of the above property plus the fact that even if ->valid_evtchns decreases, the underlying struct evtchn instance will remain valid (i.e. won't get de-allocated, which happens only in evtchn_destroy_final()), it is always fine to use it without lock. With this I'm having trouble seeing what would need adding to port_is_valid()'s commentary. The only thing which shouldn't happen anywhere is following a port_is_valid() check which has returned false by code assuming the port is going to remain invalid. But I think that's obvious when you don't hold any suitable lock. I do intend to follow Julien's request to explain things more for evtchn_close(). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |