]> err.no Git - linux-2.6/commitdiff
ide: allocate ide_hwif_t instances dynamically
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Wed, 23 Jul 2008 17:55:58 +0000 (19:55 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Wed, 23 Jul 2008 17:55:58 +0000 (19:55 +0200)
* Allocate ide_hwif_t instances dynamically and remove ide_hwifs[].

  This cuts almost ~14kB from ide-probe.o (x86-32, MAX_HWIFS == 10):

   text    data     bss     dec     hex filename
   9140      40   14084   23264    5ae0 drivers/ide/ide-probe.o.before
   9169      40      44    9253    2425 drivers/ide/ide-probe.o.after

* Remove no longer needed ide_init_port_data() call from ide_unregister().

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-probe.c
drivers/ide/ide.c

index 482f41f3f15ebd0680752526809294460359b5fb..6d57b7cd54245651d616f90ec7ffc49643dea1b1 100644 (file)
@@ -39,8 +39,6 @@
 #include <asm/uaccess.h>
 #include <asm/io.h>
 
-static ide_hwif_t ide_hwifs[MAX_HWIFS]; /* master data repository */
-
 /**
  *     generic_id              -       add a generic drive id
  *     @drive: drive to make an ID block for
@@ -1583,15 +1581,18 @@ struct ide_host *ide_host_alloc_all(const struct ide_port_info *d,
                if (hws[i] == NULL)
                        continue;
 
+               hwif = kzalloc(sizeof(*hwif), GFP_KERNEL);
+               if (hwif == NULL)
+                       continue;
+
                idx = ide_find_port_slot(d);
                if (idx < 0) {
                        printk(KERN_ERR "%s: no free slot for interface\n",
                                        d ? d->name : "ide");
+                       kfree(hwif);
                        continue;
                }
 
-               hwif = &ide_hwifs[idx];
-
                ide_init_port_data(hwif, idx);
 
                host->ports[i] = hwif;
@@ -1755,6 +1756,7 @@ void ide_host_remove(struct ide_host *host)
 
                ide_unregister(hwif);
                ide_free_port_slot(hwif->index);
+               kfree(hwif);
        }
 
        kfree(host);
index 60c5db1c59e55b56f6de5dcf4c2c9ec27fa3f878..914942a766db15f39d185871220c87555d963de2 100644 (file)
@@ -233,11 +233,6 @@ void ide_unregister(ide_hwif_t *hwif)
        if (hwif->dma_base)
                ide_release_dma_engine(hwif);
 
-       spin_lock_irq(&ide_lock);
-       /* restore hwif data to pristine status */
-       ide_init_port_data(hwif, hwif->index);
-       spin_unlock_irq(&ide_lock);
-
        mutex_unlock(&ide_cfg_mtx);
 }