PCI: Change memory allocation for acpiphp slots
authorRolf Eike Beer <eike-hotplug@sf-tec.de>
Mon, 13 Nov 2006 23:12:45 +0000 (15:12 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 1 Dec 2006 22:36:59 +0000 (14:36 -0800)
Change memory allocation for acpiphp slots

Change the "struct slot" that acpiphp uses for managing it's slots to
directly contain the memory for the needed struct hotplug_slot_info and
the slot's name. This way we need only two memory allocations per slot
instead of four.

While we are at it: make_slot_name() is just a wrapper around snprintf()
knowing the right arguments to call it. Since the function makes just one
function call and is only called from one place I inlined it by hand.

Finally this fixes a possible bug waiting for someone to hit it. There were
two unused local variables in acpiphp_register_hotplug_slot(). gcc did not
find them because they were used in memory allocations with sizeof(*var).
They had the same types as the target of the allocation, but nevertheless
this was just weird.

Signed-off-by: Rolf Eike Beer <eike-hotplug@sf-tec.de>
Acked-by: Matthew Wilcox <matthew@wil.cx>
Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/pci/hotplug/acpiphp.h
drivers/pci/hotplug/acpiphp_core.c

index 59c5b24..ddbadd9 100644 (file)
@@ -62,10 +62,10 @@ struct acpiphp_slot;
 struct slot {
        struct hotplug_slot     *hotplug_slot;
        struct acpiphp_slot     *acpi_slot;
+       struct hotplug_slot_info info;
+       char name[SLOT_NAME_SIZE];
 };
 
-
-
 /**
  * struct acpiphp_bridge - PCI bridge information
  *
index c8b6907..40c79b0 100644 (file)
@@ -312,18 +312,6 @@ static int __init init_acpi(void)
        return retval;
 }
 
-
-/**
- * make_slot_name - make a slot name that appears in pcihpfs
- * @slot: slot to name
- *
- */
-static void make_slot_name(struct slot *slot)
-{
-       snprintf(slot->hotplug_slot->name, SLOT_NAME_SIZE, "%u",
-                slot->acpi_slot->sun);
-}
-
 /**
  * release_slot - free up the memory used by a slot
  * @hotplug_slot: slot to free
@@ -334,8 +322,6 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
 
        dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
 
-       kfree(slot->hotplug_slot->info);
-       kfree(slot->hotplug_slot->name);
        kfree(slot->hotplug_slot);
        kfree(slot);
 }
@@ -344,26 +330,19 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
 int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot)
 {
        struct slot *slot;
-       struct hotplug_slot *hotplug_slot;
-       struct hotplug_slot_info *hotplug_slot_info;
        int retval = -ENOMEM;
 
        slot = kzalloc(sizeof(*slot), GFP_KERNEL);
        if (!slot)
                goto error;
 
-       slot->hotplug_slot = kzalloc(sizeof(*hotplug_slot), GFP_KERNEL);
+       slot->hotplug_slot = kzalloc(sizeof(*slot->hotplug_slot), GFP_KERNEL);
        if (!slot->hotplug_slot)
                goto error_slot;
 
-       slot->hotplug_slot->info = kzalloc(sizeof(*hotplug_slot_info),
-                                          GFP_KERNEL);
-       if (!slot->hotplug_slot->info)
-               goto error_hpslot;
+       slot->hotplug_slot->info = &slot->info;
 
-       slot->hotplug_slot->name = kzalloc(SLOT_NAME_SIZE, GFP_KERNEL);
-       if (!slot->hotplug_slot->name)
-               goto error_info;
+       slot->hotplug_slot->name = slot->name;
 
        slot->hotplug_slot->private = slot;
        slot->hotplug_slot->release = &release_slot;
@@ -378,21 +357,17 @@ int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot)
        slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN;
 
        acpiphp_slot->slot = slot;
-       make_slot_name(slot);
+       snprintf(slot->name, sizeof(slot->name), "%u", slot->acpi_slot->sun);
 
        retval = pci_hp_register(slot->hotplug_slot);
        if (retval) {
                err("pci_hp_register failed with error %d\n", retval);
-               goto error_name;
+               goto error_hpslot;
        }
 
        info("Slot [%s] registered\n", slot->hotplug_slot->name);
 
        return 0;
-error_name:
-       kfree(slot->hotplug_slot->name);
-error_info:
-       kfree(slot->hotplug_slot->info);
 error_hpslot:
        kfree(slot->hotplug_slot);
 error_slot: