From: Alex Chiang <achiang@hp.com>
To: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Cc: linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
jbarnes@virtuousgeek.org, kristen.c.accardi@intel.com,
matthew@wil.cx
Subject: Re: [PATCH 02/13] PCI: prevent duplicate slot names
Date: Tue, 9 Sep 2008 03:04:21 -0600 [thread overview]
Message-ID: <20080909090421.GA11901@ldl.fc.hp.com> (raw)
In-Reply-To: <48AD4265.10108@jp.fujitsu.com>
Hi Kenji-san,
As always, thank you very much for the excellent review.
Sorry for the delay; I've been busy with travel, and trying to
figure out how to solve the issue you pointed out below.
* Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>:
> Hi Alex-san,
>
> Thank you for updated patches and I'm sorry for delayed comment.
> I reviewed your patch and I found two problems. Please see below.
>
> Alex Chiang wrote:
>> Prevent callers of pci_create_slot() from registering slots with
>> duplicate names. This condition occurs most often when PCI hotplug
>> drivers are loaded on platforms with broken firmware that assigns
>> identical names to multiple slots.
>>
>> We now rename these duplicate slots on behalf of the user.
>>
>> If firmware assigns the name N to multiple slots, then:
>>
>> The first registered slot is assigned N
>> The second registered slot is assigned N-1
>> The third registered slot is assigned N-2
>> The Mth registered slot becomes N-M
>>
>> A side effect of this patch is that the error condition for when
>> multiple drivers attempt to claim the same slot becomes much more
>> prominent.
>>
>> In other words, the previous error condition returned for
>> duplicate slot names (-EEXIST) masked the case when multiple
>> drivers attempted to claim the same slot. Now, the -EBUSY return
>> makes the true error more obvious.
>>
>> Finally, since we now prevent duplicate slot names, we remove
>> the logic introduced by the following commits:
>>
>> +static char *make_slot_name(const char *name)
>> +{
>> + char *new_name;
>> + int len, width, dup = 1;
>> + struct kobject *dup_slot;
>> +
>> + new_name = kstrdup(name, GFP_KERNEL);
>> + if (!new_name)
>> + goto out;
>> +
>> + /*
>> + * Start off allocating enough room for "name-X"
>> + */
>> + len = strlen(name) + 2;
>> + width = 1;
>> +
>> +try_again:
>> + dup_slot = kset_find_obj(pci_slots_kset, new_name);
>> + if (!dup_slot)
>> + goto out;
>> +
>
> The kset_find_obj() increments reference counter of specified kobject. So
> we must call kobject_put() for 'dup_slot', otherwise it leaks reference
> counter of 'dup_slot' kobject and the corresponding slot directory will
> never be removed. Here is a sample to fix this problem.
>
> dup_slot = kset_find_ojb(pci_slots_kset, new_name);
> if (!dup_slot)
> goto out;
> kobject_put(dup_slot);
> ^^^^^^^^^^^^^^^^^^^^^^ Added this line
Yes, thanks for catching that. I've fixed it.
> I found another problem in pci_hp_register() that would be more complex
> to fix than above-mentioned problem. Here is a pci_hp_register() with
> all of your patch applied.
>
> int pci_hp_register(struct hotplug_slot *slot, struct pci_bus *bus, int slot_nr,
> const char *name)
> {
> (snip...)
>
> /*
> * No problems if we call this interface from both ACPI_PCI_SLOT
> * driver and call it here again. If we've already created the
> * pci_slot, the interface will simply bump the refcount.
> */
> pci_slot = pci_create_slot(bus, slot_nr, name);
> if (IS_ERR(pci_slot))
> return PTR_ERR(pci_slot);
>
> if (pci_slot->hotplug) {
> dbg("%s: already claimed\n", __func__);
> pci_destroy_slot(pci_slot);
> return -EBUSY;
> }
>
> slot->pci_slot = pci_slot;
> pci_slot->hotplug = slot;
>
> /*
> * Allow pcihp drivers to override the ACPI_PCI_SLOT name.
> */
> if (strcmp(kobject_name(&pci_slot->kobj), name)) {
> result = kobject_rename(&pci_slot->kobj, name);
> if (result) {
> pci_destroy_slot(pci_slot);
> return result;
> }
> }
>
> (snip...)
> }
>
> If name duplication was detected in pci_create_slot(), it renames the
> slot name like 'N-1' and return successfully. Even though slot's kobject
> name was registered as 'N-1', 'name' array still have 'N' at this point.
> So the following 'if' statement becomes true unexpectedly.
>
> /*
> * Allow pcihp drivers to override the ACPI_PCI_SLOT name.
> */
> if (strcmp(kobject_name(&pci_slot->kobj), name)) {
>
> Then pci_hp_register() attempt to rename the slot name with 'N' again
> by calling kobject_rename(), but it fails because there already exists
> kobject with name 'N'. As a result, pci_hp_register() will fail.
Yes, you are right, that is a problem.
I've taken the following approach:
- the above code is providing a mechanism to allow a
_hotplug_ driver to override a _detection_ driver slot
name.
- in other words, we only have to worry about the case
when a _detection_ driver was loaded before a _hotplug_
driver.
- we can ignore the case where another _hotplug_ driver
was loaded first, because we'll already return -EBUSY.
- so, to figure out if a _detection_ driver has already
been loaded, we check to see if the pci_dev already has
a valid pci_slot pointer.
- if yes, then we later check to see if the existing slot
name matches the requested slot name from the hotplug
driver.
- if the hotplug driver is requesting a different name,
then we use a new interface, pci_rename_slot() which
will safely attempt to rename the slot without name
collision.
I'll send out the patch set soon, it would be great if you could
test it for me, since I don't have systems with duplicate slot
names.
Thank you very much!
/ac
next prev parent reply other threads:[~2008-09-09 9:04 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-17 0:14 [PATCH 00/13] PCI: let the core manage slot names Alex Chiang
2008-08-17 0:15 ` [PATCH 01/13] PCI Hotplug core: add 'name' param pci_hp_register interface Alex Chiang
2008-08-17 0:16 ` [PATCH 02/13] PCI: prevent duplicate slot names Alex Chiang
2008-08-21 10:24 ` Kenji Kaneshige
2008-09-09 9:04 ` Alex Chiang [this message]
2008-09-09 10:00 ` [PATCH v2 00/13] PCI: let the core manage " Alex Chiang
2008-09-09 10:00 ` [PATCH v2 01/13] PCI Hotplug core: add 'name' param pci_hp_register interface Alex Chiang
2008-09-09 12:05 ` Matthew Wilcox
2008-09-09 17:18 ` Alex Chiang
2008-09-09 10:00 ` [PATCH v2 02/13] PCI: prevent duplicate slot names Alex Chiang
2008-09-09 13:07 ` Matthew Wilcox
2008-09-22 21:38 ` Alex Chiang
2008-09-22 22:42 ` Matthew Wilcox
2008-09-10 14:58 ` Rolf Eike Beer
2008-09-22 21:40 ` Alex Chiang
2008-09-11 2:47 ` Kenji Kaneshige
2008-09-11 10:37 ` Alex Chiang
2008-09-23 0:05 ` Alex Chiang
2008-09-09 10:00 ` [PATCH v2 03/13] PCI, PCI Hotplug: introduce slot_name helpers Alex Chiang
2008-09-09 14:30 ` Matthew Wilcox
2008-09-09 10:00 ` [PATCH v2 04/13] PCI: acpiphp: remove 'name' parameter Alex Chiang
2008-09-09 14:38 ` Matthew Wilcox
2008-09-23 1:16 ` Alex Chiang
2008-09-09 10:00 ` [PATCH v2 05/13] PCI: cpci_hotplug: stop managing hotplug_slot->name Alex Chiang
2008-09-09 15:04 ` Matthew Wilcox
2008-09-09 21:11 ` Scott Murray
2008-09-09 10:00 ` [PATCH v2 06/13] PCI: cpqphp: " Alex Chiang
2008-09-09 15:08 ` Matthew Wilcox
2008-09-23 1:20 ` Alex Chiang
2008-09-09 10:00 ` [PATCH v2 07/13] PCI: fakephp: remove 'name' parameter Alex Chiang
2008-09-09 10:00 ` [PATCH v2 08/13] PCI: ibmphp: stop managing hotplug_slot->name Alex Chiang
2008-09-09 10:00 ` [PATCH v2 09/13] PCI: pciehp: remove 'name' parameter Alex Chiang
2008-09-09 10:00 ` [PATCH v2 10/13] PCI: rpaphp: stop managing hotplug_slot->name Alex Chiang
2008-09-09 10:00 ` [PATCH v2 11/13] PCI: SGI Hotplug: stop managing bss_hotplug_slot->name Alex Chiang
2008-09-09 10:01 ` [PATCH v2 12/13] PCI: shcphp: remove 'name' parameter Alex Chiang
2008-09-09 10:01 ` [PATCH v2 13/13] PCI: Hotplug core: remove 'name' Alex Chiang
2008-09-11 2:43 ` [PATCH 02/13] PCI: prevent duplicate slot names Kenji Kaneshige
2008-08-17 0:16 ` [PATCH 03/13] PCI, PCI Hotplug: introduce slot_name helpers Alex Chiang
2008-08-17 0:16 ` [PATCH 04/13] PCI: acpiphp: remove 'name' parameter Alex Chiang
2008-08-17 8:59 ` Rolf Eike Beer
2008-08-19 18:39 ` Alex Chiang
2008-08-19 21:01 ` Rolf Eike Beer
2008-08-19 21:26 ` Alex Chiang
2008-08-19 21:40 ` Jesse Barnes
2008-08-19 23:50 ` Alex Chiang
2008-08-20 2:25 ` Kenji Kaneshige
2008-08-17 0:16 ` [PATCH 05/13] PCI: cpci_hotplug: stop managing hotplug_slot->name Alex Chiang
2008-08-17 0:16 ` [PATCH 06/13] PCI: cpqphp: " Alex Chiang
2008-08-17 0:17 ` [PATCH 07/13] PCI: fakephp: remove 'name' parameter Alex Chiang
2008-08-17 0:17 ` [PATCH 08/13] PCI: ibmphp: stop managing hotplug_slot->name Alex Chiang
2008-08-17 0:17 ` [PATCH 09/13] PCI: pciehp: remove 'name' parameter Alex Chiang
2008-08-17 0:17 ` [PATCH 10/13] PCI: rpaphp: stop managing hotplug_slot->name Alex Chiang
2008-08-17 0:17 ` [PATCH 11/13] PCI: SGI Hotplug: stop managing bss_hotplug_slot->name Alex Chiang
2008-08-17 0:17 ` [PATCH 12/13] PCI: shcphp: remove 'name' parameter Alex Chiang
2008-08-17 0:17 ` [PATCH 13/13] PCI: Hotplug core: remove 'name' Alex Chiang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080909090421.GA11901@ldl.fc.hp.com \
--to=achiang@hp.com \
--cc=jbarnes@virtuousgeek.org \
--cc=kaneshige.kenji@jp.fujitsu.com \
--cc=kristen.c.accardi@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=matthew@wil.cx \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox