[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 4/7] xen: add bitmap to indicate per-domain state changes
On 06.12.2024 14:02, Juergen Gross wrote: > Add a bitmap with one bit per possible domid indicating the respective > domain has changed its state (created, deleted, dying, crashed, > shutdown). > > Registering the VIRQ_DOM_EXC event will result in setting the bits for > all existing domains and resetting all other bits. > > Resetting a bit will be done in a future patch. > > This information is needed for Xenstore to keep track of all domains. > > Signed-off-by: Juergen Gross <jgross@xxxxxxxx> What I'm still missing is at least mention of the global-ness of all of this, and why that's deemed okay for now. > --- a/xen/common/domain.c > +++ b/xen/common/domain.c > @@ -138,6 +138,60 @@ bool __read_mostly vmtrace_available; > > bool __read_mostly vpmu_is_available; > > +static DEFINE_SPINLOCK(dom_state_changed_lock); > +static unsigned long *dom_state_changed; > + > +int domain_init_states(void) > +{ > + const struct domain *d; > + int rc = -ENOMEM; > + > + spin_lock(&dom_state_changed_lock); > + > + if ( dom_state_changed ) > + bitmap_zero(dom_state_changed, DOMID_FIRST_RESERVED); > + else > + { > + dom_state_changed = xzalloc_array(unsigned long, > + > BITS_TO_LONGS(DOMID_FIRST_RESERVED)); New code wants to use xvmalloc() et al. > --- a/xen/common/event_channel.c > +++ b/xen/common/event_channel.c > @@ -485,20 +485,27 @@ int evtchn_bind_virq(evtchn_bind_virq_t *bind, > evtchn_port_t port) > if ( (v = domain_vcpu(d, vcpu)) == NULL ) > return -ENOENT; > > + if ( virq == VIRQ_DOM_EXC ) > + { > + rc = domain_init_states(); > + if ( rc ) > + goto out; > + } > + > write_lock(&d->event_lock); > > if ( read_atomic(&v->virq_to_evtchn[virq]) ) > { > rc = -EEXIST; > gdprintk(XENLOG_WARNING, "EVTCHNOP failure: error %d\n", rc); > - goto out; > + goto unlock; > } > > port = rc = evtchn_get_port(d, port); > if ( rc < 0 ) > { > gdprintk(XENLOG_WARNING, "EVTCHNOP failure: error %d\n", rc); > - goto out; > + goto unlock; > } > > rc = 0; > @@ -524,9 +531,13 @@ int evtchn_bind_virq(evtchn_bind_virq_t *bind, > evtchn_port_t port) > */ > write_atomic(&v->virq_to_evtchn[virq], port); > > - out: > + unlock: > write_unlock(&d->event_lock); > > + out: > + if ( rc ) > + domain_deinit_states(); > + > return rc; > } Renaming the prior label (and hence needing to fiddle with existing goto-s) feels a little fragile. How about keeping "out" as is and introducing "deinit" or some such? Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |