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

li guang lig.fnst at cn.fujitsu.com
Wed Dec 5 02:42:14 UTC 2012


在 2012-12-04二的 23:23 +0100,Jiri Denemark写道:
> 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
[snip]
>      /* otherwise, SRIOV allows VFs to be on different busses then their PFs.
>       * In this case, what we need to do is look for the "best" match; i.e.
> @@ -557,25 +572,38 @@ pciIsParent(pciDevice *dev, pciDevice *check, void *data)
>          if (*best == NULL) {
>              *best = pciGetDevice(check->domain, check->bus, check->slot,
>                                   check->function);
> -            if (*best == NULL)
> -                return -1;
> -        }
> -        else {
       --    **     --
> +            if (*best == NULL) {
> +                ret = -1;
> +                goto cleanup;
> +            }

	--first--

> +        } else {
>              /* OK, we had already recorded a previous "best" match for the
>               * parent.  See if the current device is more restrictive than the
>               * best, and if so, make it the new best
>               */
> -            if (secondary > pciRead8(*best, PCI_SECONDARY_BUS)) {
> +            int bestfd;
> +            uint8_t best_secondary;
> +
> +            if ((bestfd = pciConfigOpen(*best, false)) < 0)
> +                goto cleanup;
> +            best_secondary = pciRead8(*best, bestfd, PCI_SECONDARY_BUS);
> +            pciConfigClose(*best, bestfd);
> +
> +            if (secondary > best_secondary) {
>                  pciFreeDevice(*best);
>                  *best = pciGetDevice(check->domain, check->bus, check->slot,
>                                       check->function);
> -                if (*best == NULL)
> -                    return -1;
		--    **     --
> +                if (*best == NULL) {
> +                    ret = -1;
> +                    goto cleanup;
> +                }

		--second--

>              }
>          }

        logically, the 2 'if (*best == NULL) {'
        can be combined and plcaced here.

>      }
>  
> -    return 0;
> +cleanup:
> +    pciConfigClose(check, fd);
> +    return ret;
>  }
>  
>  static int
> @@ -598,12 +626,14 @@ pciGetParentDevice(pciDevice *dev, pciDevice **parent)
>   */
[snip]
> @@ -669,7 +704,7 @@ out:
>   * above we require the device supports a full internal reset.
>   */
>  static int
> -pciTryPowerManagementReset(pciDevice *dev)
> +pciTryPowerManagementReset(pciDevice *dev, int cfgfd)
>  {
>      uint8_t config_space[PCI_CONF_LEN];
>      uint32_t ctl;
> @@ -678,7 +713,7 @@ pciTryPowerManagementReset(pciDevice *dev)
>          return -1;
>  
>      /* Save and restore the device's config space. */
> -    if (pciRead(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) {
> +    if (pciRead(dev, cfgfd, 0, &config_space[0], PCI_CONF_LEN) < 0) {
>          virReportError(VIR_ERR_INTERNAL_ERROR,
>                         _("Failed to read PCI config space for %s"),
>                         dev->name);
> @@ -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);

seems more than 80 characters

> +    pciWrite32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL,
> +               ctl | PCI_PM_CTRL_STATE_D3hot);
>  
>      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);
[snip]

-- 
regards!
li guang





More information about the libvir-list mailing list