s390x/flic: optimize CPU wakeup for TCG
Kicking all CPUs on every floating interrupt is far from efficient. Let's optimize it at least a little bit. Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20180129125623.21729-12-david@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
6e0d8175d6
commit
631b59664c
|
@ -161,10 +161,37 @@ static void qemu_s390_flic_notify(uint32_t type)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have to make all CPUs see CPU_INTERRUPT_HARD, so they might
|
* We have to make all CPUs see CPU_INTERRUPT_HARD, so they might
|
||||||
* consider it. TODO: don't kick/wakeup all VCPUs but try to be
|
* consider it. We will kick all running CPUs and only relevant
|
||||||
* smarter (using the interrupt type).
|
* sleeping ones.
|
||||||
*/
|
*/
|
||||||
CPU_FOREACH(cs) {
|
CPU_FOREACH(cs) {
|
||||||
|
S390CPU *cpu = S390_CPU(cs);
|
||||||
|
|
||||||
|
cs->interrupt_request |= CPU_INTERRUPT_HARD;
|
||||||
|
|
||||||
|
/* ignore CPUs that are not sleeping */
|
||||||
|
if (s390_cpu_get_state(cpu) != CPU_STATE_OPERATING &&
|
||||||
|
s390_cpu_get_state(cpu) != CPU_STATE_LOAD) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we always kick running CPUs for now, this is tricky */
|
||||||
|
if (cs->halted) {
|
||||||
|
/* don't check for subclasses, CPUs double check when waking up */
|
||||||
|
if (type & FLIC_PENDING_SERVICE) {
|
||||||
|
if (!(cpu->env.psw.mask & PSW_MASK_EXT)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (type & FLIC_PENDING_IO) {
|
||||||
|
if (!(cpu->env.psw.mask & PSW_MASK_IO)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (type & FLIC_PENDING_MCHK_CR) {
|
||||||
|
if (!(cpu->env.psw.mask & PSW_MASK_MCHECK)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
cpu_interrupt(cs, CPU_INTERRUPT_HARD);
|
cpu_interrupt(cs, CPU_INTERRUPT_HARD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -692,6 +692,10 @@ static inline unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_USER_ONLY */
|
#endif /* CONFIG_USER_ONLY */
|
||||||
|
static inline uint8_t s390_cpu_get_state(S390CPU *cpu)
|
||||||
|
{
|
||||||
|
return cpu->env.cpu_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* cpu_models.c */
|
/* cpu_models.c */
|
||||||
|
|
|
@ -278,11 +278,6 @@ static inline void s390_do_cpu_full_reset(CPUState *cs, run_on_cpu_data arg)
|
||||||
cpu_reset(cs);
|
cpu_reset(cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint8_t s390_cpu_get_state(S390CPU *cpu)
|
|
||||||
{
|
|
||||||
return cpu->env.cpu_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* arch_dump.c */
|
/* arch_dump.c */
|
||||||
int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
|
Loading…
Reference in a new issue