Also allocate the ahci port struct itself from tmp memory for probing, then copy to fseg memory in case we detected some device. This way we don't waste fseg memory for unused ports.
Signed-off-by: Gerd Hoffmann kraxel@redhat.com --- src/ahci.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/ahci.c b/src/ahci.c index ecdd3cb..9b3ce2f 100644 --- a/src/ahci.c +++ b/src/ahci.c @@ -383,7 +383,7 @@ ahci_port_reset(struct ahci_ctrl_s *ctrl, u32 pnr) static struct ahci_port_s* ahci_port_alloc(struct ahci_ctrl_s *ctrl, u32 pnr) { - struct ahci_port_s *port = malloc_fseg(sizeof(*port)); + struct ahci_port_s *port = malloc_tmp(sizeof(*port));
if (!port) { warn_noalloc(); @@ -407,10 +407,16 @@ ahci_port_alloc(struct ahci_ctrl_s *ctrl, u32 pnr) return port; }
-static void ahci_port_realloc(struct ahci_port_s *port) +static struct ahci_port_s* ahci_port_realloc(struct ahci_port_s *port) { + struct ahci_port_s *tmp; u32 cmd;
+ tmp = malloc_fseg(sizeof(*port)); + *tmp = *port; + free(port); + port = tmp; + ahci_port_reset(port->ctrl, port->pnr);
free(port->list); @@ -426,6 +432,8 @@ static void ahci_port_realloc(struct ahci_port_s *port) cmd = ahci_port_readl(port->ctrl, port->pnr, PORT_CMD); cmd |= (PORT_CMD_FIS_RX|PORT_CMD_START); ahci_port_writel(port->ctrl, port->pnr, PORT_CMD, cmd); + + return port; }
static void ahci_port_release(struct ahci_port_s *port) @@ -570,7 +578,7 @@ ahci_port_detect(void *data) if (rc < 0) ahci_port_release(port); else { - ahci_port_realloc(port); + port = ahci_port_realloc(port); dprintf(1, "AHCI/%d: registering: "%s"\n", port->pnr, port->desc); if (!port->atapi) { // Register with bcv system.