* [PATCH] RDMA/core: Fix swapped list_add_tail() arguments in ib_add_sub_device()
@ 2026-09-16 6:44 lirongqing
2026-09-16 6:54 ` sashiko-bot
2026-09-18 12:49 ` Leon Romanovsky
0 siblings, 2 replies; 3+ messages in thread
From: lirongqing @ 2026-09-16 6:44 UTC (permalink / raw)
To: Jason Gunthorpe, Leon Romanovsky, Jiri Pirko, Yonatan Nachum,
Kalesh AP, Michael Margolin, Kees Cook, Parav Pandit, Mark Zhang,
linux-rdma, linux-kernel
Cc: Li RongQing
From: Li RongQing <lirongqing@baidu.com>
ib_add_sub_device() links a new sub-device into its parent's sub-device
list with:
list_add_tail(&parent->subdev_list_head, &sub->subdev_list);
list_add_tail(new, head) expects the node to insert as the first
argument and the list head as the second, so the call above does the
opposite of what was intended: it treats the parent's list head as the
new node and the sub-device's node as the list head.
Because _ib_alloc_device() initialises subdev_list to a self-referencing
empty head, the misplaced insertion does not crash, but it corrupts the
parent->subdev_list_head list. After adding two or more sub-devices,
only the last one is reachable through the parent's head, and
ib_del_sub_device_and_put()'s list_del() on &sub->subdev_list rewrites
the head pointers, potentially severing earlier sub-devices from the
chain. During parent teardown, the reverse iteration over
subdev_list_head then skips the orphaned sub-devices, so their
del_sub_dev() callbacks are never invoked and ib_device_put() on the
parent is never paired, leaking both the HW sub-devices and a refcount.
Swap the arguments to match the documented intent: insert the
sub-device node into the parent's list head.
Fixes: bca51197620a ("RDMA/core: Support IB sub device with type "SMI"")
Signed-off-by: Li RongQing <lirongqing@baidu.com>
---
drivers/infiniband/core/device.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
index 7a3ed5e..05dd890 100644
--- a/drivers/infiniband/core/device.c
+++ b/drivers/infiniband/core/device.c
@@ -3067,7 +3067,7 @@ int ib_add_sub_device(struct ib_device *parent,
sub->parent = parent;
mutex_lock(&parent->subdev_lock);
- list_add_tail(&parent->subdev_list_head, &sub->subdev_list);
+ list_add_tail(&sub->subdev_list, &parent->subdev_list_head);
mutex_unlock(&parent->subdev_lock);
return ret;
--
2.9.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] RDMA/core: Fix swapped list_add_tail() arguments in ib_add_sub_device()
2026-09-16 6:44 [PATCH] RDMA/core: Fix swapped list_add_tail() arguments in ib_add_sub_device() lirongqing
@ 2026-09-16 6:54 ` sashiko-bot
2026-09-18 12:49 ` Leon Romanovsky
1 sibling, 0 replies; 3+ messages in thread
From: sashiko-bot @ 2026-09-16 6:54 UTC (permalink / raw)
To: lirongqing; +Cc: linux-rdma
> From: Li RongQing <lirongqing@baidu.com>
>
> ib_add_sub_device() links a new sub-device into its parent's sub-device
> list with:
>
> list_add_tail(&parent->subdev_list_head, &sub->subdev_list);
>
> list_add_tail(new, head) expects the node to insert as the first
> argument and the list head as the second, so the call above does the
> opposite of what was intended: it treats the parent's list head as the
> new node and the sub-device's node as the list head.
>
> Because _ib_alloc_device() initialises subdev_list to a self-referencing
> empty head, the misplaced insertion does not crash, but it corrupts the
> parent->subdev_list_head list. After adding two or more sub-devices,
> only the last one is reachable through the parent's head, and
> ib_del_sub_device_and_put()'s list_del() on &sub->subdev_list rewrites
> the head pointers, potentially severing earlier sub-devices from the
> chain. During parent teardown, the reverse iteration over
> subdev_list_head then skips the orphaned sub-devices, so their
> del_sub_dev() callbacks are never invoked and ib_device_put() on the
> parent is never paired, leaking both the HW sub-devices and a refcount.
>
> Swap the arguments to match the documented intent: insert the
> sub-device node into the parent's list head.
>
> Fixes: bca51197620a ("RDMA/core: Support IB sub device with type "SMI"")
> Signed-off-by: Li RongQing <lirongqing@baidu.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260916064435.2180-1-lirongqing@baidu.com?part=1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] RDMA/core: Fix swapped list_add_tail() arguments in ib_add_sub_device()
2026-09-16 6:44 [PATCH] RDMA/core: Fix swapped list_add_tail() arguments in ib_add_sub_device() lirongqing
2026-09-16 6:54 ` sashiko-bot
@ 2026-09-18 12:49 ` Leon Romanovsky
1 sibling, 0 replies; 3+ messages in thread
From: Leon Romanovsky @ 2026-09-18 12:49 UTC (permalink / raw)
To: Jason Gunthorpe, Jiri Pirko, Yonatan Nachum, Kalesh AP,
Michael Margolin, Kees Cook, Parav Pandit, Mark Zhang, linux-rdma,
linux-kernel, lirongqing
On Wed, 16 Sep 2026 14:44:35 +0800, lirongqing wrote:
> ib_add_sub_device() links a new sub-device into its parent's sub-device
> list with:
>
> list_add_tail(&parent->subdev_list_head, &sub->subdev_list);
>
> list_add_tail(new, head) expects the node to insert as the first
> argument and the list head as the second, so the call above does the
> opposite of what was intended: it treats the parent's list head as the
> new node and the sub-device's node as the list head.
>
> [...]
Applied, thanks!
[1/1] RDMA/core: Fix swapped list_add_tail() arguments in ib_add_sub_device()
https://git.kernel.org/rdma/rdma/c/fad7b0dcb0821c
Best regards,
--
Leon Romanovsky <leon@kernel.org>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-09-18 12:49 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-16 6:44 [PATCH] RDMA/core: Fix swapped list_add_tail() arguments in ib_add_sub_device() lirongqing
2026-09-16 6:54 ` sashiko-bot
2026-09-18 12:49 ` Leon Romanovsky
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.