From: Rosen Penev <rosenp@gmail.com>
To: linux-usb@vger.kernel.org
Cc: Andreas Noever <andreas.noever@gmail.com>,
Mika Westerberg <westeri@kernel.org>,
Yehezkel Bernat <YehezkelShB@gmail.com>,
Kees Cook <kees@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>,
linux-kernel@vger.kernel.org (open list),
linux-hardening@vger.kernel.org (open list:KERNEL HARDENING (not
covered by other areas):Keyword:\b__counted_by(_le|_be)?\b)
Subject: [PATCHv3] thunderbolt: use kzalloc_flex
Date: Wed, 18 Mar 2026 11:52:37 -0700 [thread overview]
Message-ID: <20260318185237.4742-1-rosenp@gmail.com> (raw)
Simplifies allocation by using a flexible arraay member.
Added __counted_by for extra runtime analysis.
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
v3: fix kdoc
v2: remove extra kfree to fix kernel test bot.
drivers/thunderbolt/path.c | 28 +++++++---------------------
drivers/thunderbolt/tb.h | 5 +++--
2 files changed, 10 insertions(+), 23 deletions(-)
diff --git a/drivers/thunderbolt/path.c b/drivers/thunderbolt/path.c
index 22fb4a1e1acd..8713ea0f47c1 100644
--- a/drivers/thunderbolt/path.c
+++ b/drivers/thunderbolt/path.c
@@ -150,22 +150,17 @@ struct tb_path *tb_path_discover(struct tb_port *src, int src_hopid,
num_hops++;
}
- path = kzalloc_obj(*path);
+ path = kzalloc_flex(*path, hops, num_hops);
if (!path)
return NULL;
+ path->path_length = num_hops;
+
path->name = name;
path->tb = src->sw->tb;
- path->path_length = num_hops;
path->activated = true;
path->alloc_hopid = alloc_hopid;
- path->hops = kzalloc_objs(*path->hops, num_hops);
- if (!path->hops) {
- kfree(path);
- return NULL;
- }
-
tb_dbg(path->tb, "discovering %s path starting from %llx:%u\n",
path->name, tb_route(src->sw), src->port);
@@ -245,10 +240,6 @@ struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid,
size_t num_hops;
int i, ret;
- path = kzalloc_obj(*path);
- if (!path)
- return NULL;
-
first_port = last_port = NULL;
i = 0;
tb_for_each_port_on_path(src, dst, in_port) {
@@ -259,20 +250,17 @@ struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid,
}
/* Check that src and dst are reachable */
- if (first_port != src || last_port != dst) {
- kfree(path);
+ if (first_port != src || last_port != dst)
return NULL;
- }
/* Each hop takes two ports */
num_hops = i / 2;
- path->hops = kzalloc_objs(*path->hops, num_hops);
- if (!path->hops) {
- kfree(path);
+ path = kzalloc_flex(*path, hops, num_hops);
+ if (!path)
return NULL;
- }
+ path->path_length = num_hops;
path->alloc_hopid = true;
in_hopid = src_hopid;
@@ -339,7 +327,6 @@ struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid,
}
path->tb = tb;
- path->path_length = num_hops;
path->name = name;
return path;
@@ -372,7 +359,6 @@ void tb_path_free(struct tb_path *path)
}
}
- kfree(path->hops);
kfree(path);
}
diff --git a/drivers/thunderbolt/tb.h b/drivers/thunderbolt/tb.h
index e96474f17067..217c3114bec8 100644
--- a/drivers/thunderbolt/tb.h
+++ b/drivers/thunderbolt/tb.h
@@ -419,9 +419,9 @@ enum tb_path_port {
* @activated: Is the path active
* @clear_fc: Clear all flow control from the path config space entries
* when deactivating this path
- * @hops: Path hops
* @path_length: How many hops the path uses
* @alloc_hopid: Does this path consume port HopID
+ * @hops: Path hops
*
* A path consists of a number of hops (see &struct tb_path_hop). To
* establish a PCIe tunnel two paths have to be created between the two
@@ -440,9 +440,10 @@ struct tb_path {
bool drop_packages;
bool activated;
bool clear_fc;
- struct tb_path_hop *hops;
int path_length;
bool alloc_hopid;
+
+ struct tb_path_hop hops[] __counted_by(path_length);
};
/* HopIDs 0-7 are reserved by the Thunderbolt protocol */
--
2.53.0
next reply other threads:[~2026-03-18 18:52 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-18 18:52 Rosen Penev [this message]
2026-03-20 18:48 ` [PATCHv3] thunderbolt: use kzalloc_flex Kees Cook
2026-03-23 5:53 ` Mika Westerberg
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=20260318185237.4742-1-rosenp@gmail.com \
--to=rosenp@gmail.com \
--cc=YehezkelShB@gmail.com \
--cc=andreas.noever@gmail.com \
--cc=gustavoars@kernel.org \
--cc=kees@kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=westeri@kernel.org \
/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 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.