spin_lock(&d->event_lock);
- if ( v->virq_to_evtchn[virq] != 0 )
+ if ( read_atomic(&v->virq_to_evtchn[virq]) )
ERROR_EXIT(-EEXIST);
if ( port != 0 )
evtchn_write_unlock(chn);
- v->virq_to_evtchn[virq] = bind->port = port;
+ bind->port = port;
+ write_atomic(&v->virq_to_evtchn[virq], port);
out:
spin_unlock(&d->event_lock);
case ECS_VIRQ:
for_each_vcpu ( d1, v )
{
- if ( v->virq_to_evtchn[chn1->u.virq] != port1 )
+ if ( read_atomic(&v->virq_to_evtchn[chn1->u.virq]) != port1 )
continue;
- v->virq_to_evtchn[chn1->u.virq] = 0;
+ write_atomic(&v->virq_to_evtchn[chn1->u.virq], 0);
spin_barrier(&v->virq_lock);
}
break;
if ( virq_is_global(virq) && v->vcpu_id )
v = domain_vcpu(v->domain, 0);
- return v->virq_to_evtchn[virq];
+ return read_atomic(&v->virq_to_evtchn[virq]);
}
void send_guest_vcpu_virq(struct vcpu *v, uint32_t virq)
spin_lock_irqsave(&v->virq_lock, flags);
- port = v->virq_to_evtchn[virq];
+ port = read_atomic(&v->virq_to_evtchn[virq]);
if ( unlikely(port == 0) )
goto out;
spin_lock_irqsave(&v->virq_lock, flags);
- port = v->virq_to_evtchn[virq];
+ port = read_atomic(&v->virq_to_evtchn[virq]);
if ( unlikely(port == 0) )
goto out;