Patchwork Re: [PATCH v2] pci-hotplug: make them aware of pci domain.

login
register
mail settings
Submitter Isaku Yamahata
Date May 31, 2010, 2:52 a.m.
Message ID <20100531025216.GG13840@valinux.co.jp>
Download mbox | patch
Permalink /patch/54065/
State New
Headers show

Comments

Isaku Yamahata - May 31, 2010, 2:52 a.m.
On Sun, May 30, 2010 at 06:48:03PM +0300, Michael S. Tsirkin wrote:
> On Fri, May 28, 2010 at 06:30:46PM +0900, Isaku Yamahata wrote:
> > add helper function which converts root bus to pci domain.
> > make them aware of pci domain.
> > 
> > Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> 
> Doesn't seem to apply to master.

Do you mean 
master == pci branch
of git://git.kernel.org/pub/scm/linux/kernel/git/mst/qemu.git

Here is the version rebased to 4cecb52f3370d9c1a4251eef7c9331253c9f9719
of the branch.
The previous one applies to the change set of 
aa6f63fff62faf2fe9ffba5a789675d49293614d in qemu.org main branch
which does include 6c6a58aee425338bf67ec8faffdcda56b0b82090,
but the pci branch doesn't include it.

From 389ec34a80d2630ff4ad3e491328c2e1fb53be6f Mon Sep 17 00:00:00 2001
Message-Id: <389ec34a80d2630ff4ad3e491328c2e1fb53be6f.1275273565.git.yamahata@valinux.co.jp>
In-Reply-To: <cover.1275273565.git.yamahata@valinux.co.jp>
References: <cover.1275273565.git.yamahata@valinux.co.jp>
From: Isaku Yamahata <yamahata@valinux.co.jp>
Date: Mon, 31 May 2010 11:32:52 +0900
Subject: [PATCH] pci-hotplug: make them aware of pci domain.

add helper function which converts root bus to pci domain.
make them aware of pci domain.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>

---
Changes: V1 -> V2
- removed pci_find_bus()
- renamed pci_find_bus_by_bus() to pci_find_bus()
- add abort()
---
 hw/pci-hotplug.c |    9 +++++----
 hw/pci.c         |   22 +++++++++++++++++++++-
 hw/pci.h         |    1 +
 3 files changed, 27 insertions(+), 5 deletions(-)

Patch

diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c
index cc45c50..9c7161b 100644
--- a/hw/pci-hotplug.c
+++ b/hw/pci-hotplug.c
@@ -125,7 +125,7 @@  void drive_hot_add(Monitor *mon, const QDict *qdict)
         if (pci_read_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) {
             goto err;
         }
-        dev = pci_find_device(pci_find_root_bus(0), pci_bus, slot, 0);
+        dev = pci_find_device(pci_find_root_bus(dom), pci_bus, slot, 0);
         if (!dev) {
             monitor_printf(mon, "no pci device with address %s\n", pci_addr);
             goto err;
@@ -283,8 +283,9 @@  int pci_device_hot_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
 
     if (dev) {
         *ret_data =
-        qobject_from_jsonf("{ 'domain': 0, 'bus': %d, 'slot': %d, "
-                           "'function': %d }", pci_bus_num(dev->bus),
+        qobject_from_jsonf("{ 'domain': %d, 'bus': %d, 'slot': %d, "
+                           "'function': %d }",
+                           pci_find_domain(dev->bus), pci_bus_num(dev->bus),
                            PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
     } else {
         monitor_printf(mon, "failed to add %s\n", opts);
@@ -305,7 +306,7 @@  int pci_device_hot_remove(Monitor *mon, const char *pci_addr)
         return -1;
     }
 
-    d = pci_find_device(pci_find_root_bus(0), bus, slot, 0);
+    d = pci_find_device(pci_find_root_bus(dom), bus, slot, 0);
     if (!d) {
         monitor_printf(mon, "slot %d empty\n", slot);
         return -1;
diff --git a/hw/pci.c b/hw/pci.c
index 3362842..f084cc0 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -200,6 +200,26 @@  PCIBus *pci_find_root_bus(int domain)
     return NULL;
 }
 
+int pci_find_domain(const PCIBus *bus)
+{
+    PCIDevice *d;
+    struct PCIHostBus *host;
+
+    /* obtain root bus */
+    while ((d = bus->parent_dev) != NULL) {
+        bus = d->bus;
+    }
+
+    QLIST_FOREACH(host, &host_buses, next) {
+        if (host->bus == bus) {
+            return host->domain;
+        }
+    }
+
+    abort();    /* should not be reached */
+    return -1;
+}
+
 void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
                          const char *name, int devfn_min)
 {
@@ -505,7 +525,7 @@  PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
     }
 
     *devfnp = slot << 3;
-    return pci_find_bus(pci_find_root_bus(0), bus);
+    return pci_find_bus(pci_find_root_bus(dom), bus);
 }
 
 static void pci_init_cmask(PCIDevice *dev)
diff --git a/hw/pci.h b/hw/pci.h
index b803593..3a15bd4 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -218,6 +218,7 @@  PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char *default_model,
 int pci_bus_num(PCIBus *s);
 void pci_for_each_device(PCIBus *bus, int bus_num, void (*fn)(PCIBus *bus, PCIDevice *d));
 PCIBus *pci_find_root_bus(int domain);
+int pci_find_domain(const PCIBus *bus);
 PCIBus *pci_find_bus(PCIBus *bus, int bus_num);
 PCIDevice *pci_find_device(PCIBus *bus, int bus_num, int slot, int function);
 PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr);