From: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
To: qemu-devel@nongnu.org, mst@redhat.com
Cc: dgibson@redhat.com, jusual@redhat.com
Subject: [PATCH] pci: Refuse to hotplug PCI Devices when the Guest OS is not ready
Date: Thu, 22 Oct 2020 14:40:26 +0300 [thread overview]
Message-ID: <20201022114026.31968-1-marcel.apfelbaum@gmail.com> (raw)
From: Marcel Apfelbaum <marcel@redhat.com>
During PCIe Root Port's transition from Power-Off to Power-ON (or vice-versa)
the "Slot Control Register" has the "Power Indicator Control"
set to "Blinking" expressing a "power transition" mode.
Any hotplug operation during the "power transition" mode is not permitted
or at least not expected by the Guest OS leading to strange failures.
Detect and refuse hotplug operations in such case.
Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
---
hw/pci/pcie.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
index 5b48bae0f6..2fe5c1473f 100644
--- a/hw/pci/pcie.c
+++ b/hw/pci/pcie.c
@@ -410,6 +410,7 @@ void pcie_cap_slot_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
PCIDevice *hotplug_pdev = PCI_DEVICE(hotplug_dev);
uint8_t *exp_cap = hotplug_pdev->config + hotplug_pdev->exp.exp_cap;
uint32_t sltcap = pci_get_word(exp_cap + PCI_EXP_SLTCAP);
+ uint32_t sltctl = pci_get_word(exp_cap + PCI_EXP_SLTCTL);
/* Check if hot-plug is disabled on the slot */
if (dev->hotplugged && (sltcap & PCI_EXP_SLTCAP_HPC) == 0) {
@@ -418,6 +419,12 @@ void pcie_cap_slot_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
return;
}
+ if ((sltctl & PCI_EXP_SLTCTL_PIC) == PCI_EXP_SLTCTL_PWR_IND_BLINK) {
+ error_setg(errp, "Hot-plug failed: %s is in Power Transition",
+ DEVICE(hotplug_pdev)->id);
+ return;
+ }
+
pcie_cap_slot_plug_common(PCI_DEVICE(hotplug_dev), dev, errp);
}
--
2.17.2
next reply other threads:[~2020-10-22 12:11 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-22 11:40 Marcel Apfelbaum [this message]
2020-10-22 12:06 ` [PATCH] pci: Refuse to hotplug PCI Devices when the Guest OS is not ready Michael S. Tsirkin
2020-10-22 12:56 ` David Gibson
2020-10-22 13:15 ` Michael S. Tsirkin
2020-10-23 3:30 ` David Gibson
2020-10-22 13:55 ` Marcel Apfelbaum
2020-10-22 14:01 ` Michael S. Tsirkin
2020-10-22 14:10 ` Marcel Apfelbaum
2020-10-22 14:32 ` Michael S. Tsirkin
2020-10-22 14:50 ` Marcel Apfelbaum
2020-10-22 15:01 ` Michael S. Tsirkin
2020-10-23 3:49 ` David Gibson
2020-10-23 6:47 ` Marcel Apfelbaum
2020-10-23 15:54 ` Michael S. Tsirkin
2020-10-23 17:27 ` Igor Mammedov
2020-10-26 6:38 ` David Gibson
2020-10-26 9:17 ` Peter Krempa
2020-10-26 6:35 ` David Gibson
2020-10-23 6:26 ` Marcel Apfelbaum
2020-10-26 6:45 ` David Gibson
2020-10-27 11:26 ` Michael S. Tsirkin
2020-10-27 12:54 ` Igor Mammedov
2020-10-27 13:02 ` Michael S. Tsirkin
2020-10-28 3:34 ` David Gibson
2020-10-28 3:31 ` David Gibson
2020-10-28 15:39 ` Igor Mammedov
2020-10-28 17:49 ` Michael S. Tsirkin
2020-10-27 11:30 ` Michael S. Tsirkin
2020-10-23 3:31 ` David Gibson
2020-11-11 12:35 ` Michael S. Tsirkin
2020-11-15 16:48 ` Marcel Apfelbaum
2020-11-11 16:09 ` Roman Kagan
2020-11-15 16:43 ` Marcel Apfelbaum
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201022114026.31968-1-marcel.apfelbaum@gmail.com \
--to=marcel.apfelbaum@gmail.com \
--cc=dgibson@redhat.com \
--cc=jusual@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).