From: Ian Munsie <hidden> Date: 2015-01-07 05:42:13
From: Ryan Grimm <redacted>
When unbinding and rebinding the driver on a system with a card in PHB0, this
error condition is reached after a few attempts:
ERROR: Bad of_node_put() on /pciex@3fffe40000000
CPU: 0 PID: 3040 Comm: bash Not tainted 3.18.0-rc3-12545-g3627ffe #152
Call Trace:
[c000000721acb5c0] [c00000000086ef94] .dump_stack+0x84/0xb0 (unreliable)
[c000000721acb640] [c00000000073a0a8] .of_node_release+0xd8/0xe0
[c000000721acb6d0] [c00000000044bc44] .kobject_release+0x74/0xe0
[c000000721acb760] [c0000000007394fc] .of_node_put+0x1c/0x30
[c000000721acb7d0] [c000000000545cd8] .cxl_probe+0x1a98/0x1d50
[c000000721acb900] [c0000000004845a0] .local_pci_probe+0x40/0xc0
[c000000721acb980] [c000000000484998] .pci_device_probe+0x128/0x170
[c000000721acba30] [c00000000052400c] .driver_probe_device+0xac/0x2a0
[c000000721acbad0] [c000000000522468] .bind_store+0x108/0x160
[c000000721acbb70] [c000000000521448] .drv_attr_store+0x38/0x60
[c000000721acbbe0] [c000000000293840] .sysfs_kf_write+0x60/0xa0
[c000000721acbc50] [c000000000292500] .kernfs_fop_write+0x140/0x1d0
[c000000721acbcf0] [c000000000208648] .vfs_write+0xd8/0x260
[c000000721acbd90] [c000000000208b18] .SyS_write+0x58/0x100
[c000000721acbe30] [c000000000009258] syscall_exit+0x0/0x98
of_get_next_parent decrements parent's refcount and we need to call of_node_put
after the iteration. But, if while loop is not entered, of_node_put get called
on np without an of_node_get. So, call it before the while loop.
Signed-off-by: Ryan Grimm <redacted>
Signed-off-by: Ian Munsie <redacted>
---
drivers/misc/cxl/pci.c | 1 +
1 file changed, 1 insertion(+)
From: Ian Munsie <hidden> Date: 2015-01-28 04:03:00
Excerpts from Ian Munsie's message of 2015-01-07 16:41:18 +1100:
From: Ryan Grimm <redacted>
When unbinding and rebinding the driver on a system with a card in PHB0, this
error condition is reached after a few attempts:
Hey mpe,
I just wanted to check the status of this one? I can't see it in your
tree and wanted to make sure you didn't simply miss it.
Cheers,
-Ian
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2015-01-28 05:04:41
On Wed, 2015-01-28 at 15:02 +1100, Ian Munsie wrote:
Excerpts from Ian Munsie's message of 2015-01-07 16:41:18 +1100:
quoted
From: Ryan Grimm <redacted>
When unbinding and rebinding the driver on a system with a card in PHB0, this
error condition is reached after a few attempts:
Hey mpe,
I just wanted to check the status of this one? I can't see it in your
tree and wanted to make sure you didn't simply miss it.
It looked fishy, but I never got around to replying.
The second sentence in the explanation should never be true:
But, if while loop is not entered, of_node_put get called
on np without an of_node_get.
You shouldn't have np unless you did an of_node_get() to get it, otherwise it's
pointing at something you don't have a reference for and it might go away at
any time.
So the patch may fix the bug but I don't think it's correct.
I think pnv_pci_to_phb_node() should be doing a get for you, before returning
the pointer.
See as a comparison pcibios_get_phb_of_node().
cheers
From: Ian Munsie <hidden> Date: 2015-01-28 05:54:45
Excerpts from Michael Ellerman's message of 2015-01-28 16:04:40 +1100:
quoted
I just wanted to check the status of this one? I can't see it in your
tree and wanted to make sure you didn't simply miss it.
It looked fishy, but I never got around to replying.
The second sentence in the explanation should never be true:
Right, that was the point of the fix ;)
You shouldn't have np unless you did an of_node_get() to get it, otherwise it's
pointing at something you don't have a reference for and it might go away at
any time.
So the patch may fix the bug but I don't think it's correct.
I think pnv_pci_to_phb_node() should be doing a get for you, before returning
the pointer.
Agreed - we should probably also rename it to have 'get' in the name,
like pnv_pci_get_phb_node().
See as a comparison pcibios_get_phb_of_node().
We could almost use that instead, except it's not exported for modules
and I'm not sure if that even works with __weak functions?
Ryan - do you want to respin this, or would you rather I take it?
Cheers,
-Ian
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2015-01-28 06:07:46
On Wed, 2015-01-28 at 16:53 +1100, Ian Munsie wrote:
Excerpts from Michael Ellerman's message of 2015-01-28 16:04:40 +1100:
quoted
quoted
I just wanted to check the status of this one? I can't see it in your
tree and wanted to make sure you didn't simply miss it.
It looked fishy, but I never got around to replying.
The second sentence in the explanation should never be true:
Right, that was the point of the fix ;)
Sure, but bodging of_node_get()s all over the place is not a path to success.
quoted
You shouldn't have np unless you did an of_node_get() to get it, otherwise it's
pointing at something you don't have a reference for and it might go away at
any time.
So the patch may fix the bug but I don't think it's correct.
I think pnv_pci_to_phb_node() should be doing a get for you, before returning
the pointer.
Agreed - we should probably also rename it to have 'get' in the name,
like pnv_pci_get_phb_node().
Yep.
quoted
See as a comparison pcibios_get_phb_of_node().
We could almost use that instead, except it's not exported for modules
and I'm not sure if that even works with __weak functions?
It should. It's only weak until the final link and then you get a non-weak
version AIUI.
Try it.
And a follow up patch to have it use pci_bus_to_host() would be nice too.
cheers
From: Ryan Grimm <hidden> Date: 2015-01-29 02:15:24
On 01/28/2015 12:53 AM, Ian Munsie wrote:
Excerpts from Michael Ellerman's message of 2015-01-28 16:04:40 +1100:
quoted
quoted
I just wanted to check the status of this one? I can't see it in your
tree and wanted to make sure you didn't simply miss it.
It looked fishy, but I never got around to replying.
The second sentence in the explanation should never be true:
Right, that was the point of the fix ;)
quoted
You shouldn't have np unless you did an of_node_get() to get it, otherwise it's
pointing at something you don't have a reference for and it might go away at
any time.
So the patch may fix the bug but I don't think it's correct.
I think pnv_pci_to_phb_node() should be doing a get for you, before returning
the pointer.
Agreed - we should probably also rename it to have 'get' in the name,
like pnv_pci_get_phb_node().
Yeah, that's way better than the current patch.
quoted
See as a comparison pcibios_get_phb_of_node().
We could almost use that instead, except it's not exported for modules
and I'm not sure if that even works with __weak functions?
Ryan - do you want to respin this, or would you rather I take it?