It's only ever handle_hpet_broadcast() that's used. While we now don't
enable IRQs right away, still play safe and convert the function pointer
to a boolean, to make sure no calls occur too early.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
v2: Re-base over changes earlier in the series.
--- a/xen/arch/x86/hpet.c
+++ b/xen/arch/x86/hpet.c
@@ -40,7 +40,7 @@ struct hpet_event_channel
s_time_t next_event;
cpumask_var_t cpumask;
spinlock_t lock;
- void (*event_handler)(struct hpet_event_channel *ch);
+ bool event_handler;
unsigned int idx; /* physical channel idx */
unsigned int cpu; /* msi target */
@@ -194,7 +194,7 @@ static void evt_do_broadcast(cpumask_t *
cpumask_raise_softirq(mask, TIMER_SOFTIRQ);
}
-static void cf_check handle_hpet_broadcast(struct hpet_event_channel *ch)
+static void handle_hpet_broadcast(struct hpet_event_channel *ch)
{
cpumask_t *scratch = this_cpu(hpet_scratch_cpumask);
s_time_t now, next_event;
@@ -250,7 +250,7 @@ static void cf_check hpet_interrupt_hand
return;
}
- ch->event_handler(ch);
+ handle_hpet_broadcast(ch);
}
static void hpet_enable_channel(struct hpet_event_channel *ch)
@@ -657,7 +657,7 @@ void __init hpet_broadcast_init(void)
hpet_events[i].next_event = STIME_MAX;
spin_lock_init(&hpet_events[i].lock);
smp_wmb();
- hpet_events[i].event_handler = handle_hpet_broadcast;
+ hpet_events[i].event_handler = true;
hpet_events[i].msi.msi_attrib.maskbit = 1;
hpet_events[i].msi.msi_attrib.pos = MSI_TYPE_HPET;
@@ -808,7 +808,9 @@ int hpet_legacy_irq_tick(void)
(hpet_events->flags & (HPET_EVT_DISABLE|HPET_EVT_LEGACY)) !=
HPET_EVT_LEGACY )
return 0;
- hpet_events->event_handler(hpet_events);
+
+ handle_hpet_broadcast(hpet_events);
+
return 1;
}