[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <202510310145.tlVMfaP8-lkp@intel.com>
Date: Fri, 31 Oct 2025 02:06:27 +0800
From: kernel test robot <lkp@...el.com>
To: Haotian Zhang <vulab@...as.ac.cn>, Lee Jones <lee@...nel.org>,
Pavel Machek <pavel@...nel.org>, Markus.Elfring@....de
Cc: oe-kbuild-all@...ts.linux.dev, linux-leds@...r.kernel.org,
linux-kernel@...r.kernel.org, Haotian Zhang <vulab@...as.ac.cn>
Subject: Re: [PATCH v2] leds: netxbig: fix GPIO descriptor leak in error paths
Hi Haotian,
kernel test robot noticed the following build warnings:
[auto build test WARNING on lee-leds/for-leds-next]
[also build test WARNING on linus/master v6.18-rc3 next-20251030]
[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/Haotian-Zhang/leds-netxbig-fix-GPIO-descriptor-leak-in-error-paths/20251030-105705
base: https://git.kernel.org/pub/scm/linux/kernel/git/lee/leds.git for-leds-next
patch link: https://lore.kernel.org/r/20251030025312.1623-1-vulab%40iscas.ac.cn
patch subject: [PATCH v2] leds: netxbig: fix GPIO descriptor leak in error paths
config: nios2-randconfig-r072-20251030 (https://download.01.org/0day-ci/archive/20251031/202510310145.tlVMfaP8-lkp@intel.com/config)
compiler: nios2-linux-gcc (GCC) 10.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251031/202510310145.tlVMfaP8-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@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510310145.tlVMfaP8-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/leds/leds-netxbig.c: In function 'netxbig_gpio_ext_get':
>> drivers/leds/leds-netxbig.c:428:1: warning: label 'err_free_data' defined but not used [-Wunused-label]
428 | err_free_data:
| ^~~~~~~~~~~~~
vim +/err_free_data +428 drivers/leds/leds-netxbig.c
335
336 /**
337 * netxbig_gpio_ext_get() - Obtain GPIO extension device data
338 * @dev: main LED device
339 * @gpio_ext_dev: the GPIO extension device
340 * @gpio_ext: the data structure holding the GPIO extension data
341 *
342 * This function walks the subdevice that only contain GPIO line
343 * handles in the device tree and obtains the GPIO descriptors from that
344 * device.
345 */
346 static int netxbig_gpio_ext_get(struct device *dev,
347 struct device *gpio_ext_dev,
348 struct netxbig_gpio_ext *gpio_ext)
349 {
350 struct gpio_desc **addr, **data;
351 int num_addr, num_data;
352 struct gpio_desc *gpiod;
353 int ret;
354 int i;
355
356 ret = gpiod_count(gpio_ext_dev, "addr");
357 if (ret < 0) {
358 dev_err(dev,
359 "Failed to count GPIOs in DT property addr-gpios\n");
360 return ret;
361 }
362 num_addr = ret;
363 addr = devm_kcalloc(dev, num_addr, sizeof(*addr), GFP_KERNEL);
364 if (!addr)
365 return -ENOMEM;
366
367 gpio_ext->addr = addr;
368 gpio_ext->num_addr = 0;
369
370 /*
371 * We cannot use devm_ managed resources with these GPIO descriptors
372 * since they are associated with the "GPIO extension device" which
373 * does not probe any driver. The device tree parser will however
374 * populate a platform device for it so we can anyway obtain the
375 * GPIO descriptors from the device.
376 */
377 for (i = 0; i < num_addr; i++) {
378 gpiod = gpiod_get_index(gpio_ext_dev, "addr", i,
379 GPIOD_OUT_LOW);
380 if (IS_ERR(gpiod)) {
381 ret = PTR_ERR(gpiod);
382 goto err_free_addr;
383 }
384 gpiod_set_consumer_name(gpiod, "GPIO extension addr");
385 addr[i] = gpiod;
386 gpio_ext->num_addr++;
387 }
388
389 ret = gpiod_count(gpio_ext_dev, "data");
390 if (ret < 0) {
391 dev_err(dev,
392 "Failed to count GPIOs in DT property data-gpios\n");
393 goto err_free_addr;
394 }
395 num_data = ret;
396 data = devm_kcalloc(dev, num_data, sizeof(*data), GFP_KERNEL);
397 if (!data) {
398 ret = -ENOMEM;
399 goto err_free_addr;
400 }
401
402 gpio_ext->data = data;
403 gpio_ext->num_data = 0;
404
405 for (i = 0; i < num_data; i++) {
406 gpiod = gpiod_get_index(gpio_ext_dev, "data", i,
407 GPIOD_OUT_LOW);
408 if (IS_ERR(gpiod))
409 goto err_gpiod_put;
410 gpiod_set_consumer_name(gpiod, "GPIO extension data");
411 data[i] = gpiod;
412 gpio_ext->num_data++;
413 }
414
415 gpiod = gpiod_get(gpio_ext_dev, "enable", GPIOD_OUT_LOW);
416 if (IS_ERR(gpiod)) {
417 dev_err(dev,
418 "Failed to get GPIO from DT property enable-gpio\n");
419 goto err_gpiod_put;
420 }
421 gpiod_set_consumer_name(gpiod, "GPIO extension enable");
422 gpio_ext->enable = gpiod;
423
424 return devm_add_action_or_reset(dev, netxbig_gpio_ext_remove, gpio_ext);
425
426 err_gpiod_put:
427 ret = PTR_ERR(gpiod);
> 428 err_free_data:
429 for (i = 0; i < gpio_ext->num_data; i++)
430 gpiod_put(gpio_ext->data[i]);
431 err_free_addr:
432 for (i = 0; i < gpio_ext->num_addr; i++)
433 gpiod_put(gpio_ext->addr[i]);
434 return ret;
435 }
436
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Powered by blists - more mailing lists