|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 5/5] evtchn: don't call Xen consumer callback with per-channel lock held
On 02.12.2020 22:10, Julien Grall wrote:
> On 23/11/2020 13:30, Jan Beulich wrote:
>> While there don't look to be any problems with this right now, the lock
>> order implications from holding the lock can be very difficult to follow
>> (and may be easy to violate unknowingly). The present callbacks don't
>> (and no such callback should) have any need for the lock to be held.
>>
>> However, vm_event_disable() frees the structures used by respective
>> callbacks and isn't otherwise synchronized with invocations of these
>> callbacks, so maintain a count of in-progress calls, for evtchn_close()
>> to wait to drop to zero before freeing the port (and dropping the lock).
>
> AFAICT, this callback is not the only place where the synchronization is
> missing in the VM event code.
>
> For instance, vm_event_put_request() can also race against
> vm_event_disable().
>
> So shouldn't we handle this issue properly in VM event?
I suppose that's a question to the VM event folks rather than me?
>> ---
>> Should we make this accounting optional, to be requested through a new
>> parameter to alloc_unbound_xen_event_channel(), or derived from other
>> than the default callback being requested?
>
> Aside the VM event, do you see any value for the other caller?
No (albeit I'm not entirely certain about vpl011_notification()'s
needs), hence the consideration. It's unnecessary overhead in
those cases.
>> @@ -781,9 +786,15 @@ int evtchn_send(struct domain *ld, unsig
>> rport = lchn->u.interdomain.remote_port;
>> rchn = evtchn_from_port(rd, rport);
>> if ( consumer_is_xen(rchn) )
>> + {
>> + /* Don't keep holding the lock for the call below. */
>> + atomic_inc(&rchn->u.interdomain.active_calls);
>> + evtchn_read_unlock(lchn);
>> xen_notification_fn(rchn)(rd->vcpu[rchn->notify_vcpu_id],
>> rport);
>> - else
>> - evtchn_port_set_pending(rd, rchn->notify_vcpu_id, rchn);
>
> atomic_dec() doesn't contain any memory barrier, so we will want one
> between xen_notification_fn() and atomic_dec() to avoid re-ordering.
Oh, indeed. But smp_mb() is too heavy handed here - x86 doesn't
really need any barrier, yet would gain a full MFENCE that way.
Actually - looks like I forgot we gained smp_mb__before_atomic()
a little over half a year ago.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |