thunderbolt: use kzalloc_flex
Subsystems (2)
PATCH 1/1 thunderbolt: use kzalloc_flex
Simplifies allocation by using a flexible arraay member.
Added __counted_by for extra runtime analysis.
--- drivers/thunderbolt/path.c | 24 ++++++------------------ drivers/thunderbolt/tb.h | 3 ++- 2 files changed, 8 insertions(+), 19 deletions(-)
drivers/thunderbolt/path.c +6 -18
@@ -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) {
@@ -267,12 +258,11 @@ struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid,/* 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 +329,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 +361,6 @@ void tb_path_free(struct tb_path *path) } } -kfree (path->hops);kfree (path); }
drivers/thunderbolt/tb.h +2 -1
@@ -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 */
Signature · 1 line
2.53.0
kernel test robot
build botkernel test robot noticed the following build warnings:
Hi Rosen,
kernel test robot noticed the following build warnings:
[auto build test WARNING on westeri-thunderbolt/next]
[also build test WARNING on linus/master v7.0-rc3 next-20260311] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Rosen-Penev/thunderbolt-use-kzalloc_flex/20260312-072328 base: https://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt.git next patch link: https://lore.kernel.org/r/20260311232205.18137-1-rosenp%40gmail.com patch subject: [PATCH] thunderbolt: use kzalloc_flex config: um-randconfig-r051-20260312 (https://download.01.org/0day-ci/archive/20260312/[email protected]/config) compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project 7d47b695929cc7f85eeb0f87d0189adc04c1c629) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260312/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
In file included from drivers/thunderbolt/path.c:14:
In file included from drivers/thunderbolt/tb.h:14:
In file included from include/linux/pci.h:38:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from arch/um/include/asm/hardirq.h:24:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:12:
In file included from arch/um/include/asm/io.h:24:
include/asm-generic/io.h:1209:55: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
1209 | return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port;
| ~~~~~~~~~~ ^
>> drivers/thunderbolt/path.c:254:9: warning: variable 'path' is uninitialized when used here [-Wuninitialized]
254 | kfree(path);
| ^~~~
drivers/thunderbolt/path.c:239:22: note: initialize the variable 'path' to silence this warning
239 | struct tb_path *path;
| ^
| = NULL2 warnings generated.
vim +/path +254 drivers/thunderbolt/path.c
0414bec5f39a3c7 Mika Westerberg 2017-02-19 214
520b670216a15fb Andreas Noever 2014-06-03 215 /**
8c7acaaf020fe54 Mika Westerberg 2017-02-19 216 * tb_path_alloc() - allocate a thunderbolt path between two ports
8c7acaaf020fe54 Mika Westerberg 2017-02-19 217 * @tb: Domain pointer
8c7acaaf020fe54 Mika Westerberg 2017-02-19 218 * @src: Source port of the path
8c7acaaf020fe54 Mika Westerberg 2017-02-19 219 * @src_hopid: HopID used for the first ingress port in the path
8c7acaaf020fe54 Mika Westerberg 2017-02-19 220 * @dst: Destination port of the path
8c7acaaf020fe54 Mika Westerberg 2017-02-19 221 * @dst_hopid: HopID used for the last egress port in the path
8c7acaaf020fe54 Mika Westerberg 2017-02-19 222 * @link_nr: Preferred link if there are dual links on the path
8c7acaaf020fe54 Mika Westerberg 2017-02-19 223 * @name: Name of the path
8c7acaaf020fe54 Mika Westerberg 2017-02-19 224 *
8c7acaaf020fe54 Mika Westerberg 2017-02-19 225 * Creates path between two ports starting with given @src_hopid. Reserves
8c7acaaf020fe54 Mika Westerberg 2017-02-19 226 * HopIDs for each port (they can be different from @src_hopid depending on
8c7acaaf020fe54 Mika Westerberg 2017-02-19 227 * how many HopIDs each port already have reserved). If there are dual
91c0c12080d0f40 Mika Westerberg 2019-03-21 228 * links on the path, prioritizes using @link_nr but takes into account
91c0c12080d0f40 Mika Westerberg 2019-03-21 229 * that the lanes may be bonded.
520b670216a15fb Andreas Noever 2014-06-03 230 *
a6e3f939ada8c45 Alan Borzeszkowski 2025-08-27 231 * Return: Pointer to &struct tb_path, %NULL in case of failure.
520b670216a15fb Andreas Noever 2014-06-03 232 */
8c7acaaf020fe54 Mika Westerberg 2017-02-19 233 struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid,
8c7acaaf020fe54 Mika Westerberg 2017-02-19 234 struct tb_port *dst, int dst_hopid, int link_nr,
8c7acaaf020fe54 Mika Westerberg 2017-02-19 235 const char *name)
520b670216a15fb Andreas Noever 2014-06-03 236 {
7e897bb7be11983 Mika Westerberg 2020-05-17 237 struct tb_port *in_port, *out_port, *first_port, *last_port;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 238 int in_hopid, out_hopid;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 239 struct tb_path *path;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 240 size_t num_hops;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 241 int i, ret;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 242
7e897bb7be11983 Mika Westerberg 2020-05-17 243 first_port = last_port = NULL;
c64c3f3ac63a101 Mika Westerberg 2020-04-29 244 i = 0;
7e897bb7be11983 Mika Westerberg 2020-05-17 245 tb_for_each_port_on_path(src, dst, in_port) {
7e897bb7be11983 Mika Westerberg 2020-05-17 246 if (!first_port)
7e897bb7be11983 Mika Westerberg 2020-05-17 247 first_port = in_port;
7e897bb7be11983 Mika Westerberg 2020-05-17 248 last_port = in_port;
c64c3f3ac63a101 Mika Westerberg 2020-04-29 249 i++;
7e897bb7be11983 Mika Westerberg 2020-05-17 250 }
7e897bb7be11983 Mika Westerberg 2020-05-17 251
7e897bb7be11983 Mika Westerberg 2020-05-17 252 /* Check that src and dst are reachable */
7e897bb7be11983 Mika Westerberg 2020-05-17 253 if (first_port != src || last_port != dst) {
7e897bb7be11983 Mika Westerberg 2020-05-17 @254 kfree(path);
7e897bb7be11983 Mika Westerberg 2020-05-17 255 return NULL;
7e897bb7be11983 Mika Westerberg 2020-05-17 256 }
c64c3f3ac63a101 Mika Westerberg 2020-04-29 257
c64c3f3ac63a101 Mika Westerberg 2020-04-29 258 /* Each hop takes two ports */
c64c3f3ac63a101 Mika Westerberg 2020-04-29 259 num_hops = i / 2;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 260
f02e75329d5baac Rosen Penev 2026-03-11 261 path = kzalloc_flex(*path, hops, num_hops);
f02e75329d5baac Rosen Penev 2026-03-11 262 if (!path)
520b670216a15fb Andreas Noever 2014-06-03 263 return NULL;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 264
f02e75329d5baac Rosen Penev 2026-03-11 265 path->path_length = num_hops;
43bddb26e20af91 Mika Westerberg 2021-11-14 266 path->alloc_hopid = true;
43bddb26e20af91 Mika Westerberg 2021-11-14 267
8c7acaaf020fe54 Mika Westerberg 2017-02-19 268 in_hopid = src_hopid;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 269 out_port = NULL;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 270
8c7acaaf020fe54 Mika Westerberg 2017-02-19 271 for (i = 0; i < num_hops; i++) {
8c7acaaf020fe54 Mika Westerberg 2017-02-19 272 in_port = tb_next_port_on_path(src, dst, out_port);
8c7acaaf020fe54 Mika Westerberg 2017-02-19 273 if (!in_port)
8c7acaaf020fe54 Mika Westerberg 2017-02-19 274 goto err;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 275
91c0c12080d0f40 Mika Westerberg 2019-03-21 276 /* When lanes are bonded primary link must be used */
91c0c12080d0f40 Mika Westerberg 2019-03-21 277 if (!in_port->bonded && in_port->dual_link_port &&
91c0c12080d0f40 Mika Westerberg 2019-03-21 278 in_port->link_nr != link_nr)
8c7acaaf020fe54 Mika Westerberg 2017-02-19 279 in_port = in_port->dual_link_port;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 280
8c7acaaf020fe54 Mika Westerberg 2017-02-19 281 ret = tb_port_alloc_in_hopid(in_port, in_hopid, in_hopid);
8c7acaaf020fe54 Mika Westerberg 2017-02-19 282 if (ret < 0)
8c7acaaf020fe54 Mika Westerberg 2017-02-19 283 goto err;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 284 in_hopid = ret;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 285
8c7acaaf020fe54 Mika Westerberg 2017-02-19 286 out_port = tb_next_port_on_path(src, dst, in_port);
8c7acaaf020fe54 Mika Westerberg 2017-02-19 287 if (!out_port)
8c7acaaf020fe54 Mika Westerberg 2017-02-19 288 goto err;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 289
91c0c12080d0f40 Mika Westerberg 2019-03-21 290 /*
91c0c12080d0f40 Mika Westerberg 2019-03-21 291 * Pick up right port when going from non-bonded to
91c0c12080d0f40 Mika Westerberg 2019-03-21 292 * bonded or from bonded to non-bonded.
91c0c12080d0f40 Mika Westerberg 2019-03-21 293 */
91c0c12080d0f40 Mika Westerberg 2019-03-21 294 if (out_port->dual_link_port) {
91c0c12080d0f40 Mika Westerberg 2019-03-21 295 if (!in_port->bonded && out_port->bonded &&
91c0c12080d0f40 Mika Westerberg 2019-03-21 296 out_port->link_nr) {
91c0c12080d0f40 Mika Westerberg 2019-03-21 297 /*
91c0c12080d0f40 Mika Westerberg 2019-03-21 298 * Use primary link when going from
91c0c12080d0f40 Mika Westerberg 2019-03-21 299 * non-bonded to bonded.
91c0c12080d0f40 Mika Westerberg 2019-03-21 300 */
8c7acaaf020fe54 Mika Westerberg 2017-02-19 301 out_port = out_port->dual_link_port;
91c0c12080d0f40 Mika Westerberg 2019-03-21 302 } else if (!out_port->bonded &&
91c0c12080d0f40 Mika Westerberg 2019-03-21 303 out_port->link_nr != link_nr) {
91c0c12080d0f40 Mika Westerberg 2019-03-21 304 /*
91c0c12080d0f40 Mika Westerberg 2019-03-21 305 * If out port is not bonded follow
91c0c12080d0f40 Mika Westerberg 2019-03-21 306 * link_nr.
91c0c12080d0f40 Mika Westerberg 2019-03-21 307 */
91c0c12080d0f40 Mika Westerberg 2019-03-21 308 out_port = out_port->dual_link_port;
91c0c12080d0f40 Mika Westerberg 2019-03-21 309 }
91c0c12080d0f40 Mika Westerberg 2019-03-21 310 }
8c7acaaf020fe54 Mika Westerberg 2017-02-19 311
8c7acaaf020fe54 Mika Westerberg 2017-02-19 312 if (i == num_hops - 1)
8c7acaaf020fe54 Mika Westerberg 2017-02-19 313 ret = tb_port_alloc_out_hopid(out_port, dst_hopid,
8c7acaaf020fe54 Mika Westerberg 2017-02-19 314 dst_hopid);
8c7acaaf020fe54 Mika Westerberg 2017-02-19 315 else
8c7acaaf020fe54 Mika Westerberg 2017-02-19 316 ret = tb_port_alloc_out_hopid(out_port, -1, -1);
8c7acaaf020fe54 Mika Westerberg 2017-02-19 317
8c7acaaf020fe54 Mika Westerberg 2017-02-19 318 if (ret < 0)
8c7acaaf020fe54 Mika Westerberg 2017-02-19 319 goto err;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 320 out_hopid = ret;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 321
8c7acaaf020fe54 Mika Westerberg 2017-02-19 322 path->hops[i].in_hop_index = in_hopid;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 323 path->hops[i].in_port = in_port;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 324 path->hops[i].in_counter_index = -1;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 325 path->hops[i].out_port = out_port;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 326 path->hops[i].next_hop_index = out_hopid;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 327
8c7acaaf020fe54 Mika Westerberg 2017-02-19 328 in_hopid = out_hopid;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 329 }
8c7acaaf020fe54 Mika Westerberg 2017-02-19 330
520b670216a15fb Andreas Noever 2014-06-03 331 path->tb = tb;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 332 path->name = name;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 333
520b670216a15fb Andreas Noever 2014-06-03 334 return path;
8c7acaaf020fe54 Mika Westerberg 2017-02-19 335
8c7acaaf020fe54 Mika Westerberg 2017-02-19 336 err:
8c7acaaf020fe54 Mika Westerberg 2017-02-19 337 tb_path_free(path);
8c7acaaf020fe54 Mika Westerberg 2017-02-19 338 return NULL;
520b670216a15fb Andreas Noever 2014-06-03 339 }
520b670216a15fb Andreas Noever 2014-06-03 340 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Hi Penev,
Quoted 5 lines · Rosen Penev
Simplifies allocation by using a flexible arraay member.
Added
__counted_byfor extra runtime analysis.Signed-off-by Rosen Penev <[email protected]>
There is this report from LKP:
https://lore.kernel.org/linux-usb/[email protected]/
Please fix and resend.