* [PATCH 0/7] acpiphp - slots management fix
@ 2006-01-20 10:08 MUNEDA Takahiro
2006-01-20 11:30 ` Pavel Machek
2006-01-27 4:14 ` Greg KH
0 siblings, 2 replies; 13+ messages in thread
From: MUNEDA Takahiro @ 2006-01-20 10:08 UTC (permalink / raw)
To: greg, pavel, kristen.c.accardi
Cc: pcihpd-discuss, linux-acpi, len.brown, muneda.takahiro
Hi,
This series of patches contains slots management fix.
Here are summary of changes:
o [PATCH 1/7] - removes unnecesary struct members
o [PATCH 2/7] - removes init_slots(), because acpiphp doesn't
register slots when driver is loaded.
o [PATCH 3/7] - changes register_slot() to register hotplug
slots when they are found
o [PATCH 4/7] - changes init_bridge_misc() to register hotplug
slots when they are found
o [PATCH 5/7] - removes cleanup_slots(), because acpiphp
doesn't unregister slots when driver is going
to be un-loaded.
o [PATCH 6/7] - changes cleanup_brige() to unregister hotplug
slots when acpiphp cleanup the bridge.
o [PATCH 7/7] - adds spin_lock/_unlock to protect slot_list
For more specifc information, please see the header of each patch.
These patches are against 2.6.16-rc1. I tested them on Tiger4.
Thanks,
MUNE
--
MUNEDA Takahiro <muneda.takahiro@jp.fujitsu.com>
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH 0/7] acpiphp - slots management fix 2006-01-20 10:08 [PATCH 0/7] acpiphp - slots management fix MUNEDA Takahiro @ 2006-01-20 11:30 ` Pavel Machek 2006-01-23 0:37 ` [Pcihpd-discuss] " MUNEDA Takahiro 2006-01-27 4:14 ` Greg KH 1 sibling, 1 reply; 13+ messages in thread From: Pavel Machek @ 2006-01-20 11:30 UTC (permalink / raw) To: MUNEDA Takahiro Cc: greg, kristen.c.accardi, pcihpd-discuss, linux-acpi, len.brown Hi! > This series of patches contains slots management fix. > Here are summary of changes: Quite a lot of development happened in -mm in this area... Won't this clash? Pavel -- Thanks, Sharp! ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Pcihpd-discuss] Re: [PATCH 0/7] acpiphp - slots management fix 2006-01-20 11:30 ` Pavel Machek @ 2006-01-23 0:37 ` MUNEDA Takahiro 0 siblings, 0 replies; 13+ messages in thread From: MUNEDA Takahiro @ 2006-01-23 0:37 UTC (permalink / raw) To: Pavel Machek Cc: MUNEDA Takahiro, greg, kristen.c.accardi, pcihpd-discuss, linux-acpi, len.brown Hi Pavel, At Fri, 20 Jan 2006 12:30:42 +0100, Pavel Machek <pavel@suse.cz> wrote: > > Quite a lot of development happened in -mm in this area... Won't this > clash? Thanks for your comments. I have tested these patches on pure 2.6.16-rc1. I haven't tested these patches applied with the Kristen's. I guess it might be conflict with. OK, new -mm was released, so I'll rebase the patch against for 2.6.16-rc1-mm2 and Kristen's patches in a few days Thanks, MUNE -- MUNEDA Takahiro <muneda.takahiro@jp.fujitsu.com> ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 0/7] acpiphp - slots management fix 2006-01-20 10:08 [PATCH 0/7] acpiphp - slots management fix MUNEDA Takahiro 2006-01-20 11:30 ` Pavel Machek @ 2006-01-27 4:14 ` Greg KH 2006-01-29 3:34 ` [Pcihpd-discuss] " MUNEDA Takahiro 1 sibling, 1 reply; 13+ messages in thread From: Greg KH @ 2006-01-27 4:14 UTC (permalink / raw) To: MUNEDA Takahiro Cc: pavel, kristen.c.accardi, pcihpd-discuss, linux-acpi, len.brown On Fri, Jan 20, 2006 at 07:08:30PM +0900, MUNEDA Takahiro wrote: > Hi, > > This series of patches contains slots management fix. > Here are summary of changes: > > o [PATCH 1/7] - removes unnecesary struct members > > o [PATCH 2/7] - removes init_slots(), because acpiphp doesn't > register slots when driver is loaded. > > o [PATCH 3/7] - changes register_slot() to register hotplug > slots when they are found > > o [PATCH 4/7] - changes init_bridge_misc() to register hotplug > slots when they are found > > o [PATCH 5/7] - removes cleanup_slots(), because acpiphp > doesn't unregister slots when driver is going > to be un-loaded. > > o [PATCH 6/7] - changes cleanup_brige() to unregister hotplug > slots when acpiphp cleanup the bridge. > > o [PATCH 7/7] - adds spin_lock/_unlock to protect slot_list > > > For more specifc information, please see the header of each patch. > These patches are against 2.6.16-rc1. I tested them on Tiger4. This patch series does not even compile when applied: CC [M] drivers/pci/hotplug/acpiphp_core.o drivers/pci/hotplug/acpiphp_core.c: In function `acpiphp_register_hotplug_slot': drivers/pci/hotplug/acpiphp_core.c:355: error: `hotplug_slot' undeclared (first use in this function) drivers/pci/hotplug/acpiphp_core.c:355: error: (Each undeclared identifier is reported only once drivers/pci/hotplug/acpiphp_core.c:355: error: for each function it appears in.) drivers/pci/hotplug/acpiphp_core.c:359: error: `hotplug_slot_info' undeclared (first use in this function) make[2]: *** [drivers/pci/hotplug/acpiphp_core.o] Error 1 Care to redo them? thanks, greg k-h ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Pcihpd-discuss] Re: [PATCH 0/7] acpiphp - slots management fix 2006-01-27 4:14 ` Greg KH @ 2006-01-29 3:34 ` MUNEDA Takahiro 2006-01-29 3:45 ` Greg KH 0 siblings, 1 reply; 13+ messages in thread From: MUNEDA Takahiro @ 2006-01-29 3:34 UTC (permalink / raw) To: Greg KH Cc: MUNEDA Takahiro, pavel, kristen.c.accardi, pcihpd-discuss, linux-acpi, len.brown Hi, At Thu, 26 Jan 2006 20:14:25 -0800, Greg KH <greg@kroah.com> wrote: > > On Fri, Jan 20, 2006 at 07:08:30PM +0900, MUNEDA Takahiro wrote: > > Hi, > > > > This series of patches contains slots management fix. > > Here are summary of changes: > > > > o [PATCH 1/7] - removes unnecesary struct members > > > > o [PATCH 2/7] - removes init_slots(), because acpiphp doesn't > > register slots when driver is loaded. > > > > o [PATCH 3/7] - changes register_slot() to register hotplug > > slots when they are found > > > > o [PATCH 4/7] - changes init_bridge_misc() to register hotplug > > slots when they are found > > > > o [PATCH 5/7] - removes cleanup_slots(), because acpiphp > > doesn't unregister slots when driver is going > > to be un-loaded. > > > > o [PATCH 6/7] - changes cleanup_brige() to unregister hotplug > > slots when acpiphp cleanup the bridge. > > > > o [PATCH 7/7] - adds spin_lock/_unlock to protect slot_list > > > > > > For more specifc information, please see the header of each patch. > > These patches are against 2.6.16-rc1. I tested them on Tiger4. > > This patch series does not even compile when applied: > > CC [M] drivers/pci/hotplug/acpiphp_core.o > drivers/pci/hotplug/acpiphp_core.c: In function `acpiphp_register_hotplug_slot': > drivers/pci/hotplug/acpiphp_core.c:355: error: `hotplug_slot' undeclared (first use in this function) > drivers/pci/hotplug/acpiphp_core.c:355: error: (Each undeclared identifier is reported only once > drivers/pci/hotplug/acpiphp_core.c:355: error: for each function it appears in.) > drivers/pci/hotplug/acpiphp_core.c:359: error: `hotplug_slot_info' undeclared (first use in this function) > make[2]: *** [drivers/pci/hotplug/acpiphp_core.o] Error 1 > > Care to redo them? I'm sorry for my late replying. And thanks for your taking care of my patch. At first, please let me introduce the base idea of this patch. I'm trying to support p2p bridge hotplug with acpiphp. Current acpiphp manages hotplug slot by ID. The ID is incremented when acpiphp founds hotpluggable slots. If the bridges(with hotpluggable slots) are hotplugged many times, the hotpluggable slots are added many times also. The ID might be overflowed. So this patch removes IDs to manage slots. And, this patch changes the slot register/unregister timing. Current acpiphp registers the slots in the init_slots() called from acpiphp_init(), and unregisters the slots in the cleanup_slots() called from acpiphp_exit(). acpiphp doesn't assume the increase and decrease of the hotpluggable slots. This patch removes the slot register/unregister processes from the init/exit phases. Instead, adds the these processes in the bridge add/cleanup phases. Currently, this change doesn't have any meanings. But these changes are needed to support p2p bridge(with hotplug slot) hotplug. Here is an updated patch. Old patches were not need to be separated, so I merge them into below patch. This patch is against 2.6.16-rc1-mm3. I tested them on Tiger4 and it works fine. Thanks, MUNE o This patch removes IDs to manage slots. o This patch removes the slot register/unregister processes from the init/exit phases. Instead, adds these processes in the bridge add/cleanup phases. Signed-off-by: MUNEDA Takahiro <muneda.takahiro@jp.fujitsu.com> drivers/pci/hotplug/acpiphp.h | 5 - drivers/pci/hotplug/acpiphp_core.c | 118 ++++++++++++++++++------------------- drivers/pci/hotplug/acpiphp_glue.c | 48 +++++++-------- 3 files changed, 85 insertions(+), 86 deletions(-) Index: linux-2.6.16-rc1-mm3/drivers/pci/hotplug/acpiphp.h =================================================================== --- linux-2.6.16-rc1-mm3.orig/drivers/pci/hotplug/acpiphp.h +++ linux-2.6.16-rc1-mm3/drivers/pci/hotplug/acpiphp.h @@ -60,7 +60,6 @@ struct acpiphp_slot; * struct slot - slot information for each *physical* slot */ struct slot { - u8 number; struct hotplug_slot *hotplug_slot; struct list_head slot_list; @@ -121,7 +120,6 @@ struct acpiphp_slot { objects (i.e. for each function) */ struct mutex crit_sect; - u32 id; /* slot id (serial #) for hotplug core */ u8 device; /* pci device# */ u32 sun; /* ACPI _SUN (slot unique number) */ @@ -206,12 +204,13 @@ struct acpiphp_attention_info /* acpiphp_core.c */ extern int acpiphp_register_attention(struct acpiphp_attention_info*info); extern int acpiphp_unregister_attention(struct acpiphp_attention_info *info); +extern int acpiphp_register_hotplug_slot(struct acpiphp_slot *slot); +extern void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *slot); /* acpiphp_glue.c */ extern int acpiphp_glue_init (void); extern void acpiphp_glue_exit (void); extern int acpiphp_get_num_slots (void); -extern struct acpiphp_slot *get_slot_from_id (int id); typedef int (*acpiphp_callback)(struct acpiphp_slot *slot, void *data); extern int acpiphp_enable_slot (struct acpiphp_slot *slot); Index: linux-2.6.16-rc1-mm3/drivers/pci/hotplug/acpiphp_core.c =================================================================== --- linux-2.6.16-rc1-mm3.orig/drivers/pci/hotplug/acpiphp_core.c +++ linux-2.6.16-rc1-mm3/drivers/pci/hotplug/acpiphp_core.c @@ -45,6 +45,7 @@ #include "acpiphp.h" static LIST_HEAD(slot_list); +static DEFINE_SPINLOCK(list_lock); #define MY_NAME "acpiphp" @@ -341,62 +342,56 @@ static void release_slot(struct hotplug_ kfree(slot); } -/** - * init_slots - initialize 'struct slot' structures for each slot - * - */ -static int __init init_slots(void) +/* callback routine to initialize 'struct slot' for each 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; - int i; - for (i = 0; i < num_slots; ++i) { - slot = kmalloc(sizeof(struct slot), GFP_KERNEL); - if (!slot) - goto error; - memset(slot, 0, sizeof(struct slot)); - - slot->hotplug_slot = kmalloc(sizeof(struct hotplug_slot), GFP_KERNEL); - if (!slot->hotplug_slot) - goto error_slot; - memset(slot->hotplug_slot, 0, sizeof(struct hotplug_slot)); - - slot->hotplug_slot->info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL); - if (!slot->hotplug_slot->info) - goto error_hpslot; - memset(slot->hotplug_slot->info, 0, sizeof(struct hotplug_slot_info)); - - slot->hotplug_slot->name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL); - if (!slot->hotplug_slot->name) - goto error_info; - - slot->number = i; - - slot->hotplug_slot->private = slot; - slot->hotplug_slot->release = &release_slot; - slot->hotplug_slot->ops = &acpi_hotplug_slot_ops; - - slot->acpi_slot = get_slot_from_id(i); - slot->hotplug_slot->info->power_status = acpiphp_get_power_status(slot->acpi_slot); - slot->hotplug_slot->info->attention_status = 0; - slot->hotplug_slot->info->latch_status = acpiphp_get_latch_status(slot->acpi_slot); - slot->hotplug_slot->info->adapter_status = acpiphp_get_adapter_status(slot->acpi_slot); - slot->hotplug_slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; - slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; - - make_slot_name(slot); - - retval = pci_hp_register(slot->hotplug_slot); - if (retval) { - err("pci_hp_register failed with error %d\n", retval); - goto error_name; - } - - /* add slot to our internal list */ - list_add(&slot->slot_list, &slot_list); - info("Slot [%s] registered\n", slot->hotplug_slot->name); - } + slot = kzalloc(sizeof(*slot), GFP_KERNEL); + if (!slot) + goto error; + + slot->hotplug_slot = kzalloc(sizeof(*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->name = kzalloc(SLOT_NAME_SIZE, GFP_KERNEL); + if (!slot->hotplug_slot->name) + goto error_info; + + slot->hotplug_slot->private = slot; + slot->hotplug_slot->release = &release_slot; + slot->hotplug_slot->ops = &acpi_hotplug_slot_ops; + + slot->acpi_slot = acpiphp_slot; + slot->hotplug_slot->info->power_status = acpiphp_get_power_status(slot->acpi_slot); + slot->hotplug_slot->info->attention_status = 0; + slot->hotplug_slot->info->latch_status = acpiphp_get_latch_status(slot->acpi_slot); + slot->hotplug_slot->info->adapter_status = acpiphp_get_adapter_status(slot->acpi_slot); + slot->hotplug_slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; + slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; + + make_slot_name(slot); + + retval = pci_hp_register(slot->hotplug_slot); + if (retval) { + err("pci_hp_register failed with error %d\n", retval); + goto error_name; + } + + /* add slot to our internal list */ + spin_lock(&list_lock); + list_add(&slot->slot_list, &slot_list); + spin_unlock(&list_lock); + info("Slot [%s] registered\n", slot->hotplug_slot->name); return 0; error_name: @@ -412,16 +407,26 @@ error: } -static void __exit cleanup_slots (void) +void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *acpiphp_slot) { struct list_head *tmp, *n; struct slot *slot; + int retval = 0; list_for_each_safe (tmp, n, &slot_list) { /* memory will be freed in release_slot callback */ slot = list_entry(tmp, struct slot, slot_list); + if (slot->acpi_slot->sun != acpiphp_slot->sun) + continue; + + spin_lock(&list_lock); list_del(&slot->slot_list); - pci_hp_deregister(slot->hotplug_slot); + spin_unlock(&list_lock); + info ("Slot [%s] unregistered\n", slot->hotplug_slot->name); + + retval = pci_hp_deregister(slot->hotplug_slot); + if (retval) + err("pci_hp_deregister failed with error %d\n", retval); } } @@ -436,16 +441,13 @@ static int __init acpiphp_init(void) /* read all the ACPI info from the system */ retval = init_acpi(); - if (retval) - return retval; - return init_slots(); + return retval; } static void __exit acpiphp_exit(void) { - cleanup_slots(); /* deallocate internal data structures etc. */ acpiphp_glue_exit(); } Index: linux-2.6.16-rc1-mm3/drivers/pci/hotplug/acpiphp_glue.c =================================================================== --- linux-2.6.16-rc1-mm3.orig/drivers/pci/hotplug/acpiphp_glue.c +++ linux-2.6.16-rc1-mm3/drivers/pci/hotplug/acpiphp_glue.c @@ -154,8 +154,7 @@ register_slot(acpi_handle handle, u32 lv acpi_handle tmp; acpi_status status = AE_OK; unsigned long adr, sun; - int device, function; - static int num_slots = 0; /* XXX if we support I/O node hotplug... */ + int device, function, retval; status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); @@ -210,7 +209,6 @@ register_slot(acpi_handle handle, u32 lv memset(slot, 0, sizeof(struct acpiphp_slot)); slot->bridge = bridge; - slot->id = num_slots++; slot->device = device; slot->sun = sun; INIT_LIST_HEAD(&slot->funcs); @@ -224,6 +222,11 @@ register_slot(acpi_handle handle, u32 lv dbg("found ACPI PCI Hotplug slot %d at PCI %04x:%02x:%02x\n", slot->sun, pci_domain_nr(bridge->pci_bus), bridge->pci_bus->number, slot->device); + retval = acpiphp_register_hotplug_slot(slot); + if (retval) { + warn("acpiphp_register_hotplug_slot failed(err code = 0x%x)\n", retval); + goto err_exit; + } } newfunc->slot = slot; @@ -254,6 +257,14 @@ register_slot(acpi_handle handle, u32 lv } return AE_OK; + + err_exit: + bridge->nr_slots--; + bridge->slots = slot->next; + kfree(slot); + kfree(newfunc); + + return AE_OK; } @@ -336,9 +347,16 @@ static void init_bridge_misc(struct acpi /* decode ACPI 2.0 _HPP (hot plug parameters) */ decode_hpp(bridge); + /* must be added to the list prior to calling register_slot */ + list_add(&bridge->list, &bridge_list); + /* register all slot objects under this bridge */ status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge->handle, (u32)1, register_slot, bridge, NULL); + if (ACPI_FAILURE(status)) { + list_del(&bridge->list); + return; + } /* install notify handler */ if (bridge->type != BRIDGE_TYPE_HOST) { @@ -351,8 +369,6 @@ static void init_bridge_misc(struct acpi err("failed to register interrupt notify handler\n"); } } - - list_add(&bridge->list, &bridge_list); } @@ -553,6 +569,8 @@ static void cleanup_bridge(struct acpiph list_del(list); kfree(func); } + acpiphp_unregister_hotplug_slot(slot); + list_del(&slot->funcs); kfree(slot); slot = next; } @@ -1570,26 +1588,6 @@ static int acpiphp_for_each_slot(acpiphp } #endif -/* search matching slot from id */ -struct acpiphp_slot *get_slot_from_id(int id) -{ - struct list_head *node; - struct acpiphp_bridge *bridge; - struct acpiphp_slot *slot; - - list_for_each (node, &bridge_list) { - bridge = (struct acpiphp_bridge *)node; - for (slot = bridge->slots; slot; slot = slot->next) - if (slot->id == id) - return slot; - } - - /* should never happen! */ - err("%s: no object for id %d\n", __FUNCTION__, id); - WARN_ON(1); - return NULL; -} - /** * acpiphp_enable_slot - power on slot ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Pcihpd-discuss] Re: [PATCH 0/7] acpiphp - slots management fix 2006-01-29 3:34 ` [Pcihpd-discuss] " MUNEDA Takahiro @ 2006-01-29 3:45 ` Greg KH 2006-01-31 18:20 ` Kristen Accardi 0 siblings, 1 reply; 13+ messages in thread From: Greg KH @ 2006-01-29 3:45 UTC (permalink / raw) To: MUNEDA Takahiro Cc: pavel, kristen.c.accardi, pcihpd-discuss, linux-acpi, len.brown On Sun, Jan 29, 2006 at 12:34:29PM +0900, MUNEDA Takahiro wrote: > Hi, > > At Thu, 26 Jan 2006 20:14:25 -0800, > Greg KH <greg@kroah.com> wrote: > > > > On Fri, Jan 20, 2006 at 07:08:30PM +0900, MUNEDA Takahiro wrote: > > > Hi, > > > > > > This series of patches contains slots management fix. > > > Here are summary of changes: > > > > > > o [PATCH 1/7] - removes unnecesary struct members > > > > > > o [PATCH 2/7] - removes init_slots(), because acpiphp doesn't > > > register slots when driver is loaded. > > > > > > o [PATCH 3/7] - changes register_slot() to register hotplug > > > slots when they are found > > > > > > o [PATCH 4/7] - changes init_bridge_misc() to register hotplug > > > slots when they are found > > > > > > o [PATCH 5/7] - removes cleanup_slots(), because acpiphp > > > doesn't unregister slots when driver is going > > > to be un-loaded. > > > > > > o [PATCH 6/7] - changes cleanup_brige() to unregister hotplug > > > slots when acpiphp cleanup the bridge. > > > > > > o [PATCH 7/7] - adds spin_lock/_unlock to protect slot_list > > > > > > > > > For more specifc information, please see the header of each patch. > > > These patches are against 2.6.16-rc1. I tested them on Tiger4. > > > > This patch series does not even compile when applied: > > > > CC [M] drivers/pci/hotplug/acpiphp_core.o > > drivers/pci/hotplug/acpiphp_core.c: In function `acpiphp_register_hotplug_slot': > > drivers/pci/hotplug/acpiphp_core.c:355: error: `hotplug_slot' undeclared (first use in this function) > > drivers/pci/hotplug/acpiphp_core.c:355: error: (Each undeclared identifier is reported only once > > drivers/pci/hotplug/acpiphp_core.c:355: error: for each function it appears in.) > > drivers/pci/hotplug/acpiphp_core.c:359: error: `hotplug_slot_info' undeclared (first use in this function) > > make[2]: *** [drivers/pci/hotplug/acpiphp_core.o] Error 1 > > > > Care to redo them? > > > I'm sorry for my late replying. > And thanks for your taking care of my patch. > > At first, please let me introduce the base idea of this patch. > I'm trying to support p2p bridge hotplug with acpiphp. > > Current acpiphp manages hotplug slot by ID. The ID is incremented > when acpiphp founds hotpluggable slots. > If the bridges(with hotpluggable slots) are hotplugged many times, > the hotpluggable slots are added many times also. The ID might be > overflowed. So this patch removes IDs to manage slots. > > And, this patch changes the slot register/unregister timing. > Current acpiphp registers the slots in the init_slots() > called from acpiphp_init(), and unregisters the slots in the > cleanup_slots() called from acpiphp_exit(). > acpiphp doesn't assume the increase and decrease of the > hotpluggable slots. > This patch removes the slot register/unregister processes from the > init/exit phases. Instead, adds the these processes in the bridge > add/cleanup phases. > > Currently, this change doesn't have any meanings. But these changes > are needed to support p2p bridge(with hotplug slot) hotplug. > > Here is an updated patch. Old patches were not need to be separated, > so I merge them into below patch. > > This patch is against 2.6.16-rc1-mm3. I tested them on Tiger4 and > it works fine. Ok, Kristen, have any objections to this patch? I know it's in much the same area that you are working in. thanks, greg k-h ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Pcihpd-discuss] Re: [PATCH 0/7] acpiphp - slots management fix 2006-01-29 3:45 ` Greg KH @ 2006-01-31 18:20 ` Kristen Accardi 2006-02-07 20:13 ` Greg KH 0 siblings, 1 reply; 13+ messages in thread From: Kristen Accardi @ 2006-01-31 18:20 UTC (permalink / raw) To: Greg KH; +Cc: MUNEDA Takahiro, pavel, pcihpd-discuss, linux-acpi, len.brown On Sat, 2006-01-28 at 19:45 -0800, Greg KH wrote: > On Sun, Jan 29, 2006 at 12:34:29PM +0900, MUNEDA Takahiro wrote: > > Hi, > > > > At Thu, 26 Jan 2006 20:14:25 -0800, > > Greg KH <greg@kroah.com> wrote: > > > > > > On Fri, Jan 20, 2006 at 07:08:30PM +0900, MUNEDA Takahiro wrote: > > > > Hi, > > > > > > > > This series of patches contains slots management fix. > > > > Here are summary of changes: > > > > > > > > o [PATCH 1/7] - removes unnecesary struct members > > > > > > > > o [PATCH 2/7] - removes init_slots(), because acpiphp doesn't > > > > register slots when driver is loaded. > > > > > > > > o [PATCH 3/7] - changes register_slot() to register hotplug > > > > slots when they are found > > > > > > > > o [PATCH 4/7] - changes init_bridge_misc() to register hotplug > > > > slots when they are found > > > > > > > > o [PATCH 5/7] - removes cleanup_slots(), because acpiphp > > > > doesn't unregister slots when driver is going > > > > to be un-loaded. > > > > > > > > o [PATCH 6/7] - changes cleanup_brige() to unregister hotplug > > > > slots when acpiphp cleanup the bridge. > > > > > > > > o [PATCH 7/7] - adds spin_lock/_unlock to protect slot_list > > > > > > > > > > > > For more specifc information, please see the header of each patch. > > > > These patches are against 2.6.16-rc1. I tested them on Tiger4. > > > > > > This patch series does not even compile when applied: > > > > > > CC [M] drivers/pci/hotplug/acpiphp_core.o > > > drivers/pci/hotplug/acpiphp_core.c: In function `acpiphp_register_hotplug_slot': > > > drivers/pci/hotplug/acpiphp_core.c:355: error: `hotplug_slot' undeclared (first use in this function) > > > drivers/pci/hotplug/acpiphp_core.c:355: error: (Each undeclared identifier is reported only once > > > drivers/pci/hotplug/acpiphp_core.c:355: error: for each function it appears in.) > > > drivers/pci/hotplug/acpiphp_core.c:359: error: `hotplug_slot_info' undeclared (first use in this function) > > > make[2]: *** [drivers/pci/hotplug/acpiphp_core.o] Error 1 > > > > > > Care to redo them? > > > > > > I'm sorry for my late replying. > > And thanks for your taking care of my patch. > > > > At first, please let me introduce the base idea of this patch. > > I'm trying to support p2p bridge hotplug with acpiphp. > > > > Current acpiphp manages hotplug slot by ID. The ID is incremented > > when acpiphp founds hotpluggable slots. > > If the bridges(with hotpluggable slots) are hotplugged many times, > > the hotpluggable slots are added many times also. The ID might be > > overflowed. So this patch removes IDs to manage slots. > > > > And, this patch changes the slot register/unregister timing. > > Current acpiphp registers the slots in the init_slots() > > called from acpiphp_init(), and unregisters the slots in the > > cleanup_slots() called from acpiphp_exit(). > > acpiphp doesn't assume the increase and decrease of the > > hotpluggable slots. > > This patch removes the slot register/unregister processes from the > > init/exit phases. Instead, adds the these processes in the bridge > > add/cleanup phases. > > > > Currently, this change doesn't have any meanings. But these changes > > are needed to support p2p bridge(with hotplug slot) hotplug. > > > > Here is an updated patch. Old patches were not need to be separated, > > so I merge them into below patch. > > > > This patch is against 2.6.16-rc1-mm3. I tested them on Tiger4 and > > it works fine. > > Ok, Kristen, have any objections to this patch? I know it's in much the > same area that you are working in. > > thanks, > > greg k-h > - Just reviewing them, they seem like they will be fine to me. Thanks, Kristen ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Pcihpd-discuss] Re: [PATCH 0/7] acpiphp - slots management fix 2006-01-31 18:20 ` Kristen Accardi @ 2006-02-07 20:13 ` Greg KH 2006-02-10 19:28 ` Kristen Accardi 0 siblings, 1 reply; 13+ messages in thread From: Greg KH @ 2006-02-07 20:13 UTC (permalink / raw) To: Kristen Accardi Cc: MUNEDA Takahiro, pavel, pcihpd-discuss, linux-acpi, len.brown On Tue, Jan 31, 2006 at 10:20:18AM -0800, Kristen Accardi wrote: > Just reviewing them, they seem like they will be fine to me. This conflicts with your other patch you sent me. I'll keep yours, and drop this one, and let you merge his in with yours. Is that ok? thanks, greg k-h ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Pcihpd-discuss] Re: [PATCH 0/7] acpiphp - slots management fix 2006-02-07 20:13 ` Greg KH @ 2006-02-10 19:28 ` Kristen Accardi 2006-02-13 2:27 ` MUNEDA Takahiro 0 siblings, 1 reply; 13+ messages in thread From: Kristen Accardi @ 2006-02-10 19:28 UTC (permalink / raw) To: Greg KH; +Cc: MUNEDA Takahiro, pavel, pcihpd-discuss, linux-acpi, len.brown On Tue, 2006-02-07 at 12:13 -0800, Greg KH wrote: > On Tue, Jan 31, 2006 at 10:20:18AM -0800, Kristen Accardi wrote: > > Just reviewing them, they seem like they will be fine to me. > > This conflicts with your other patch you sent me. I'll keep yours, and > drop this one, and let you merge his in with yours. > > Is that ok? > > thanks, > > greg k-h I tried to merge this in against 2.6.16-rc2-mm1, which contains the patch you kept, and there are compile issues in his patch still. I think it would be best if Muneda merged these himself. Kristen ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Pcihpd-discuss] Re: [PATCH 0/7] acpiphp - slots management fix 2006-02-10 19:28 ` Kristen Accardi @ 2006-02-13 2:27 ` MUNEDA Takahiro 2006-02-14 7:13 ` [PATCH] acpiphp - slot management fix - V2 MUNEDA Takahiro 0 siblings, 1 reply; 13+ messages in thread From: MUNEDA Takahiro @ 2006-02-13 2:27 UTC (permalink / raw) To: Kristen Accardi Cc: Greg KH, MUNEDA Takahiro, pavel, pcihpd-discuss, linux-acpi, len.brown Hi Kristen, At Fri, 10 Feb 2006 11:28:24 -0800, Kristen Accardi <kristen.c.accardi@intel.com> wrote: > > On Tue, 2006-02-07 at 12:13 -0800, Greg KH wrote: > > On Tue, Jan 31, 2006 at 10:20:18AM -0800, Kristen Accardi wrote: > > > Just reviewing them, they seem like they will be fine to me. > > > > This conflicts with your other patch you sent me. I'll keep yours, and > > drop this one, and let you merge his in with yours. > > > > Is that ok? > > > > thanks, > > > > greg k-h > > I tried to merge this in against 2.6.16-rc2-mm1, which contains the > patch you kept, and there are compile issues in his patch still. I > think it would be best if Muneda merged these himself. OK, I understood. However, I can not insmod acpiphp on 2.6.12-rc2-mm1 because of the dock related error(I reported to list a little while ago), I'll merge it after the error is fixed. Unfortunately, I don't have any laptop with _DCK method. So I can't fix/test the patch. Thanks, MUNE ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] acpiphp - slot management fix - V2 2006-02-13 2:27 ` MUNEDA Takahiro @ 2006-02-14 7:13 ` MUNEDA Takahiro 2006-02-14 9:17 ` [Pcihpd-discuss] " Kenji Kaneshige 0 siblings, 1 reply; 13+ messages in thread From: MUNEDA Takahiro @ 2006-02-14 7:13 UTC (permalink / raw) To: Kristen Accardi Cc: MUNEDA Takahiro, Greg KH, pavel, pcihpd-discuss, linux-acpi, len.brown Hi, At Mon, 13 Feb 2006 11:27:28 +0900, MUNEDA Takahiro <muneda.takahiro@jp.fujitsu.com> wrote: > > > I tried to merge this in against 2.6.16-rc2-mm1, which contains the > > patch you kept, and there are compile issues in his patch still. I > > think it would be best if Muneda merged these himself. > > OK, I understood. > However, I can not insmod acpiphp on 2.6.12-rc2-mm1 because > of the dock related error(I reported to list a little while > ago), I'll merge it after the error is fixed. Kenji fixed the _DCK method problem, so I rebased my patch against 2.6.16-rc2-mm1 + kenji's patch. I tested them on Tiger4 and it works fine. Thanks, MUNE o This patch removes IDs to manage slots. o This patch removes the slot register/unregister processes from the init/exit phases. Instead, adds these processes in the bridge add/cleanup phases. o Currently, this change doesn't have any meanings. But these changes are needed to support p2p bridge(with hotplug slot) Signed-off-by: MUNEDA Takahiro <muneda.takahiro@jp.fujitsu.com> drivers/pci/hotplug/acpiphp.h | 5 - drivers/pci/hotplug/acpiphp_core.c | 118 ++++++++++++++++++------------------- drivers/pci/hotplug/acpiphp_glue.c | 48 +++++++-------- 3 files changed, 85 insertions(+), 86 deletions(-) Index: linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp.h =================================================================== --- linux-2.6.16-rc2-mm1.orig/drivers/pci/hotplug/acpiphp.h +++ linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp.h @@ -60,7 +60,6 @@ struct acpiphp_slot; * struct slot - slot information for each *physical* slot */ struct slot { - u8 number; struct hotplug_slot *hotplug_slot; struct list_head slot_list; @@ -121,7 +120,6 @@ struct acpiphp_slot { objects (i.e. for each function) */ struct mutex crit_sect; - u32 id; /* slot id (serial #) for hotplug core */ u8 device; /* pci device# */ u32 sun; /* ACPI _SUN (slot unique number) */ @@ -229,12 +227,13 @@ struct acpiphp_dock_station { /* acpiphp_core.c */ extern int acpiphp_register_attention(struct acpiphp_attention_info*info); extern int acpiphp_unregister_attention(struct acpiphp_attention_info *info); +extern int acpiphp_register_hotplug_slot(struct acpiphp_slot *slot); +extern void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *slot); /* acpiphp_glue.c */ extern int acpiphp_glue_init (void); extern void acpiphp_glue_exit (void); extern int acpiphp_get_num_slots (void); -extern struct acpiphp_slot *get_slot_from_id (int id); typedef int (*acpiphp_callback)(struct acpiphp_slot *slot, void *data); void handle_hotplug_event_func(acpi_handle, u32, void*); Index: linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp_core.c =================================================================== --- linux-2.6.16-rc2-mm1.orig/drivers/pci/hotplug/acpiphp_core.c +++ linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp_core.c @@ -45,6 +45,7 @@ #include "acpiphp.h" static LIST_HEAD(slot_list); +static DEFINE_SPINLOCK(list_lock); #define MY_NAME "acpiphp" @@ -341,62 +342,56 @@ static void release_slot(struct hotplug_ kfree(slot); } -/** - * init_slots - initialize 'struct slot' structures for each slot - * - */ -static int __init init_slots(void) +/* callback routine to initialize 'struct slot' for each 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; - int i; - for (i = 0; i < num_slots; ++i) { - slot = kmalloc(sizeof(struct slot), GFP_KERNEL); - if (!slot) - goto error; - memset(slot, 0, sizeof(struct slot)); - - slot->hotplug_slot = kmalloc(sizeof(struct hotplug_slot), GFP_KERNEL); - if (!slot->hotplug_slot) - goto error_slot; - memset(slot->hotplug_slot, 0, sizeof(struct hotplug_slot)); - - slot->hotplug_slot->info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL); - if (!slot->hotplug_slot->info) - goto error_hpslot; - memset(slot->hotplug_slot->info, 0, sizeof(struct hotplug_slot_info)); - - slot->hotplug_slot->name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL); - if (!slot->hotplug_slot->name) - goto error_info; - - slot->number = i; - - slot->hotplug_slot->private = slot; - slot->hotplug_slot->release = &release_slot; - slot->hotplug_slot->ops = &acpi_hotplug_slot_ops; - - slot->acpi_slot = get_slot_from_id(i); - slot->hotplug_slot->info->power_status = acpiphp_get_power_status(slot->acpi_slot); - slot->hotplug_slot->info->attention_status = 0; - slot->hotplug_slot->info->latch_status = acpiphp_get_latch_status(slot->acpi_slot); - slot->hotplug_slot->info->adapter_status = acpiphp_get_adapter_status(slot->acpi_slot); - slot->hotplug_slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; - slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; - - make_slot_name(slot); - - retval = pci_hp_register(slot->hotplug_slot); - if (retval) { - err("pci_hp_register failed with error %d\n", retval); - goto error_name; - } - - /* add slot to our internal list */ - list_add(&slot->slot_list, &slot_list); - info("Slot [%s] registered\n", slot->hotplug_slot->name); - } + slot = kzalloc(sizeof(*slot), GFP_KERNEL); + if (!slot) + goto error; + + slot->hotplug_slot = kzalloc(sizeof(*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->name = kzalloc(SLOT_NAME_SIZE, GFP_KERNEL); + if (!slot->hotplug_slot->name) + goto error_info; + + slot->hotplug_slot->private = slot; + slot->hotplug_slot->release = &release_slot; + slot->hotplug_slot->ops = &acpi_hotplug_slot_ops; + + slot->acpi_slot = acpiphp_slot; + slot->hotplug_slot->info->power_status = acpiphp_get_power_status(slot->acpi_slot); + slot->hotplug_slot->info->attention_status = 0; + slot->hotplug_slot->info->latch_status = acpiphp_get_latch_status(slot->acpi_slot); + slot->hotplug_slot->info->adapter_status = acpiphp_get_adapter_status(slot->acpi_slot); + slot->hotplug_slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; + slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; + + make_slot_name(slot); + + retval = pci_hp_register(slot->hotplug_slot); + if (retval) { + err("pci_hp_register failed with error %d\n", retval); + goto error_name; + } + + /* add slot to our internal list */ + spin_lock(&list_lock); + list_add(&slot->slot_list, &slot_list); + spin_unlock(&list_lock); + info("Slot [%s] registered\n", slot->hotplug_slot->name); return 0; error_name: @@ -412,16 +407,26 @@ error: } -static void __exit cleanup_slots (void) +void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *acpiphp_slot) { struct list_head *tmp, *n; struct slot *slot; + int retval = 0; list_for_each_safe (tmp, n, &slot_list) { /* memory will be freed in release_slot callback */ slot = list_entry(tmp, struct slot, slot_list); + if (slot->acpi_slot->sun != acpiphp_slot->sun) + continue; + + spin_lock(&list_lock); list_del(&slot->slot_list); - pci_hp_deregister(slot->hotplug_slot); + spin_unlock(&list_lock); + info ("Slot [%s] unregistered\n", slot->hotplug_slot->name); + + retval = pci_hp_deregister(slot->hotplug_slot); + if (retval) + err("pci_hp_deregister failed with error %d\n", retval); } } @@ -439,16 +444,13 @@ static int __init acpiphp_init(void) /* read all the ACPI info from the system */ retval = init_acpi(); - if (retval && !(docking_station)) - return retval; - return init_slots(); + return retval; } static void __exit acpiphp_exit(void) { - cleanup_slots(); /* deallocate internal data structures etc. */ acpiphp_glue_exit(); Index: linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp_glue.c =================================================================== --- linux-2.6.16-rc2-mm1.orig/drivers/pci/hotplug/acpiphp_glue.c +++ linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp_glue.c @@ -128,8 +128,7 @@ register_slot(acpi_handle handle, u32 lv acpi_handle tmp; acpi_status status = AE_OK; unsigned long adr, sun; - int device, function; - static int num_slots = 0; /* XXX if we support I/O node hotplug... */ + int device, function, retval; status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); @@ -198,7 +197,6 @@ register_slot(acpi_handle handle, u32 lv memset(slot, 0, sizeof(struct acpiphp_slot)); slot->bridge = bridge; - slot->id = num_slots++; slot->device = device; slot->sun = sun; INIT_LIST_HEAD(&slot->funcs); @@ -212,6 +210,11 @@ register_slot(acpi_handle handle, u32 lv dbg("found ACPI PCI Hotplug slot %d at PCI %04x:%02x:%02x\n", slot->sun, pci_domain_nr(bridge->pci_bus), bridge->pci_bus->number, slot->device); + retval = acpiphp_register_hotplug_slot(slot); + if (retval) { + warn("acpiphp_register_hotplug_slot failed(err code = 0x%x)\n", retval); + goto err_exit; + } } newfunc->slot = slot; @@ -246,6 +249,14 @@ register_slot(acpi_handle handle, u32 lv } return status; + + err_exit: + bridge->nr_slots--; + bridge->slots = slot->next; + kfree(slot); + kfree(newfunc); + + return AE_OK; } @@ -328,9 +339,16 @@ static void init_bridge_misc(struct acpi /* decode ACPI 2.0 _HPP (hot plug parameters) */ decode_hpp(bridge); + /* must be added to the list prior to calling register_slot */ + list_add(&bridge->list, &bridge_list); + /* register all slot objects under this bridge */ status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge->handle, (u32)1, register_slot, bridge, NULL); + if (ACPI_FAILURE(status)) { + list_del(&bridge->list); + return; + } /* install notify handler */ if (bridge->type != BRIDGE_TYPE_HOST) { @@ -343,8 +361,6 @@ static void init_bridge_misc(struct acpi err("failed to register interrupt notify handler\n"); } } - - list_add(&bridge->list, &bridge_list); } @@ -548,6 +564,8 @@ static void cleanup_bridge(struct acpiph list_del(list); kfree(func); } + acpiphp_unregister_hotplug_slot(slot); + list_del(&slot->funcs); kfree(slot); slot = next; } @@ -1400,26 +1418,6 @@ static int acpiphp_for_each_slot(acpiphp } #endif -/* search matching slot from id */ -struct acpiphp_slot *get_slot_from_id(int id) -{ - struct list_head *node; - struct acpiphp_bridge *bridge; - struct acpiphp_slot *slot; - - list_for_each (node, &bridge_list) { - bridge = (struct acpiphp_bridge *)node; - for (slot = bridge->slots; slot; slot = slot->next) - if (slot->id == id) - return slot; - } - - /* should never happen! */ - err("%s: no object for id %d\n", __FUNCTION__, id); - WARN_ON(1); - return NULL; -} - /** * acpiphp_enable_slot - power on slot ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Pcihpd-discuss] [PATCH] acpiphp - slot management fix - V2 2006-02-14 7:13 ` [PATCH] acpiphp - slot management fix - V2 MUNEDA Takahiro @ 2006-02-14 9:17 ` Kenji Kaneshige 2006-02-15 9:26 ` [PATCH] acpiphp - slot management fix - V3 MUNEDA Takahiro 0 siblings, 1 reply; 13+ messages in thread From: Kenji Kaneshige @ 2006-02-14 9:17 UTC (permalink / raw) To: MUNEDA Takahiro Cc: Kristen Accardi, Greg KH, pavel, pcihpd-discuss, linux-acpi, len.brown MUNEDA Takahiro wrote: > -static void __exit cleanup_slots (void) > +void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *acpiphp_slot) > { > struct list_head *tmp, *n; > struct slot *slot; > + int retval = 0; > > list_for_each_safe (tmp, n, &slot_list) { > /* memory will be freed in release_slot callback */ > slot = list_entry(tmp, struct slot, slot_list); > + if (slot->acpi_slot->sun != acpiphp_slot->sun) > + continue; > + > + spin_lock(&list_lock); > list_del(&slot->slot_list); > - pci_hp_deregister(slot->hotplug_slot); > + spin_unlock(&list_lock); > + info ("Slot [%s] unregistered\n", slot->hotplug_slot->name); > + > + retval = pci_hp_deregister(slot->hotplug_slot); > + if (retval) > + err("pci_hp_deregister failed with error %d\n", retval); > } > } With your patch, I think this list_for_each_safe() loop becomes needless and it should be removed. In addition, slot_list is no longer needed. Here is a sample patch against your patch. Note that I have not tested it very much. Thanks, Kenji Kaneshige drivers/pci/hotplug/acpiphp.h | 3 +-- drivers/pci/hotplug/acpiphp_core.c | 32 ++++++++------------------------ 2 files changed, 9 insertions(+), 26 deletions(-) Index: linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp.h =================================================================== --- linux-2.6.16-rc2-mm1.orig/drivers/pci/hotplug/acpiphp.h 2006-02-14 17:05:47.000000000 +0900 +++ linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp.h 2006-02-14 18:02:38.000000000 +0900 @@ -61,8 +61,6 @@ */ struct slot { struct hotplug_slot *hotplug_slot; - struct list_head slot_list; - struct acpiphp_slot *acpi_slot; }; @@ -118,6 +116,7 @@ struct acpiphp_bridge *bridge; /* parent */ struct list_head funcs; /* one slot may have different objects (i.e. for each function) */ + struct slot *slot; struct mutex crit_sect; u8 device; /* pci device# */ Index: linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp_core.c =================================================================== --- linux-2.6.16-rc2-mm1.orig/drivers/pci/hotplug/acpiphp_core.c 2006-02-14 17:05:47.000000000 +0900 +++ linux-2.6.16-rc2-mm1/drivers/pci/hotplug/acpiphp_core.c 2006-02-14 18:02:50.000000000 +0900 @@ -44,9 +44,6 @@ #include "pci_hotplug.h" #include "acpiphp.h" -static LIST_HEAD(slot_list); -static DEFINE_SPINLOCK(list_lock); - #define MY_NAME "acpiphp" static int debug; @@ -379,6 +376,8 @@ slot->hotplug_slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; + acpiphp_slot->slot = slot; + make_slot_name(slot); retval = pci_hp_register(slot->hotplug_slot); @@ -387,10 +386,6 @@ goto error_name; } - /* add slot to our internal list */ - spin_lock(&list_lock); - list_add(&slot->slot_list, &slot_list); - spin_unlock(&list_lock); info("Slot [%s] registered\n", slot->hotplug_slot->name); return 0; @@ -409,25 +404,14 @@ void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *acpiphp_slot) { - struct list_head *tmp, *n; - struct slot *slot; + struct slot *slot = acpiphp_slot->slot; int retval = 0; - list_for_each_safe (tmp, n, &slot_list) { - /* memory will be freed in release_slot callback */ - slot = list_entry(tmp, struct slot, slot_list); - if (slot->acpi_slot->sun != acpiphp_slot->sun) - continue; - - spin_lock(&list_lock); - list_del(&slot->slot_list); - spin_unlock(&list_lock); - info ("Slot [%s] unregistered\n", slot->hotplug_slot->name); - - retval = pci_hp_deregister(slot->hotplug_slot); - if (retval) - err("pci_hp_deregister failed with error %d\n", retval); - } + info ("Slot [%s] unregistered\n", slot->hotplug_slot->name); + + retval = pci_hp_deregister(slot->hotplug_slot); + if (retval) + err("pci_hp_deregister failed with error %d\n", retval); } ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] acpiphp - slot management fix - V3 2006-02-14 9:17 ` [Pcihpd-discuss] " Kenji Kaneshige @ 2006-02-15 9:26 ` MUNEDA Takahiro 0 siblings, 0 replies; 13+ messages in thread From: MUNEDA Takahiro @ 2006-02-15 9:26 UTC (permalink / raw) To: Greg KH, Kristen Accardi, Kenji Kaneshige Cc: len.brown, muneda.takahiro, pcihpd-discuss, linux-acpi Hi, At Tue, 14 Feb 2006 18:17:20 +0900, Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> wrote: > > With your patch, I think this list_for_each_safe() loop becomes > needless and it should be removed. In addition, slot_list is no > longer needed. > > Here is a sample patch against your patch. Note that I have not > tested it very much. Thank you for your comments. Your proposal looks good to me. So I've merged your patch. This patch is against for 2.6.16-rc3-mm1. I tested it on my Tiger4 and it works well. Thanks, MUNE o This patch removes IDs (for slots management). o This patch removes the slot register/unregister processes from the init/exit phases. Instead, adds these processes in the bridge add/cleanup phases. o Currently, this change doesn't have any meanings. But these changes are needed to support p2p bridge(with hotplug slot) Signed-off-by: MUNEDA Takahiro <muneda.takahiro@jp.fujitsu.com> drivers/pci/hotplug/acpiphp.h | 8 -- drivers/pci/hotplug/acpiphp_core.c | 119 ++++++++++++++++--------------------- drivers/pci/hotplug/acpiphp_glue.c | 48 +++++++------- 3 files changed, 78 insertions(+), 97 deletions(-) Index: linux-2.6.16-rc3-mm1/drivers/pci/hotplug/acpiphp.h =================================================================== --- linux-2.6.16-rc3-mm1.orig/drivers/pci/hotplug/acpiphp.h +++ linux-2.6.16-rc3-mm1/drivers/pci/hotplug/acpiphp.h @@ -60,10 +60,7 @@ struct acpiphp_slot; * struct slot - slot information for each *physical* slot */ struct slot { - u8 number; struct hotplug_slot *hotplug_slot; - struct list_head slot_list; - struct acpiphp_slot *acpi_slot; }; @@ -119,9 +116,9 @@ struct acpiphp_slot { struct acpiphp_bridge *bridge; /* parent */ struct list_head funcs; /* one slot may have different objects (i.e. for each function) */ + struct slot *slot; struct mutex crit_sect; - u32 id; /* slot id (serial #) for hotplug core */ u8 device; /* pci device# */ u32 sun; /* ACPI _SUN (slot unique number) */ @@ -229,12 +226,13 @@ struct acpiphp_dock_station { /* acpiphp_core.c */ extern int acpiphp_register_attention(struct acpiphp_attention_info*info); extern int acpiphp_unregister_attention(struct acpiphp_attention_info *info); +extern int acpiphp_register_hotplug_slot(struct acpiphp_slot *slot); +extern void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *slot); /* acpiphp_glue.c */ extern int acpiphp_glue_init (void); extern void acpiphp_glue_exit (void); extern int acpiphp_get_num_slots (void); -extern struct acpiphp_slot *get_slot_from_id (int id); typedef int (*acpiphp_callback)(struct acpiphp_slot *slot, void *data); void handle_hotplug_event_func(acpi_handle, u32, void*); Index: linux-2.6.16-rc3-mm1/drivers/pci/hotplug/acpiphp_core.c =================================================================== --- linux-2.6.16-rc3-mm1.orig/drivers/pci/hotplug/acpiphp_core.c +++ linux-2.6.16-rc3-mm1/drivers/pci/hotplug/acpiphp_core.c @@ -44,8 +44,6 @@ #include "pci_hotplug.h" #include "acpiphp.h" -static LIST_HEAD(slot_list); - #define MY_NAME "acpiphp" static int debug; @@ -341,62 +339,53 @@ static void release_slot(struct hotplug_ kfree(slot); } -/** - * init_slots - initialize 'struct slot' structures for each slot - * - */ -static int __init init_slots(void) +/* callback routine to initialize 'struct slot' for each 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; - int i; - for (i = 0; i < num_slots; ++i) { - slot = kmalloc(sizeof(struct slot), GFP_KERNEL); - if (!slot) - goto error; - memset(slot, 0, sizeof(struct slot)); - - slot->hotplug_slot = kmalloc(sizeof(struct hotplug_slot), GFP_KERNEL); - if (!slot->hotplug_slot) - goto error_slot; - memset(slot->hotplug_slot, 0, sizeof(struct hotplug_slot)); - - slot->hotplug_slot->info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL); - if (!slot->hotplug_slot->info) - goto error_hpslot; - memset(slot->hotplug_slot->info, 0, sizeof(struct hotplug_slot_info)); - - slot->hotplug_slot->name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL); - if (!slot->hotplug_slot->name) - goto error_info; - - slot->number = i; - - slot->hotplug_slot->private = slot; - slot->hotplug_slot->release = &release_slot; - slot->hotplug_slot->ops = &acpi_hotplug_slot_ops; - - slot->acpi_slot = get_slot_from_id(i); - slot->hotplug_slot->info->power_status = acpiphp_get_power_status(slot->acpi_slot); - slot->hotplug_slot->info->attention_status = 0; - slot->hotplug_slot->info->latch_status = acpiphp_get_latch_status(slot->acpi_slot); - slot->hotplug_slot->info->adapter_status = acpiphp_get_adapter_status(slot->acpi_slot); - slot->hotplug_slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; - slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; - - make_slot_name(slot); - - retval = pci_hp_register(slot->hotplug_slot); - if (retval) { - err("pci_hp_register failed with error %d\n", retval); - goto error_name; - } - - /* add slot to our internal list */ - list_add(&slot->slot_list, &slot_list); - info("Slot [%s] registered\n", slot->hotplug_slot->name); - } + slot = kzalloc(sizeof(*slot), GFP_KERNEL); + if (!slot) + goto error; + + slot->hotplug_slot = kzalloc(sizeof(*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->name = kzalloc(SLOT_NAME_SIZE, GFP_KERNEL); + if (!slot->hotplug_slot->name) + goto error_info; + + slot->hotplug_slot->private = slot; + slot->hotplug_slot->release = &release_slot; + slot->hotplug_slot->ops = &acpi_hotplug_slot_ops; + + slot->acpi_slot = acpiphp_slot; + slot->hotplug_slot->info->power_status = acpiphp_get_power_status(slot->acpi_slot); + slot->hotplug_slot->info->attention_status = 0; + slot->hotplug_slot->info->latch_status = acpiphp_get_latch_status(slot->acpi_slot); + slot->hotplug_slot->info->adapter_status = acpiphp_get_adapter_status(slot->acpi_slot); + slot->hotplug_slot->info->max_bus_speed = PCI_SPEED_UNKNOWN; + slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; + + acpiphp_slot->slot = slot; + make_slot_name(slot); + + retval = pci_hp_register(slot->hotplug_slot); + if (retval) { + err("pci_hp_register failed with error %d\n", retval); + goto error_name; + } + + info("Slot [%s] registered\n", slot->hotplug_slot->name); return 0; error_name: @@ -412,17 +401,16 @@ error: } -static void __exit cleanup_slots (void) +void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *acpiphp_slot) { - struct list_head *tmp, *n; - struct slot *slot; + struct slot *slot = acpiphp_slot->slot; + int retval = 0; - list_for_each_safe (tmp, n, &slot_list) { - /* memory will be freed in release_slot callback */ - slot = list_entry(tmp, struct slot, slot_list); - list_del(&slot->slot_list); - pci_hp_deregister(slot->hotplug_slot); - } + info ("Slot [%s] unregistered\n", slot->hotplug_slot->name); + + retval = pci_hp_deregister(slot->hotplug_slot); + if (retval) + err("pci_hp_deregister failed with error %d\n", retval); } @@ -439,16 +427,13 @@ static int __init acpiphp_init(void) /* read all the ACPI info from the system */ retval = init_acpi(); - if (retval && !(docking_station)) - return retval; - return init_slots(); + return retval; } static void __exit acpiphp_exit(void) { - cleanup_slots(); /* deallocate internal data structures etc. */ acpiphp_glue_exit(); Index: linux-2.6.16-rc3-mm1/drivers/pci/hotplug/acpiphp_glue.c =================================================================== --- linux-2.6.16-rc3-mm1.orig/drivers/pci/hotplug/acpiphp_glue.c +++ linux-2.6.16-rc3-mm1/drivers/pci/hotplug/acpiphp_glue.c @@ -128,8 +128,7 @@ register_slot(acpi_handle handle, u32 lv acpi_handle tmp; acpi_status status = AE_OK; unsigned long adr, sun; - int device, function; - static int num_slots = 0; /* XXX if we support I/O node hotplug... */ + int device, function, retval; status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); @@ -198,7 +197,6 @@ register_slot(acpi_handle handle, u32 lv memset(slot, 0, sizeof(struct acpiphp_slot)); slot->bridge = bridge; - slot->id = num_slots++; slot->device = device; slot->sun = sun; INIT_LIST_HEAD(&slot->funcs); @@ -212,6 +210,11 @@ register_slot(acpi_handle handle, u32 lv dbg("found ACPI PCI Hotplug slot %d at PCI %04x:%02x:%02x\n", slot->sun, pci_domain_nr(bridge->pci_bus), bridge->pci_bus->number, slot->device); + retval = acpiphp_register_hotplug_slot(slot); + if (retval) { + warn("acpiphp_register_hotplug_slot failed(err code = 0x%x)\n", retval); + goto err_exit; + } } newfunc->slot = slot; @@ -246,6 +249,14 @@ register_slot(acpi_handle handle, u32 lv } return status; + + err_exit: + bridge->nr_slots--; + bridge->slots = slot->next; + kfree(slot); + kfree(newfunc); + + return AE_OK; } @@ -328,9 +339,16 @@ static void init_bridge_misc(struct acpi /* decode ACPI 2.0 _HPP (hot plug parameters) */ decode_hpp(bridge); + /* must be added to the list prior to calling register_slot */ + list_add(&bridge->list, &bridge_list); + /* register all slot objects under this bridge */ status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge->handle, (u32)1, register_slot, bridge, NULL); + if (ACPI_FAILURE(status)) { + list_del(&bridge->list); + return; + } /* install notify handler */ if (bridge->type != BRIDGE_TYPE_HOST) { @@ -343,8 +361,6 @@ static void init_bridge_misc(struct acpi err("failed to register interrupt notify handler\n"); } } - - list_add(&bridge->list, &bridge_list); } @@ -548,6 +564,8 @@ static void cleanup_bridge(struct acpiph list_del(list); kfree(func); } + acpiphp_unregister_hotplug_slot(slot); + list_del(&slot->funcs); kfree(slot); slot = next; } @@ -1400,26 +1418,6 @@ static int acpiphp_for_each_slot(acpiphp } #endif -/* search matching slot from id */ -struct acpiphp_slot *get_slot_from_id(int id) -{ - struct list_head *node; - struct acpiphp_bridge *bridge; - struct acpiphp_slot *slot; - - list_for_each (node, &bridge_list) { - bridge = (struct acpiphp_bridge *)node; - for (slot = bridge->slots; slot; slot = slot->next) - if (slot->id == id) - return slot; - } - - /* should never happen! */ - err("%s: no object for id %d\n", __FUNCTION__, id); - WARN_ON(1); - return NULL; -} - /** * acpiphp_enable_slot - power on slot ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2006-02-15 9:26 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-01-20 10:08 [PATCH 0/7] acpiphp - slots management fix MUNEDA Takahiro 2006-01-20 11:30 ` Pavel Machek 2006-01-23 0:37 ` [Pcihpd-discuss] " MUNEDA Takahiro 2006-01-27 4:14 ` Greg KH 2006-01-29 3:34 ` [Pcihpd-discuss] " MUNEDA Takahiro 2006-01-29 3:45 ` Greg KH 2006-01-31 18:20 ` Kristen Accardi 2006-02-07 20:13 ` Greg KH 2006-02-10 19:28 ` Kristen Accardi 2006-02-13 2:27 ` MUNEDA Takahiro 2006-02-14 7:13 ` [PATCH] acpiphp - slot management fix - V2 MUNEDA Takahiro 2006-02-14 9:17 ` [Pcihpd-discuss] " Kenji Kaneshige 2006-02-15 9:26 ` [PATCH] acpiphp - slot management fix - V3 MUNEDA Takahiro
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox