public inbox for linux-usb@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] thunderbolt: use kzalloc_flex
@ 2026-03-11 23:22 Rosen Penev
  2026-03-12 10:07 ` kernel test robot
  2026-03-16 11:26 ` Mika Westerberg
  0 siblings, 2 replies; 3+ messages in thread
From: Rosen Penev @ 2026-03-11 23:22 UTC (permalink / raw)
  To: linux-usb
  Cc: Andreas Noever, Mika Westerberg, Yehezkel Bernat, Kees Cook,
	Gustavo A. R. Silva, open list,
	open list:KERNEL HARDENING (not covered by other areas):Keyword:b__counted_by(_le|_be)?b

Simplifies allocation by using a flexible arraay member.

Added __counted_by for extra runtime analysis.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 drivers/thunderbolt/path.c | 24 ++++++------------------
 drivers/thunderbolt/tb.h   |  3 ++-
 2 files changed, 8 insertions(+), 19 deletions(-)

diff --git a/drivers/thunderbolt/path.c b/drivers/thunderbolt/path.c
index 22fb4a1e1acd..3af5d263ac74 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) {
@@ -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);
 }
 
diff --git a/drivers/thunderbolt/tb.h b/drivers/thunderbolt/tb.h
index e96474f17067..4e66b53860dd 100644
--- a/drivers/thunderbolt/tb.h
+++ b/drivers/thunderbolt/tb.h
@@ -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


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] thunderbolt: use kzalloc_flex
  2026-03-11 23:22 [PATCH] thunderbolt: use kzalloc_flex Rosen Penev
@ 2026-03-12 10:07 ` kernel test robot
  2026-03-16 11:26 ` Mika Westerberg
  1 sibling, 0 replies; 3+ messages in thread
From: kernel test robot @ 2026-03-12 10:07 UTC (permalink / raw)
  To: Rosen Penev, linux-usb

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/202603121824.MZubfxH0-lkp@intel.com/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/202603121824.MZubfxH0-lkp@intel.com/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 <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603121824.MZubfxH0-lkp@intel.com/

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;
         |                             ^
         |                              = NULL
   2 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  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] thunderbolt: use kzalloc_flex
  2026-03-11 23:22 [PATCH] thunderbolt: use kzalloc_flex Rosen Penev
  2026-03-12 10:07 ` kernel test robot
@ 2026-03-16 11:26 ` Mika Westerberg
  1 sibling, 0 replies; 3+ messages in thread
From: Mika Westerberg @ 2026-03-16 11:26 UTC (permalink / raw)
  To: Rosen Penev
  Cc: linux-usb, Andreas Noever, Mika Westerberg, Yehezkel Bernat,
	Kees Cook, Gustavo A. R. Silva, open list,
	open list:KERNEL HARDENING (not covered by other areas):Keyword:b__counted_by(_le|_be)?b

Hi Penev,

On Wed, Mar 11, 2026 at 04:22:05PM -0700, Rosen Penev wrote:
> Simplifies allocation by using a flexible arraay member.
> 
> Added __counted_by for extra runtime analysis.
> 
> Signed-off-by: Rosen Penev <rosenp@gmail.com>

There is this report from LKP:

https://lore.kernel.org/linux-usb/202603121824.MZubfxH0-lkp@intel.com/

Please fix and resend.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-03-16 11:26 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-11 23:22 [PATCH] thunderbolt: use kzalloc_flex Rosen Penev
2026-03-12 10:07 ` kernel test robot
2026-03-16 11:26 ` Mika Westerberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox