On 04.03.2025 00:29, Andrew Cooper wrote:
> --- a/xen/common/sched/core.c
> +++ b/xen/common/sched/core.c
> @@ -1534,12 +1534,19 @@ long vcpu_yield(void)
>
> static void cf_check domain_watchdog_timeout(void *data)
> {
> - struct domain *d = data;
> + /*
> + * The data parameter encodes the watchdog id in the low bits of
> + * the domain pointer.
> + */
> + struct domain *d = _p((unsigned long)data & PAGE_MASK);
> + unsigned int id = (unsigned long)data & ~PAGE_MASK;
> +
> + BUILD_BUG_ON(!(alignof(d) < PAGE_SIZE));
BUILD_BUG_ON(alignof(*d) < PAGE_SIZE);
> @@ -1593,7 +1600,17 @@ void watchdog_domain_init(struct domain *d)
> d->watchdog_inuse_map = 0;
>
> for ( i = 0; i < NR_DOMAIN_WATCHDOG_TIMERS; i++ )
> - init_timer(&d->watchdog_timer[i], domain_watchdog_timeout, d, 0);
> + {
> + void *data = d;
> +
> + BUILD_BUG_ON(NR_DOMAIN_WATCHDOG_TIMERS > alignof(d));
BUILD_BUG_ON(NR_DOMAIN_WATCHDOG_TIMERS > alignof(*d));
Jan