qemu-irix/include/hw
Daniel Henrique Barboza 10f12e6450 hw/ppc: CAS reset on early device hotplug
This patch is a follow up on the discussions made in patch
"hw/ppc: disable hotplug before CAS is completed" that can be
found at [1].

At this moment, we do not support CPU/memory hotplug in early
boot stages, before CAS. When a hotplug occurs, the event is logged
in an internal RTAS event log queue and an IRQ pulse is fired. In
regular conditions, the guest handles the interrupt by executing
check_exception, fetching the generated hotplug event and enabling
the device for use.

In early boot, this IRQ isn't caught (SLOF does not handle hotplug
events), leaving the event in the rtas event log queue. If the guest
executes check_exception due to another hotplug event, the re-assertion
of the IRQ ends up de-queuing the first hotplug event as well. In short,
a device hotplugged before CAS is considered coldplugged by SLOF.
This leads to device misbehavior and, in some cases, guest kernel
Ooops when trying to unplug the device.

A proper fix would be to turn every device hotplugged before CAS
as a colplugged device. This is not trivial to do with the current
code base though - the FDT is written in the guest memory at
ppc_spapr_reset and can't be retrieved without adding extra state
(fdt_size for example) that will need to managed and migrated. Adding
the hotplugged DT in the middle of CAS negotiation via the updated DT
tree works with CPU devs, but panics the guest kernel at boot. Additional
analysis would be necessary for LMBs and PCI devices. There are
questions to be made in QEMU/SLOF/kernel level about how we can make
this change in a sustainable way.

With Linux guests, a fix would be the kernel executing check_exception
at boot time, de-queueing the events that happened in early boot and
processing them. However, even if/when the newer kernels start
fetching these events at boot time, we need to take care of older
kernels that won't be doing that.

This patch works around the situation by issuing a CAS reset if a hotplugged
device is detected during CAS:

- the DRC conditions that warrant a CAS reset is the same as those that
triggers a DRC migration - the DRC must have a device attached and
the DRC state is not equal to its ready_state. With that in mind, this
patch makes use of 'spapr_drc_needed' to determine if a CAS reset
is needed.

- In the middle of CAS negotiations, the function
'spapr_hotplugged_dev_before_cas' goes through all the DRCs to see
if there are any DRC that requires a reset, using spapr_drc_needed. If
that happens, returns '1' in 'spapr_h_cas_compose_response' which will set
spapr->cas_reboot to true, causing the machine to reboot.

No changes are made for coldplug devices.

[1] http://lists.nongnu.org/archive/html/qemu-devel/2017-08/msg02855.html

Signed-off-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2017-09-08 09:30:54 +10:00
..
acpi migration: Remove unneeded includes of migration/vmstate.h 2017-06-01 18:49:22 +02:00
adc
arm armv7m_nvic.h: Move from include/hw/arm to include/hw/intc 2017-09-04 15:21:53 +01:00
audio audio: Rename hw/audio/audio.h to hw/audio/soundhw.h 2017-05-19 10:48:54 +02:00
block
char hw/char/cmsdk-apb-uart.c: Implement CMSDK APB UART 2017-07-17 13:36:08 +01:00
core
cpu
cris
display
dma
gpio
i2c
i386 intel_iommu: use access_flags for iotlb 2017-08-02 00:13:25 +03:00
ide ahci: split public and private interface 2017-07-18 11:47:57 -04:00
input ps2: add and use PS2State typedef 2017-06-23 11:51:50 +02:00
intc nvic: Add NS alias SCS region 2017-09-07 13:54:53 +01:00
ipack
ipmi ipmi: introduce an ipmi_bmc_gen_event() API 2017-04-26 12:41:55 +10:00
isa isa: use get_uint() for "io-base" 2017-06-20 14:31:32 +02:00
kvm
lm32
m68k
mem hw/ppc/spapr: Fix segfault when instantiating a 'pc-dimm' without 'memdev' 2017-08-22 21:26:46 +10:00
mips mips: Add KVM T&E segment support for TCG 2017-08-02 22:18:06 +01:00
misc hw/misc/mps2_scc: Implement MPS2 Serial Communication Controller 2017-07-17 13:36:08 +01:00
net net/ftgmac100: add a 'aspeed' property 2017-04-25 19:17:25 +08:00
nvram fw_cfg: move QOM type defines and fw_cfg types into fw_cfg.h 2017-07-17 15:41:30 -03:00
pci kvm: remove hard dependency on pci 2017-08-30 18:23:25 +02:00
pci-host q35/mch: implement extended TSEG sizes 2017-06-16 18:07:08 +03:00
ppc hw/ppc: CAS reset on early device hotplug 2017-09-08 09:30:54 +10:00
s390x s390x/kvm: move KVM declarations and stubs to separate files 2017-08-30 18:23:26 +02:00
scsi
sd
sh4
smbios
sparc
ssi
timer hw/char/cmsdk-apb-timer: Implement CMSDK APB timer device 2017-07-17 13:36:08 +01:00
tricore
unicore32
usb
vfio memory/iommu: QOM'fy IOMMU MemoryRegion 2017-07-14 12:04:41 +02:00
virtio virtio-net: enable configurable tx queue size 2017-07-03 22:29:48 +03:00
watchdog watchdog: wdt_aspeed: Add support for the reset width register 2017-09-04 15:21:54 +01:00
xen xen: don't use xenstore to save/restore physmap anymore 2017-07-18 14:16:52 -07:00
boards.h boards.h: Define new flag ignore_memory_transaction_failures 2017-09-07 13:54:54 +01:00
bt.h
compat.h s390x: introduce 2.11 compat machine 2017-08-30 18:23:25 +02:00
devices.h sm501: QOMify 2017-04-24 12:32:12 +01:00
elf_ops.h loader: Ignore zero-sized ELF segments 2017-09-04 15:21:53 +01:00
empty_slot.h
fw-path-provider.h
hotplug.h
hw.h migration: Split qemu-file.h 2017-06-01 18:49:22 +02:00
ide.h
irq.h
loader-fit.h
loader.h
nmi.h
or-irq.h
pcmcia.h
platform-bus.h
ptimer.h include/hw/ptimer.h: Add documentation comments 2017-07-11 17:44:27 +03:00
qdev-core.h qapi: Change data type of the FOO_lookup generated for enum FOO 2017-09-04 13:09:13 +02:00
qdev-dma.h
qdev-properties.h qdev: provide DEFINE_PROP_INT64() 2017-07-18 17:36:19 +02:00
qdev.h
register.h
registerfields.h
stream.h
sysbus.h
usb.h