[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <202510310640.VxJ2qrj2-lkp@intel.com>
Date: Fri, 31 Oct 2025 06:29:55 +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: llvm@...ts.linux.dev, 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: sparc64-randconfig-002-20251031 (https://download.01.org/0day-ci/archive/20251031/202510310640.VxJ2qrj2-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project d1c086e82af239b245fe8d7832f2753436634990)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251031/202510310640.VxJ2qrj2-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/202510310640.VxJ2qrj2-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/leds/leds-netxbig.c:428:1: warning: unused label 'err_free_data' [-Wunused-label]
     428 | err_free_data:
         | ^~~~~~~~~~~~~~
   1 warning generated.
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
 
