Message ID | 20190621064615.20099-2-mst@redhat.com |
---|---|
State | New |
Headers | show |
Series | pcie: hotplug fixes | expand |
On Fri, 21 Jun 2019 02:46:46 -0400 "Michael S. Tsirkin" <mst@redhat.com> wrote: > If we are trying to set multiple bits at once, testing that just one of > them is already set gives a false positive. As a result we won't > interrupt guest if e.g. presence detection change and attention button > press are both set. This happens with multi-function device removal. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> > --- > hw/pci/pcie.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c > index 88c30ff74c..b22527000d 100644 > --- a/hw/pci/pcie.c > +++ b/hw/pci/pcie.c > @@ -383,7 +383,7 @@ static void pcie_cap_slot_event(PCIDevice *dev, PCIExpressHotPlugEvent event) > { > /* Minor optimization: if nothing changed - no event is needed. */ > if (pci_word_test_and_set_mask(dev->config + dev->exp.exp_cap + > - PCI_EXP_SLTSTA, event)) { > + PCI_EXP_SLTSTA, event) == event) { > return; > } > hotplug_event_notify(dev);
On 6/21/19 9:46 AM, Michael S. Tsirkin wrote: > If we are trying to set multiple bits at once, testing that just one of > them is already set gives a false positive. As a result we won't > interrupt guest if e.g. presence detection change and attention button > press are both set. This happens with multi-function device removal. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > --- > hw/pci/pcie.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c > index 88c30ff74c..b22527000d 100644 > --- a/hw/pci/pcie.c > +++ b/hw/pci/pcie.c > @@ -383,7 +383,7 @@ static void pcie_cap_slot_event(PCIDevice *dev, PCIExpressHotPlugEvent event) > { > /* Minor optimization: if nothing changed - no event is needed. */ > if (pci_word_test_and_set_mask(dev->config + dev->exp.exp_cap + > - PCI_EXP_SLTSTA, event)) { > + PCI_EXP_SLTSTA, event) == event) { > return; > } > hotplug_event_notify(dev); Reviewed-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Thanks, Marcel
On 6/21/19 8:46 AM, Michael S. Tsirkin wrote: > If we are trying to set multiple bits at once, testing that just one of > them is already set gives a false positive. As a result we won't > interrupt guest if e.g. presence detection change and attention button > press are both set. This happens with multi-function device removal. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > --- > hw/pci/pcie.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c > index 88c30ff74c..b22527000d 100644 > --- a/hw/pci/pcie.c > +++ b/hw/pci/pcie.c > @@ -383,7 +383,7 @@ static void pcie_cap_slot_event(PCIDevice *dev, PCIExpressHotPlugEvent event) > { > /* Minor optimization: if nothing changed - no event is needed. */ > if (pci_word_test_and_set_mask(dev->config + dev->exp.exp_cap + > - PCI_EXP_SLTSTA, event)) { > + PCI_EXP_SLTSTA, event) == event) { > return; > } > hotplug_event_notify(dev); > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c index 88c30ff74c..b22527000d 100644 --- a/hw/pci/pcie.c +++ b/hw/pci/pcie.c @@ -383,7 +383,7 @@ static void pcie_cap_slot_event(PCIDevice *dev, PCIExpressHotPlugEvent event) { /* Minor optimization: if nothing changed - no event is needed. */ if (pci_word_test_and_set_mask(dev->config + dev->exp.exp_cap + - PCI_EXP_SLTSTA, event)) { + PCI_EXP_SLTSTA, event) == event) { return; } hotplug_event_notify(dev);
If we are trying to set multiple bits at once, testing that just one of them is already set gives a false positive. As a result we won't interrupt guest if e.g. presence detection change and attention button press are both set. This happens with multi-function device removal. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- hw/pci/pcie.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)