From: "Michael S. Tsirkin" <mst@redhat.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 3/3] pcie: work around for racy guest init
Date: Mon, 1 Jul 2019 05:20:41 -0400 [thread overview]
Message-ID: <20190701051959-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20190625150730.31d9d699@redhat.com>
On Tue, Jun 25, 2019 at 03:07:30PM +0200, Igor Mammedov wrote:
> On Fri, 21 Jun 2019 02:46:50 -0400
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
>
> > During boot, linux guests tend to clear all bits in pcie slot status
> > register which is used for hotplug.
> > If they clear bits that weren't set this is racy and will lose events:
> > not a big problem for manual hotplug on bare-metal, but a problem for us.
> >
> > For example, the following is broken ATM:
> >
> > /x86_64-softmmu/qemu-system-x86_64 -enable-kvm -S -machine q35 \
> > -device pcie-root-port,id=pcie_root_port_0,slot=2,chassis=2,addr=0x2,bus=pcie.0 \
> > -device virtio-balloon-pci,id=balloon,bus=pcie_root_port_0 \
> > -monitor stdio disk.qcow2
> > (qemu)device_del balloon
> > (qemu)cont
> >
> > Balloon isn't deleted as it should.
> >
> > As a work-around, detect this attempt to clear slot status and revert
> > status to what it was before the write.
> >
> > Note: in theory this can be detected as a duplicate button press
> > which cancels the previous press. Does not seem to happen in
> > practice as guests seem to only have this bug during init.
> >
> > Note2: the right thing to do is probably to fix Linux to
> > read status before clearing it, and act on the bits that are set.
> >
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> > hw/pci/pcie.c | 19 +++++++++++++++++++
> > 1 file changed, 19 insertions(+)
> >
> > diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
> > index f8490a00de..c605d32dd4 100644
> > --- a/hw/pci/pcie.c
> > +++ b/hw/pci/pcie.c
> > @@ -610,6 +610,25 @@ void pcie_cap_slot_write_config(PCIDevice *dev, uint16_t slt_ctl, uint16_t slt_s
> > uint16_t sltsta = pci_get_word(exp_cap + PCI_EXP_SLTSTA);
> >
> > if (ranges_overlap(addr, len, pos + PCI_EXP_SLTSTA, 2)) {
> > + /*
> > + * Guests tend to clears all bits during init.
> > + * If they clear bits that weren't set this is racy and will lose events:
> > + * not a big problem for manual button presses, but a problem for us.
> > + * As a work-around, detect this and revert status to what it was
> > + * before the write.
> > + *
> > + * Note: in theory this can be detected as a duplicate button press
> > + * which cancels the previous press. Does not seem to happen in
> > + * practice as guests seem to only have this bug during init.
> > + */
> > +#define PCIE_SLOT_EVENTS (PCI_EXP_SLTSTA_ABP | PCI_EXP_SLTSTA_PFD | \
> > + PCI_EXP_SLTSTA_MRLSC | PCI_EXP_SLTSTA_PDC | \
> > + PCI_EXP_SLTSTA_CC)
> > +
> > + if (val & ~slt_sta & PCIE_SLOT_EVENTS) {
> > + sltsta = (sltsta & ~PCIE_SLOT_EVENTS) | (slt_sta & PCIE_SLOT_EVENTS);
> I'm reading it as:
> sltsta = LOWER_PART(sltsta) | UPPER_PART(sltsta)
> which basically
> sltsta = sltsta
> or am I missing something here?
You are missing the underscore.
slt_sta is the old value.
sltsta is the new value.
> > + pci_set_word(exp_cap + PCI_EXP_SLTSTA, sltsta);
> > + }
> > hotplug_event_clear(dev);
> > }
> >
next prev parent reply other threads:[~2019-07-01 9:21 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-21 6:46 [Qemu-devel] [PATCH 0/3] pcie: hotplug fixes Michael S. Tsirkin
2019-06-21 6:46 ` [Qemu-devel] [PATCH 1/3] pcie: don't skip multi-mask events Michael S. Tsirkin
2019-06-25 11:14 ` Igor Mammedov
2019-07-01 7:01 ` Marcel Apfelbaum
2019-07-01 9:56 ` Philippe Mathieu-Daudé
2019-06-21 6:46 ` [Qemu-devel] [PATCH 2/3] pcie: check that slt ctrl changed before deleting Michael S. Tsirkin
2019-06-25 12:45 ` Igor Mammedov
2019-07-01 9:23 ` Michael S. Tsirkin
2019-07-01 7:03 ` Marcel Apfelbaum
2019-07-01 13:07 ` Igor Mammedov
2019-06-21 6:46 ` [Qemu-devel] [PATCH 3/3] pcie: work around for racy guest init Michael S. Tsirkin
2019-06-25 13:07 ` Igor Mammedov
2019-07-01 9:20 ` Michael S. Tsirkin [this message]
2019-07-01 12:04 ` Igor Mammedov
2019-07-01 12:08 ` Michael S. Tsirkin
2019-07-01 7:04 ` Marcel Apfelbaum
[not found] ` <20190701105708.5d28f497@redhat.com>
2019-07-01 9:12 ` Marcel Apfelbaum
2019-07-01 9:13 ` Marcel Apfelbaum
2019-07-01 13:01 ` Igor Mammedov
2019-07-01 9:34 ` [Qemu-devel] [PATCH 4/3] pcie: minor cleanups for slot control/status Michael S. Tsirkin
2019-07-01 9:56 ` Philippe Mathieu-Daudé
2019-07-01 13:07 ` Igor Mammedov
2019-07-01 13:51 ` Christophe de Dinechin
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=20190701051959-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=imammedo@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.