On 06.03.2025 16:54, Juergen Gross wrote:
> --- a/xen/common/event_channel.c
> +++ b/xen/common/event_channel.c
> @@ -1036,7 +1036,9 @@ int set_global_virq_handler(struct domain *d, uint32_t
> virq)
> {
> old = global_virq_handlers[virq];
> hdl = get_global_virq_handler(virq);
> - if ( hdl != d )
> + if ( !hdl )
> + global_virq_handlers[virq] = d;
> + else if ( hdl != d )
> {
> read_lock(&hdl->event_lock);
>
> @@ -1091,7 +1093,7 @@ struct domain *lock_dom_exc_handler(void)
> struct domain *d;
>
> d = get_global_virq_handler(VIRQ_DOM_EXC);
> - if ( unlikely(!get_domain(d)) )
> + if ( unlikely(!d || !get_domain(d)) )
According to my understanding of how unlikely() works this wants to be
if ( unlikely(!d) || unlikely(!get_domain(d)) )
Of course I could also live with being given an explanation of why my
understanding is wrong.
> return NULL;
>
> read_lock(&d->event_lock);
There's one more change needed: get_domain_state() needs to avoid calling
unlock_dom_exc_handler() when "hdl" is NULL.
Jan