[libvirt] [PATCH v2 4/4] util: Do not keep PCI device config file open
Peter Krempa
pkrempa at redhat.com
Wed Dec 5 11:34:36 UTC 2012
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
More information about the libvir-list
mailing list