[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH v2 4/4] util: Do not keep PCI device config file open



On 12/04/12 23:23, Jiri Denemark wrote:
Directly open and close PCI config file in the APIs that need it rather
than keeping the file open for the whole life of PCI device structure.
---
  src/util/pci.c | 265 +++++++++++++++++++++++++++++++++------------------------
  1 file changed, 156 insertions(+), 109 deletions(-)

diff --git a/src/util/pci.c b/src/util/pci.c
index e410245..8bded78 100644
--- a/src/util/pci.c
+++ b/src/util/pci.c


  static void
-pciWrite32(pciDevice *dev, unsigned pos, uint32_t val)
+pciWrite32(pciDevice *dev, int cfgfd, unsigned pos, uint32_t val)
  {
      uint8_t buf[4] = { (val >> 0), (val >> 8), (val >> 16), (val >> 14) };

EW! this is a serious bug! Moving the value by 14 bits. I'll post a patch for this as it's not relevant for this patch.

-    pciWrite(dev, pos, &buf[0], sizeof(buf));
+    pciWrite(dev, cfgfd, pos, &buf[0], sizeof(buf));
  }

  typedef int (*pciIterPredicate)(pciDevice *, pciDevice *, void *);
@@ -343,16 +349,16 @@ pciIterDevices(pciIterPredicate predicate,
  }


@@ -687,18 +722,20 @@ pciTryPowerManagementReset(pciDevice *dev)

      VIR_DEBUG("%s %s: doing a power management reset", dev->id, dev->name);

-    ctl = pciRead32(dev, dev->pci_pm_cap_pos + PCI_PM_CTRL);
+    ctl = pciRead32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL);
      ctl &= ~PCI_PM_CTRL_STATE_MASK;

-    pciWrite32(dev, dev->pci_pm_cap_pos + PCI_PM_CTRL, ctl|PCI_PM_CTRL_STATE_D3hot);
+    pciWrite32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL,
+               ctl | PCI_PM_CTRL_STATE_D3hot);

And the issue pointed up would hit us right here.


      usleep(10 * 1000); /* sleep 10ms */

-    pciWrite32(dev, dev->pci_pm_cap_pos + PCI_PM_CTRL, ctl|PCI_PM_CTRL_STATE_D0);
+    pciWrite32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL,
+               ctl | PCI_PM_CTRL_STATE_D0);

      usleep(10 * 1000); /* sleep 10ms */

-    if (pciWrite(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) {
+    if (pciWrite(dev, cfgfd, 0, &config_space[0], PCI_CONF_LEN) < 0) {
          virReportError(VIR_ERR_INTERNAL_ERROR,
                         _("Failed to restore PCI config space for %s"),
                         dev->name);


ACK.

Peter


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]