[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v2 1/2] xen/events: access last_priority and last_vcpu_id together
> -----Original Message----- > From: Jürgen Groß <jgross@xxxxxxxx> > Sent: 12 October 2020 10:56 > To: paul@xxxxxxx; xen-devel@xxxxxxxxxxxxxxxxxxxx > Cc: 'Andrew Cooper' <andrew.cooper3@xxxxxxxxxx>; 'George Dunlap' > <george.dunlap@xxxxxxxxxx>; 'Ian > Jackson' <iwj@xxxxxxxxxxxxxx>; 'Jan Beulich' <jbeulich@xxxxxxxx>; 'Julien > Grall' <julien@xxxxxxx>; > 'Stefano Stabellini' <sstabellini@xxxxxxxxxx>; 'Wei Liu' <wl@xxxxxxx> > Subject: Re: [PATCH v2 1/2] xen/events: access last_priority and last_vcpu_id > together > > On 12.10.20 11:48, Paul Durrant wrote: > >> -----Original Message----- > >> From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of > >> Juergen Gross > >> Sent: 12 October 2020 10:28 > >> To: xen-devel@xxxxxxxxxxxxxxxxxxxx > >> Cc: Juergen Gross <jgross@xxxxxxxx>; Andrew Cooper > >> <andrew.cooper3@xxxxxxxxxx>; George Dunlap > >> <george.dunlap@xxxxxxxxxx>; Ian Jackson <iwj@xxxxxxxxxxxxxx>; Jan Beulich > >> <jbeulich@xxxxxxxx>; > Julien > >> Grall <julien@xxxxxxx>; Stefano Stabellini <sstabellini@xxxxxxxxxx>; Wei > >> Liu <wl@xxxxxxx> > >> Subject: [PATCH v2 1/2] xen/events: access last_priority and last_vcpu_id > >> together > >> > >> The queue for a fifo event is depending on the vcpu_id and the > >> priority of the event. When sending an event it might happen the > >> event needs to change queues and the old queue needs to be kept for > >> keeping the links between queue elements intact. For this purpose > >> the event channel contains last_priority and last_vcpu_id values > >> elements for being able to identify the old queue. > >> > >> In order to avoid races always access last_priority and last_vcpu_id > >> with a single atomic operation avoiding any inconsistencies. > >> > >> Signed-off-by: Juergen Gross <jgross@xxxxxxxx> > >> --- > >> xen/common/event_fifo.c | 25 +++++++++++++++++++------ > >> xen/include/xen/sched.h | 3 +-- > >> 2 files changed, 20 insertions(+), 8 deletions(-) > >> > >> diff --git a/xen/common/event_fifo.c b/xen/common/event_fifo.c > >> index fc189152e1..fffbd409c8 100644 > >> --- a/xen/common/event_fifo.c > >> +++ b/xen/common/event_fifo.c > >> @@ -42,6 +42,14 @@ struct evtchn_fifo_domain { > >> unsigned int num_evtchns; > >> }; > >> > >> +union evtchn_fifo_lastq { > >> + u32 raw; > >> + struct { > >> + u8 last_priority; > >> + u16 last_vcpu_id; > >> + }; > >> +}; > > > > I guess you want to s/u32/uint32_t, etc. above. > > Hmm, yes, probably. > > > > >> + > >> static inline event_word_t *evtchn_fifo_word_from_port(const struct > >> domain *d, > >> unsigned int port) > >> { > >> @@ -86,16 +94,18 @@ static struct evtchn_fifo_queue *lock_old_queue(const > >> struct domain *d, > >> struct vcpu *v; > >> struct evtchn_fifo_queue *q, *old_q; > >> unsigned int try; > >> + union evtchn_fifo_lastq lastq; > >> > >> for ( try = 0; try < 3; try++ ) > >> { > >> - v = d->vcpu[evtchn->last_vcpu_id]; > >> - old_q = &v->evtchn_fifo->queue[evtchn->last_priority]; > >> + lastq.raw = read_atomic(&evtchn->fifo_lastq); > >> + v = d->vcpu[lastq.last_vcpu_id]; > >> + old_q = &v->evtchn_fifo->queue[lastq.last_priority]; > >> > >> spin_lock_irqsave(&old_q->lock, *flags); > >> > >> - v = d->vcpu[evtchn->last_vcpu_id]; > >> - q = &v->evtchn_fifo->queue[evtchn->last_priority]; > >> + v = d->vcpu[lastq.last_vcpu_id]; > >> + q = &v->evtchn_fifo->queue[lastq.last_priority]; > >> > >> if ( old_q == q ) > >> return old_q; > >> @@ -246,8 +256,11 @@ static void evtchn_fifo_set_pending(struct vcpu *v, > >> struct evtchn *evtchn) > >> /* Moved to a different queue? */ > >> if ( old_q != q ) > >> { > >> - evtchn->last_vcpu_id = v->vcpu_id; > >> - evtchn->last_priority = q->priority; > >> + union evtchn_fifo_lastq lastq; > >> + > >> + lastq.last_vcpu_id = v->vcpu_id; > >> + lastq.last_priority = q->priority; > >> + write_atomic(&evtchn->fifo_lastq, lastq.raw); > >> > > > > You're going to leak some stack here I think. Perhaps add a 'pad' field > > between 'last_priority' and > 'last_vcpu_id' and zero it? > > I can do that, but why? This is nothing a guest is supposed to see at > any time. True, but it would also be nice if the value of 'raw' was at least predictable. I guest just adding '= {}' to the declaration would actually be easiest. Paul > > > Juergen
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |