diff mbox series

[v2,13/14] irqchip/s3c24xx: Fix potential resource leaks

Message ID 1592980367-1816-14-git-send-email-yangtiezhu@loongson.cn (mailing list archive)
State Not Applicable
Headers show
Series irqchip: Fix potential resource leaks | expand

Commit Message

Tiezhu Yang June 24, 2020, 6:32 a.m. UTC
There exists potential resource leaks in the error path, fix them.

Fixes: f0774d41da0e ("irqchip: s3c24xx: add devicetree support")
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
---
 drivers/irqchip/irq-s3c24xx.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

Comments

kernel test robot June 24, 2020, 10:38 p.m. UTC | #1
Hi Tiezhu,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v5.8-rc2 next-20200624]
[cannot apply to tip/irq/core omap/for-next xlnx/master arm-jcooper/irqchip/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Tiezhu-Yang/irqchip-Fix-potential-resource-leaks/20200624-144653
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 3e08a95294a4fb3702bb3d35ed08028433c37fe6
config: arm-randconfig-r012-20200624 (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All error/warnings (new ones prefixed by >>):

   drivers/irqchip/irq-s3c24xx.c:359:39: warning: no previous prototype for 's3c24xx_handle_irq' [-Wmissing-prototypes]
     359 | asmlinkage void __exception_irq_entry s3c24xx_handle_irq(struct pt_regs *regs)
         |                                       ^~~~~~~~~~~~~~~~~~
   drivers/irqchip/irq-s3c24xx.c:776:13: warning: no previous prototype for 's3c2412_init_irq' [-Wmissing-prototypes]
     776 | void __init s3c2412_init_irq(void)
         |             ^~~~~~~~~~~~~~~~
   drivers/irqchip/irq-s3c24xx.c:875:13: warning: no previous prototype for 's3c2416_init_irq' [-Wmissing-prototypes]
     875 | void __init s3c2416_init_irq(void)
         |             ^~~~~~~~~~~~~~~~
   drivers/irqchip/irq-s3c24xx.c:954:13: warning: no previous prototype for 's3c2440_init_irq' [-Wmissing-prototypes]
     954 | void __init s3c2440_init_irq(void)
         |             ^~~~~~~~~~~~~~~~
   drivers/irqchip/irq-s3c24xx.c: In function 's3c_init_intc_of':
>> drivers/irqchip/irq-s3c24xx.c:1242:3: error: 'ret' undeclared (first use in this function)
    1242 |   ret = -EINVAL;
         |   ^~~
   drivers/irqchip/irq-s3c24xx.c:1242:3: note: each undeclared identifier is reported only once for each function it appears in
   drivers/irqchip/irq-s3c24xx.c: At top level:
   drivers/irqchip/irq-s3c24xx.c:1311:12: warning: no previous prototype for 's3c2410_init_intc_of' [-Wmissing-prototypes]
    1311 | int __init s3c2410_init_intc_of(struct device_node *np,
         |            ^~~~~~~~~~~~~~~~~~~~
   drivers/irqchip/irq-s3c24xx.c:1333:12: warning: no previous prototype for 's3c2416_init_intc_of' [-Wmissing-prototypes]
    1333 | int __init s3c2416_init_intc_of(struct device_node *np,
         |            ^~~~~~~~~~~~~~~~~~~~
   drivers/irqchip/irq-s3c24xx.c: In function 's3c_init_intc_of':
>> drivers/irqchip/irq-s3c24xx.c:1298:1: warning: control reaches end of non-void function [-Wreturn-type]
    1298 | }
         | ^

vim +/ret +1242 drivers/irqchip/irq-s3c24xx.c

  1221	
  1222	static int __init s3c_init_intc_of(struct device_node *np,
  1223				struct device_node *interrupt_parent,
  1224				struct s3c24xx_irq_of_ctrl *s3c_ctrl, int num_ctrl)
  1225	{
  1226		struct s3c_irq_intc *intc;
  1227		struct s3c24xx_irq_of_ctrl *ctrl;
  1228		struct irq_domain *domain;
  1229		void __iomem *reg_base;
  1230		int i;
  1231	
  1232		reg_base = of_iomap(np, 0);
  1233		if (!reg_base) {
  1234			pr_err("irq-s3c24xx: could not map irq registers\n");
  1235			return -EINVAL;
  1236		}
  1237	
  1238		domain = irq_domain_add_linear(np, num_ctrl * 32,
  1239							     &s3c24xx_irq_ops_of, NULL);
  1240		if (!domain) {
  1241			pr_err("irq: could not create irq-domain\n");
> 1242			ret = -EINVAL;
  1243			goto out_iounmap;
  1244		}
  1245	
  1246		for (i = 0; i < num_ctrl; i++) {
  1247			ctrl = &s3c_ctrl[i];
  1248	
  1249			pr_debug("irq: found controller %s\n", ctrl->name);
  1250	
  1251			intc = kzalloc(sizeof(struct s3c_irq_intc), GFP_KERNEL);
  1252			if (!intc) {
  1253				ret = -ENOMEM;
  1254				goto out_domain_remove;
  1255			}
  1256	
  1257			intc->domain = domain;
  1258			intc->irqs = kcalloc(32, sizeof(struct s3c_irq_data),
  1259					     GFP_KERNEL);
  1260			if (!intc->irqs) {
  1261				ret = -ENOMEM;
  1262				goto out_free;
  1263			}
  1264	
  1265			if (ctrl->parent) {
  1266				intc->reg_pending = reg_base + ctrl->offset;
  1267				intc->reg_mask = reg_base + ctrl->offset + 0x4;
  1268	
  1269				if (*(ctrl->parent)) {
  1270					intc->parent = *(ctrl->parent);
  1271				} else {
  1272					pr_warn("irq: parent of %s missing\n",
  1273						ctrl->name);
  1274					kfree(intc->irqs);
  1275					kfree(intc);
  1276					continue;
  1277				}
  1278			} else {
  1279				intc->reg_pending = reg_base + ctrl->offset;
  1280				intc->reg_mask = reg_base + ctrl->offset + 0x08;
  1281				intc->reg_intpnd = reg_base + ctrl->offset + 0x10;
  1282			}
  1283	
  1284			s3c24xx_clear_intc(intc);
  1285			s3c_intc[i] = intc;
  1286		}
  1287	
  1288		set_handle_irq(s3c24xx_handle_irq);
  1289	
  1290		return 0;
  1291	
  1292	out_free:
  1293		kfree(intc);
  1294	out_domain_remove:
  1295		irq_domain_remove(domain);
  1296	out_iounmap:
  1297		iounmap(reg_base);
> 1298	}
  1299	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
kernel test robot June 25, 2020, 2:17 p.m. UTC | #2
Hi Tiezhu,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v5.8-rc2 next-20200624]
[cannot apply to tip/irq/core omap/for-next xlnx/master arm-jcooper/irqchip/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Tiezhu-Yang/irqchip-Fix-potential-resource-leaks/20200624-144653
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 3e08a95294a4fb3702bb3d35ed08028433c37fe6
config: arm-randconfig-r035-20200624 (attached as .config)
compiler: clang version 11.0.0 (https://github.com/llvm/llvm-project 1d4c87335d5236ea1f35937e1014980ba961ae34)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install arm cross compiling tool for clang build
        # apt-get install binutils-arm-linux-gnueabi
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from arch/arm/include/asm/io.h:438:
   include/asm-generic/io.h:676:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           insl(addr, buffer, count);
           ^~~~~~~~~~~~~~~~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:206:34: note: expanded from macro 'insl'
   #define insl(p,d,l)     __raw_readsl(__ioaddr(p),d,l)
                                        ^~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:202:65: note: expanded from macro '__ioaddr'
   #define __ioaddr(p)     (__builtin_constant_p((p)) ? __ioaddr(p)  : __ioaddrc(p))
                                                                       ^~~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:194:86: note: expanded from macro '__ioaddrc'
   #define __ioaddrc(port) ((__PORT_PCIO(port) ? PCIO_BASE + (port) : (void __iomem *)0 + (port)))
                                                                      ~~~~~~~~~~~~~~~~~ ^
   In file included from drivers/irqchip/irq-s3c24xx.c:13:
   In file included from include/linux/io.h:13:
   In file included from arch/arm/include/asm/io.h:438:
   include/asm-generic/io.h:685:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           outsb(addr, buffer, count);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:208:36: note: expanded from macro 'outsb'
   #define outsb(p,d,l)    __raw_writesb(__ioaddr(p),d,l)
                                         ^~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:202:65: note: expanded from macro '__ioaddr'
   #define __ioaddr(p)     (__builtin_constant_p((p)) ? __ioaddr(p)  : __ioaddrc(p))
                                                                       ^~~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:194:86: note: expanded from macro '__ioaddrc'
   #define __ioaddrc(port) ((__PORT_PCIO(port) ? PCIO_BASE + (port) : (void __iomem *)0 + (port)))
                                                                      ~~~~~~~~~~~~~~~~~ ^
   In file included from drivers/irqchip/irq-s3c24xx.c:13:
   In file included from include/linux/io.h:13:
   In file included from arch/arm/include/asm/io.h:438:
   include/asm-generic/io.h:694:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           outsw(addr, buffer, count);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:209:36: note: expanded from macro 'outsw'
   #define outsw(p,d,l)    __raw_writesw(__ioaddr(p),d,l)
                                         ^~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:202:65: note: expanded from macro '__ioaddr'
   #define __ioaddr(p)     (__builtin_constant_p((p)) ? __ioaddr(p)  : __ioaddrc(p))
                                                                       ^~~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:194:86: note: expanded from macro '__ioaddrc'
   #define __ioaddrc(port) ((__PORT_PCIO(port) ? PCIO_BASE + (port) : (void __iomem *)0 + (port)))
                                                                      ~~~~~~~~~~~~~~~~~ ^
   In file included from drivers/irqchip/irq-s3c24xx.c:13:
   In file included from include/linux/io.h:13:
   In file included from arch/arm/include/asm/io.h:438:
   include/asm-generic/io.h:703:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           outsl(addr, buffer, count);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:210:36: note: expanded from macro 'outsl'
   #define outsl(p,d,l)    __raw_writesl(__ioaddr(p),d,l)
                                         ^~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:202:65: note: expanded from macro '__ioaddr'
   #define __ioaddr(p)     (__builtin_constant_p((p)) ? __ioaddr(p)  : __ioaddrc(p))
                                                                       ^~~~~~~~~~~~
   arch/arm/mach-s3c24xx/include/mach/io.h:194:86: note: expanded from macro '__ioaddrc'
   #define __ioaddrc(port) ((__PORT_PCIO(port) ? PCIO_BASE + (port) : (void __iomem *)0 + (port)))
                                                                      ~~~~~~~~~~~~~~~~~ ^
   drivers/irqchip/irq-s3c24xx.c:359:39: warning: no previous prototype for function 's3c24xx_handle_irq' [-Wmissing-prototypes]
   asmlinkage void __exception_irq_entry s3c24xx_handle_irq(struct pt_regs *regs)
                                         ^
   drivers/irqchip/irq-s3c24xx.c:359:12: note: declare 'static' if the function is not intended to be used outside of this translation unit
   asmlinkage void __exception_irq_entry s3c24xx_handle_irq(struct pt_regs *regs)
              ^
              static 
   drivers/irqchip/irq-s3c24xx.c:676:13: warning: no previous prototype for function 's3c2410_init_irq' [-Wmissing-prototypes]
   void __init s3c2410_init_irq(void)
               ^
   drivers/irqchip/irq-s3c24xx.c:676:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   void __init s3c2410_init_irq(void)
   ^
   static 
   drivers/irqchip/irq-s3c24xx.c:776:13: warning: no previous prototype for function 's3c2412_init_irq' [-Wmissing-prototypes]
   void __init s3c2412_init_irq(void)
               ^
   drivers/irqchip/irq-s3c24xx.c:776:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   void __init s3c2412_init_irq(void)
   ^
   static 
   drivers/irqchip/irq-s3c24xx.c:875:13: warning: no previous prototype for function 's3c2416_init_irq' [-Wmissing-prototypes]
   void __init s3c2416_init_irq(void)
               ^
   drivers/irqchip/irq-s3c24xx.c:875:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   void __init s3c2416_init_irq(void)
   ^
   static 
   drivers/irqchip/irq-s3c24xx.c:954:13: warning: no previous prototype for function 's3c2440_init_irq' [-Wmissing-prototypes]
   void __init s3c2440_init_irq(void)
               ^
   drivers/irqchip/irq-s3c24xx.c:954:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   void __init s3c2440_init_irq(void)
   ^
   static 
   drivers/irqchip/irq-s3c24xx.c:1117:13: warning: no previous prototype for function 's3c2443_init_irq' [-Wmissing-prototypes]
   void __init s3c2443_init_irq(void)
               ^
   drivers/irqchip/irq-s3c24xx.c:1117:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   void __init s3c2443_init_irq(void)
   ^
   static 
>> drivers/irqchip/irq-s3c24xx.c:1242:3: error: use of undeclared identifier 'ret'
                   ret = -EINVAL;
                   ^
   drivers/irqchip/irq-s3c24xx.c:1253:4: error: use of undeclared identifier 'ret'
                           ret = -ENOMEM;
                           ^
   drivers/irqchip/irq-s3c24xx.c:1261:4: error: use of undeclared identifier 'ret'
                           ret = -ENOMEM;
                           ^
   drivers/irqchip/irq-s3c24xx.c:1311:12: warning: no previous prototype for function 's3c2410_init_intc_of' [-Wmissing-prototypes]
   int __init s3c2410_init_intc_of(struct device_node *np,
              ^
   drivers/irqchip/irq-s3c24xx.c:1311:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   int __init s3c2410_init_intc_of(struct device_node *np,
   ^
   static 
   drivers/irqchip/irq-s3c24xx.c:1333:12: warning: no previous prototype for function 's3c2416_init_intc_of' [-Wmissing-prototypes]
   int __init s3c2416_init_intc_of(struct device_node *np,
              ^
   drivers/irqchip/irq-s3c24xx.c:1333:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   int __init s3c2416_init_intc_of(struct device_node *np,
   ^
   static 
   14 warnings and 3 errors generated.

vim +/ret +1242 drivers/irqchip/irq-s3c24xx.c

  1116	
> 1117	void __init s3c2443_init_irq(void)
  1118	{
  1119		pr_info("S3C2443: IRQ Support\n");
  1120	
  1121	#ifdef CONFIG_FIQ
  1122		init_FIQ(FIQ_START);
  1123	#endif
  1124	
  1125		s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2443base[0], NULL,
  1126						0x4a000000);
  1127		if (IS_ERR(s3c_intc[0])) {
  1128			pr_err("irq: could not create main interrupt controller\n");
  1129			return;
  1130		}
  1131	
  1132		s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4);
  1133		s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2443subint[0],
  1134						s3c_intc[0], 0x4a000018);
  1135	}
  1136	#endif
  1137	
  1138	#ifdef CONFIG_OF
  1139	static int s3c24xx_irq_map_of(struct irq_domain *h, unsigned int virq,
  1140								irq_hw_number_t hw)
  1141	{
  1142		unsigned int ctrl_num = hw / 32;
  1143		unsigned int intc_hw = hw % 32;
  1144		struct s3c_irq_intc *intc = s3c_intc[ctrl_num];
  1145		struct s3c_irq_intc *parent_intc = intc->parent;
  1146		struct s3c_irq_data *irq_data = &intc->irqs[intc_hw];
  1147	
  1148		/* attach controller pointer to irq_data */
  1149		irq_data->intc = intc;
  1150		irq_data->offset = intc_hw;
  1151	
  1152		if (!parent_intc)
  1153			irq_set_chip_and_handler(virq, &s3c_irq_chip, handle_edge_irq);
  1154		else
  1155			irq_set_chip_and_handler(virq, &s3c_irq_level_chip,
  1156						 handle_edge_irq);
  1157	
  1158		irq_set_chip_data(virq, irq_data);
  1159	
  1160		return 0;
  1161	}
  1162	
  1163	/* Translate our of irq notation
  1164	 * format: <ctrl_num ctrl_irq parent_irq type>
  1165	 */
  1166	static int s3c24xx_irq_xlate_of(struct irq_domain *d, struct device_node *n,
  1167				const u32 *intspec, unsigned int intsize,
  1168				irq_hw_number_t *out_hwirq, unsigned int *out_type)
  1169	{
  1170		struct s3c_irq_intc *intc;
  1171		struct s3c_irq_intc *parent_intc;
  1172		struct s3c_irq_data *irq_data;
  1173		struct s3c_irq_data *parent_irq_data;
  1174		int irqno;
  1175	
  1176		if (WARN_ON(intsize < 4))
  1177			return -EINVAL;
  1178	
  1179		if (intspec[0] > 2 || !s3c_intc[intspec[0]]) {
  1180			pr_err("controller number %d invalid\n", intspec[0]);
  1181			return -EINVAL;
  1182		}
  1183		intc = s3c_intc[intspec[0]];
  1184	
  1185		*out_hwirq = intspec[0] * 32 + intspec[2];
  1186		*out_type = intspec[3] & IRQ_TYPE_SENSE_MASK;
  1187	
  1188		parent_intc = intc->parent;
  1189		if (parent_intc) {
  1190			irq_data = &intc->irqs[intspec[2]];
  1191			irq_data->parent_irq = intspec[1];
  1192			parent_irq_data = &parent_intc->irqs[irq_data->parent_irq];
  1193			parent_irq_data->sub_intc = intc;
  1194			parent_irq_data->sub_bits |= (1UL << intspec[2]);
  1195	
  1196			/* parent_intc is always s3c_intc[0], so no offset */
  1197			irqno = irq_create_mapping(parent_intc->domain, intspec[1]);
  1198			if (irqno < 0) {
  1199				pr_err("irq: could not map parent interrupt\n");
  1200				return irqno;
  1201			}
  1202	
  1203			irq_set_chained_handler(irqno, s3c_irq_demux);
  1204		}
  1205	
  1206		return 0;
  1207	}
  1208	
  1209	static const struct irq_domain_ops s3c24xx_irq_ops_of = {
  1210		.map = s3c24xx_irq_map_of,
  1211		.xlate = s3c24xx_irq_xlate_of,
  1212	};
  1213	
  1214	struct s3c24xx_irq_of_ctrl {
  1215		char			*name;
  1216		unsigned long		offset;
  1217		struct s3c_irq_intc	**handle;
  1218		struct s3c_irq_intc	**parent;
  1219		struct irq_domain_ops	*ops;
  1220	};
  1221	
  1222	static int __init s3c_init_intc_of(struct device_node *np,
  1223				struct device_node *interrupt_parent,
  1224				struct s3c24xx_irq_of_ctrl *s3c_ctrl, int num_ctrl)
  1225	{
  1226		struct s3c_irq_intc *intc;
  1227		struct s3c24xx_irq_of_ctrl *ctrl;
  1228		struct irq_domain *domain;
  1229		void __iomem *reg_base;
  1230		int i;
  1231	
  1232		reg_base = of_iomap(np, 0);
  1233		if (!reg_base) {
  1234			pr_err("irq-s3c24xx: could not map irq registers\n");
  1235			return -EINVAL;
  1236		}
  1237	
  1238		domain = irq_domain_add_linear(np, num_ctrl * 32,
  1239							     &s3c24xx_irq_ops_of, NULL);
  1240		if (!domain) {
  1241			pr_err("irq: could not create irq-domain\n");
> 1242			ret = -EINVAL;
  1243			goto out_iounmap;
  1244		}
  1245	
  1246		for (i = 0; i < num_ctrl; i++) {
  1247			ctrl = &s3c_ctrl[i];
  1248	
  1249			pr_debug("irq: found controller %s\n", ctrl->name);
  1250	
  1251			intc = kzalloc(sizeof(struct s3c_irq_intc), GFP_KERNEL);
  1252			if (!intc) {
  1253				ret = -ENOMEM;
  1254				goto out_domain_remove;
  1255			}
  1256	
  1257			intc->domain = domain;
  1258			intc->irqs = kcalloc(32, sizeof(struct s3c_irq_data),
  1259					     GFP_KERNEL);
  1260			if (!intc->irqs) {
  1261				ret = -ENOMEM;
  1262				goto out_free;
  1263			}
  1264	
  1265			if (ctrl->parent) {
  1266				intc->reg_pending = reg_base + ctrl->offset;
  1267				intc->reg_mask = reg_base + ctrl->offset + 0x4;
  1268	
  1269				if (*(ctrl->parent)) {
  1270					intc->parent = *(ctrl->parent);
  1271				} else {
  1272					pr_warn("irq: parent of %s missing\n",
  1273						ctrl->name);
  1274					kfree(intc->irqs);
  1275					kfree(intc);
  1276					continue;
  1277				}
  1278			} else {
  1279				intc->reg_pending = reg_base + ctrl->offset;
  1280				intc->reg_mask = reg_base + ctrl->offset + 0x08;
  1281				intc->reg_intpnd = reg_base + ctrl->offset + 0x10;
  1282			}
  1283	
  1284			s3c24xx_clear_intc(intc);
  1285			s3c_intc[i] = intc;
  1286		}
  1287	
  1288		set_handle_irq(s3c24xx_handle_irq);
  1289	
  1290		return 0;
  1291	
  1292	out_free:
  1293		kfree(intc);
  1294	out_domain_remove:
  1295		irq_domain_remove(domain);
  1296	out_iounmap:
  1297		iounmap(reg_base);
  1298	}
  1299	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/irqchip/irq-s3c24xx.c b/drivers/irqchip/irq-s3c24xx.c
index d2031fe..ef5d645 100644
--- a/drivers/irqchip/irq-s3c24xx.c
+++ b/drivers/irqchip/irq-s3c24xx.c
@@ -1239,7 +1239,8 @@  static int __init s3c_init_intc_of(struct device_node *np,
 						     &s3c24xx_irq_ops_of, NULL);
 	if (!domain) {
 		pr_err("irq: could not create irq-domain\n");
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out_iounmap;
 	}
 
 	for (i = 0; i < num_ctrl; i++) {
@@ -1248,15 +1249,17 @@  static int __init s3c_init_intc_of(struct device_node *np,
 		pr_debug("irq: found controller %s\n", ctrl->name);
 
 		intc = kzalloc(sizeof(struct s3c_irq_intc), GFP_KERNEL);
-		if (!intc)
-			return -ENOMEM;
+		if (!intc) {
+			ret = -ENOMEM;
+			goto out_domain_remove;
+		}
 
 		intc->domain = domain;
 		intc->irqs = kcalloc(32, sizeof(struct s3c_irq_data),
 				     GFP_KERNEL);
 		if (!intc->irqs) {
-			kfree(intc);
-			return -ENOMEM;
+			ret = -ENOMEM;
+			goto out_free;
 		}
 
 		if (ctrl->parent) {
@@ -1285,6 +1288,13 @@  static int __init s3c_init_intc_of(struct device_node *np,
 	set_handle_irq(s3c24xx_handle_irq);
 
 	return 0;
+
+out_free:
+	kfree(intc);
+out_domain_remove:
+	irq_domain_remove(domain);
+out_iounmap:
+	iounmap(reg_base);
 }
 
 static struct s3c24xx_irq_of_ctrl s3c2410_ctrl[] = {