[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] hw/ide/ahci: Check for PCI device once in ahci_init()
From: |
Philippe Mathieu-Daudé |
Subject: |
[PATCH] hw/ide/ahci: Check for PCI device once in ahci_init() |
Date: |
Thu, 21 Nov 2024 11:01:52 +0100 |
object_dynamic_cast() is expensive; IRQ helpers are certainly
a bad place to call it. Since the device type won't change at
runtime, resolve it once when the AHCI context is initialized
in ahci_init().
Reported-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/hw/ide/ahci.h | 2 +-
hw/ide/ahci.c | 17 +++++------------
2 files changed, 6 insertions(+), 13 deletions(-)
diff --git a/include/hw/ide/ahci.h b/include/hw/ide/ahci.h
index ba31e75ff9..f6d977610d 100644
--- a/include/hw/ide/ahci.h
+++ b/include/hw/ide/ahci.h
@@ -37,7 +37,7 @@ typedef struct AHCIControlRegs {
} AHCIControlRegs;
typedef struct AHCIState {
- DeviceState *container;
+ PCIDevice *pci_dev;
AHCIDevice *dev;
AHCIControlRegs control_regs;
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 0eb24304ee..f2eb3b527b 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -181,14 +181,10 @@ static uint32_t ahci_port_read(AHCIState *s, int port,
int offset)
static void ahci_irq_raise(AHCIState *s)
{
- DeviceState *dev_state = s->container;
- PCIDevice *pci_dev = (PCIDevice *) object_dynamic_cast(OBJECT(dev_state),
- TYPE_PCI_DEVICE);
-
trace_ahci_irq_raise(s);
- if (pci_dev && msi_enabled(pci_dev)) {
- msi_notify(pci_dev, 0);
+ if (s->pci_dev && msi_enabled(s->pci_dev)) {
+ msi_notify(s->pci_dev, 0);
} else {
qemu_irq_raise(s->irq);
}
@@ -196,13 +192,9 @@ static void ahci_irq_raise(AHCIState *s)
static void ahci_irq_lower(AHCIState *s)
{
- DeviceState *dev_state = s->container;
- PCIDevice *pci_dev = (PCIDevice *) object_dynamic_cast(OBJECT(dev_state),
- TYPE_PCI_DEVICE);
-
trace_ahci_irq_lower(s);
- if (!pci_dev || !msi_enabled(pci_dev)) {
+ if (!s->pci_dev || !msi_enabled(s->pci_dev)) {
qemu_irq_lower(s->irq);
}
}
@@ -1608,7 +1600,8 @@ static const IDEDMAOps ahci_dma_ops = {
void ahci_init(AHCIState *s, DeviceState *qdev)
{
- s->container = qdev;
+ s->pci_dev = (PCIDevice *)object_dynamic_cast(OBJECT(qdev),
TYPE_PCI_DEVICE);
+
/* XXX BAR size should be 1k, but that breaks, so bump it to 4k for now */
memory_region_init_io(&s->mem, OBJECT(qdev), &ahci_mem_ops, s,
"ahci", AHCI_MEM_BAR_SIZE);
--
2.45.2
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] hw/ide/ahci: Check for PCI device once in ahci_init(),
Philippe Mathieu-Daudé <=