s390x/pci: refactor s390_pci_find_dev_by_fh
authorYi Min Zhao <zyimin@linux.vnet.ibm.com>
Thu, 12 May 2016 06:27:25 +0000 (14:27 +0800)
committerCornelia Huck <cornelia.huck@de.ibm.com>
Mon, 11 Jul 2016 07:48:05 +0000 (09:48 +0200)
Because this function is called very frequently, we should use a more
effective way to find the zpci device. So we use the FH's index to get
the device directly.

Signed-off-by: Yi Min Zhao <zyimin@linux.vnet.ibm.com>
Reviewed-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
hw/s390x/s390-pci-bus.c

index 7111587a77132732b14be01a2fc97d3b2ad6c26b..1b8377241a0ea07dfa5623a3e4861b330ff1beb9 100644 (file)
@@ -198,19 +198,12 @@ S390PCIBusDevice *s390_pci_find_dev_by_idx(uint32_t idx)
 
 S390PCIBusDevice *s390_pci_find_dev_by_fh(uint32_t fh)
 {
-    S390PCIBusDevice *pbdev;
-    int i;
     S390pciState *s = s390_get_phb();
+    S390PCIBusDevice *pbdev;
 
-    if (!fh) {
-        return NULL;
-    }
-
-    for (i = 0; i < PCI_SLOT_MAX; i++) {
-        pbdev = &s->pbdev[i];
-        if (pbdev->fh == fh) {
-            return pbdev;
-        }
+    pbdev = &s->pbdev[fh & FH_MASK_INDEX];
+    if (pbdev->fh != 0 && pbdev->fh == fh) {
+        return pbdev;
     }
 
     return NULL;