mirror of https://gitee.com/openkylin/qemu.git
s390x/pci: acceleration for getting S390pciState
There are a number of places where the code needs to get the instance of S390pciState. It calls object_resolve_path() every time. This wastes a lot of time and leads to low performance. Thus we add s390_get_phb() to improve it. Because we always have a phb, we remove all return checkings in the callers and add an assert in s390_get_phb() to make sure that phb is getted successfully. 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>
This commit is contained in:
parent
f7c40aa1e7
commit
e7d336959b
|
@ -29,6 +29,19 @@
|
|||
do { } while (0)
|
||||
#endif
|
||||
|
||||
static S390pciState *s390_get_phb(void)
|
||||
{
|
||||
static S390pciState *phb;
|
||||
|
||||
if (!phb) {
|
||||
phb = S390_PCI_HOST_BRIDGE(
|
||||
object_resolve_path(TYPE_S390_PCI_HOST_BRIDGE, NULL));
|
||||
assert(phb != NULL);
|
||||
}
|
||||
|
||||
return phb;
|
||||
}
|
||||
|
||||
int chsc_sei_nt2_get_event(void *res)
|
||||
{
|
||||
ChscSeiNt2Res *nt2_res = (ChscSeiNt2Res *)res;
|
||||
|
@ -36,12 +49,7 @@ int chsc_sei_nt2_get_event(void *res)
|
|||
PciCcdfErr *eccdf;
|
||||
int rc = 1;
|
||||
SeiContainer *sei_cont;
|
||||
S390pciState *s = S390_PCI_HOST_BRIDGE(
|
||||
object_resolve_path(TYPE_S390_PCI_HOST_BRIDGE, NULL));
|
||||
|
||||
if (!s) {
|
||||
return rc;
|
||||
}
|
||||
S390pciState *s = s390_get_phb();
|
||||
|
||||
sei_cont = QTAILQ_FIRST(&s->pending_sei);
|
||||
if (sei_cont) {
|
||||
|
@ -76,12 +84,7 @@ int chsc_sei_nt2_get_event(void *res)
|
|||
|
||||
int chsc_sei_nt2_have_event(void)
|
||||
{
|
||||
S390pciState *s = S390_PCI_HOST_BRIDGE(
|
||||
object_resolve_path(TYPE_S390_PCI_HOST_BRIDGE, NULL));
|
||||
|
||||
if (!s) {
|
||||
return 0;
|
||||
}
|
||||
S390pciState *s = s390_get_phb();
|
||||
|
||||
return !QTAILQ_EMPTY(&s->pending_sei);
|
||||
}
|
||||
|
@ -90,12 +93,7 @@ S390PCIBusDevice *s390_pci_find_dev_by_fid(uint32_t fid)
|
|||
{
|
||||
S390PCIBusDevice *pbdev;
|
||||
int i;
|
||||
S390pciState *s = S390_PCI_HOST_BRIDGE(
|
||||
object_resolve_path(TYPE_S390_PCI_HOST_BRIDGE, NULL));
|
||||
|
||||
if (!s) {
|
||||
return NULL;
|
||||
}
|
||||
S390pciState *s = s390_get_phb();
|
||||
|
||||
for (i = 0; i < PCI_SLOT_MAX; i++) {
|
||||
pbdev = &s->pbdev[i];
|
||||
|
@ -180,12 +178,7 @@ S390PCIBusDevice *s390_pci_find_dev_by_idx(uint32_t idx)
|
|||
S390PCIBusDevice *pbdev;
|
||||
int i;
|
||||
int j = 0;
|
||||
S390pciState *s = S390_PCI_HOST_BRIDGE(
|
||||
object_resolve_path(TYPE_S390_PCI_HOST_BRIDGE, NULL));
|
||||
|
||||
if (!s) {
|
||||
return NULL;
|
||||
}
|
||||
S390pciState *s = s390_get_phb();
|
||||
|
||||
for (i = 0; i < PCI_SLOT_MAX; i++) {
|
||||
pbdev = &s->pbdev[i];
|
||||
|
@ -207,10 +200,9 @@ S390PCIBusDevice *s390_pci_find_dev_by_fh(uint32_t fh)
|
|||
{
|
||||
S390PCIBusDevice *pbdev;
|
||||
int i;
|
||||
S390pciState *s = S390_PCI_HOST_BRIDGE(
|
||||
object_resolve_path(TYPE_S390_PCI_HOST_BRIDGE, NULL));
|
||||
S390pciState *s = s390_get_phb();
|
||||
|
||||
if (!s || !fh) {
|
||||
if (!fh) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -228,12 +220,7 @@ static void s390_pci_generate_event(uint8_t cc, uint16_t pec, uint32_t fh,
|
|||
uint32_t fid, uint64_t faddr, uint32_t e)
|
||||
{
|
||||
SeiContainer *sei_cont;
|
||||
S390pciState *s = S390_PCI_HOST_BRIDGE(
|
||||
object_resolve_path(TYPE_S390_PCI_HOST_BRIDGE, NULL));
|
||||
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
S390pciState *s = s390_get_phb();
|
||||
|
||||
sei_cont = g_malloc0(sizeof(SeiContainer));
|
||||
sei_cont->fh = fh;
|
||||
|
|
Loading…
Reference in New Issue