|
[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 |