Messages in this thread | | | Date | Thu, 24 Feb 2022 18:02:38 +0300 | From | Dan Carpenter <> | Subject | [chenxing:msc313_mainlining 46/93] drivers/gpio/gpiolib.c:1166 gpiochip_hierarchy_irq_domain_alloc() warn: variable dereferenced before check 'd->parent' (see line 1155) |
| |
tree: git://github.com/linux-chenxing/linux.git msc313_mainlining head: 99a396728dcff78ca3eddcbd2085f11eeb8a01b8 commit: b1c18474d73ad17638f8369a7e8be6582a12c1ee [46/93] gpiolib: Move setting the flow handler and don't set it at all if there is a parent domain config: x86_64-randconfig-m001-20220221 (https://download.01.org/0day-ci/archive/20220224/202202240817.tUm7FhAK-lkp@intel.com/config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings: drivers/gpio/gpiolib.c:1166 gpiochip_hierarchy_irq_domain_alloc() warn: variable dereferenced before check 'd->parent' (see line 1155)
vim +1166 drivers/gpio/gpiolib.c
fdd61a013a24f2 Linus Walleij 2019-08-08 1107 static int gpiochip_hierarchy_irq_domain_alloc(struct irq_domain *d, fdd61a013a24f2 Linus Walleij 2019-08-08 1108 unsigned int irq, fdd61a013a24f2 Linus Walleij 2019-08-08 1109 unsigned int nr_irqs, fdd61a013a24f2 Linus Walleij 2019-08-08 1110 void *data) fdd61a013a24f2 Linus Walleij 2019-08-08 1111 { fdd61a013a24f2 Linus Walleij 2019-08-08 1112 struct gpio_chip *gc = d->host_data; fdd61a013a24f2 Linus Walleij 2019-08-08 1113 irq_hw_number_t hwirq; fdd61a013a24f2 Linus Walleij 2019-08-08 1114 unsigned int type = IRQ_TYPE_NONE; fdd61a013a24f2 Linus Walleij 2019-08-08 1115 struct irq_fwspec *fwspec = data; 24258761671057 Kevin Hao 2020-01-14 1116 void *parent_arg; fdd61a013a24f2 Linus Walleij 2019-08-08 1117 unsigned int parent_hwirq; fdd61a013a24f2 Linus Walleij 2019-08-08 1118 unsigned int parent_type; fdd61a013a24f2 Linus Walleij 2019-08-08 1119 struct gpio_irq_chip *girq = &gc->irq; fdd61a013a24f2 Linus Walleij 2019-08-08 1120 int ret; fdd61a013a24f2 Linus Walleij 2019-08-08 1121 fdd61a013a24f2 Linus Walleij 2019-08-08 1122 /* fdd61a013a24f2 Linus Walleij 2019-08-08 1123 * The nr_irqs parameter is always one except for PCI multi-MSI fdd61a013a24f2 Linus Walleij 2019-08-08 1124 * so this should not happen. fdd61a013a24f2 Linus Walleij 2019-08-08 1125 */ fdd61a013a24f2 Linus Walleij 2019-08-08 1126 WARN_ON(nr_irqs != 1); fdd61a013a24f2 Linus Walleij 2019-08-08 1127 fdd61a013a24f2 Linus Walleij 2019-08-08 1128 ret = gc->irq.child_irq_domain_ops.translate(d, fwspec, &hwirq, &type); fdd61a013a24f2 Linus Walleij 2019-08-08 1129 if (ret) fdd61a013a24f2 Linus Walleij 2019-08-08 1130 return ret; fdd61a013a24f2 Linus Walleij 2019-08-08 1131 366950eeb6ee7b Kevin Hao 2020-01-20 1132 chip_dbg(gc, "allocate IRQ %d, hwirq %lu\n", irq, hwirq); fdd61a013a24f2 Linus Walleij 2019-08-08 1133 fdd61a013a24f2 Linus Walleij 2019-08-08 1134 ret = girq->child_to_parent_hwirq(gc, hwirq, type, fdd61a013a24f2 Linus Walleij 2019-08-08 1135 &parent_hwirq, &parent_type); fdd61a013a24f2 Linus Walleij 2019-08-08 1136 if (ret) { fdd61a013a24f2 Linus Walleij 2019-08-08 1137 chip_err(gc, "can't look up hwirq %lu\n", hwirq); fdd61a013a24f2 Linus Walleij 2019-08-08 1138 return ret; fdd61a013a24f2 Linus Walleij 2019-08-08 1139 } 366950eeb6ee7b Kevin Hao 2020-01-20 1140 chip_dbg(gc, "found parent hwirq %u\n", parent_hwirq); fdd61a013a24f2 Linus Walleij 2019-08-08 1141 fdd61a013a24f2 Linus Walleij 2019-08-08 1142 /* This parent only handles asserted level IRQs */ 24258761671057 Kevin Hao 2020-01-14 1143 parent_arg = girq->populate_parent_alloc_arg(gc, parent_hwirq, parent_type); 24258761671057 Kevin Hao 2020-01-14 1144 if (!parent_arg) 24258761671057 Kevin Hao 2020-01-14 1145 return -ENOMEM; 24258761671057 Kevin Hao 2020-01-14 1146 366950eeb6ee7b Kevin Hao 2020-01-20 1147 chip_dbg(gc, "alloc_irqs_parent for %d parent hwirq %d\n", fdd61a013a24f2 Linus Walleij 2019-08-08 1148 irq, parent_hwirq); c34f6dc8c9e6bb Stephen Boyd 2020-01-14 1149 irq_set_lockdep_class(irq, gc->irq.lock_key, gc->irq.request_key); 24258761671057 Kevin Hao 2020-01-14 1150 ret = irq_domain_alloc_irqs_parent(d, irq, 1, parent_arg); 880b7cf22e8ca0 Kevin Hao 2020-01-14 1151 /* 880b7cf22e8ca0 Kevin Hao 2020-01-14 1152 * If the parent irqdomain is msi, the interrupts have already 880b7cf22e8ca0 Kevin Hao 2020-01-14 1153 * been allocated, so the EEXIST is good. 880b7cf22e8ca0 Kevin Hao 2020-01-14 1154 */ 880b7cf22e8ca0 Kevin Hao 2020-01-14 @1155 if (irq_domain_is_msi(d->parent) && (ret == -EEXIST)) ^^^^^^^^^ Unchecked dereference
880b7cf22e8ca0 Kevin Hao 2020-01-14 1156 ret = 0; fdd61a013a24f2 Linus Walleij 2019-08-08 1157 if (ret) fdd61a013a24f2 Linus Walleij 2019-08-08 1158 chip_err(gc, fdd61a013a24f2 Linus Walleij 2019-08-08 1159 "failed to allocate parent hwirq %d for hwirq %lu\n", fdd61a013a24f2 Linus Walleij 2019-08-08 1160 parent_hwirq, hwirq); fdd61a013a24f2 Linus Walleij 2019-08-08 1161 24258761671057 Kevin Hao 2020-01-14 1162 kfree(parent_arg); b1c18474d73ad1 Daniel Palmer 2021-09-30 1163 b1c18474d73ad1 Daniel Palmer 2021-09-30 1164 if (!ret) { b1c18474d73ad1 Daniel Palmer 2021-09-30 1165 /* If there is a parent domain leave the flow handler alone */ b1c18474d73ad1 Daniel Palmer 2021-09-30 @1166 if (d->parent) ^^^^^^^^^ Checked too late
b1c18474d73ad1 Daniel Palmer 2021-09-30 1167 irq_domain_set_hwirq_and_chip(d, b1c18474d73ad1 Daniel Palmer 2021-09-30 1168 irq, b1c18474d73ad1 Daniel Palmer 2021-09-30 1169 hwirq, b1c18474d73ad1 Daniel Palmer 2021-09-30 1170 gc->irq.chip, b1c18474d73ad1 Daniel Palmer 2021-09-30 1171 gc); b1c18474d73ad1 Daniel Palmer 2021-09-30 1172 /* Otherwise set the flow handler supplied by the gpio driver */ b1c18474d73ad1 Daniel Palmer 2021-09-30 1173 else b1c18474d73ad1 Daniel Palmer 2021-09-30 1174 irq_domain_set_info(d, b1c18474d73ad1 Daniel Palmer 2021-09-30 1175 irq, b1c18474d73ad1 Daniel Palmer 2021-09-30 1176 hwirq, b1c18474d73ad1 Daniel Palmer 2021-09-30 1177 gc->irq.chip, b1c18474d73ad1 Daniel Palmer 2021-09-30 1178 gc, b1c18474d73ad1 Daniel Palmer 2021-09-30 1179 girq->handler, b1c18474d73ad1 Daniel Palmer 2021-09-30 1180 NULL, NULL); b1c18474d73ad1 Daniel Palmer 2021-09-30 1181 irq_set_probe(irq); b1c18474d73ad1 Daniel Palmer 2021-09-30 1182 } b1c18474d73ad1 Daniel Palmer 2021-09-30 1183 fdd61a013a24f2 Linus Walleij 2019-08-08 1184 return ret; fdd61a013a24f2 Linus Walleij 2019-08-08 1185 }
--- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
| |