Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'remotes/lorenzo/pci/misc'

- Exit pcitest with error code when test fails (Jean-Jacques Hiblot)

- Fix leaked of_node references in dra7xx, uniphier, layerscape,
rockchip, aardvark, iproc, mediatek, rpadlpar (Wen Yang)

- Fix pcitest "help" option parsing (Kishon Vijay Abraham I)

- Fix Makefile bug that inadvertently removes pcitest.sh (Kishon Vijay
Abraham I)

- Check for alloc_workqueue() failure in endpoint test driver (Kangjie
Lu)

* remotes/lorenzo/pci/misc:
PCI: endpoint: Fix a potential NULL pointer dereference
tools: PCI: Handle pcitest.sh independently from pcitest
tools: PCI: Add 'h' in optstring of getopt()
PCI: mediatek: Fix a leaked reference by adding missing of_node_put()
PCI: iproc: Fix a leaked reference by adding missing of_node_put()
PCI: aardvark: Fix a leaked reference by adding missing of_node_put()
PCI: rockchip: Fix a leaked reference by adding missing of_node_put()
PCI: dwc: layerscape: Fix a leaked reference by adding missing of_node_put()
PCI: uniphier: Fix a leaked reference by adding missing of_node_put()
PCI: dwc: pci-dra7xx: Fix a leaked reference by adding missing of_node_put()
tools: PCI: Exit with error code when test fails

+42 -15
+1
drivers/pci/controller/dwc/pci-dra7xx.c
··· 247 247 248 248 dra7xx->irq_domain = irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, 249 249 &intx_domain_ops, pp); 250 + of_node_put(pcie_intc_node); 250 251 if (!dra7xx->irq_domain) { 251 252 dev_err(dev, "Failed to get a INTx IRQ domain\n"); 252 253 return -ENODEV;
+1
drivers/pci/controller/dwc/pci-layerscape.c
··· 201 201 return -EINVAL; 202 202 } 203 203 204 + of_node_put(msi_node); 204 205 return 0; 205 206 } 206 207
+8 -3
drivers/pci/controller/dwc/pcie-uniphier.c
··· 270 270 struct uniphier_pcie_priv *priv = to_uniphier_pcie(pci); 271 271 struct device_node *np = pci->dev->of_node; 272 272 struct device_node *np_intc; 273 + int ret = 0; 273 274 274 275 np_intc = of_get_child_by_name(np, "legacy-interrupt-controller"); 275 276 if (!np_intc) { ··· 281 280 pp->irq = irq_of_parse_and_map(np_intc, 0); 282 281 if (!pp->irq) { 283 282 dev_err(pci->dev, "Failed to get an IRQ entry in legacy-interrupt-controller\n"); 284 - return -EINVAL; 283 + ret = -EINVAL; 284 + goto out_put_node; 285 285 } 286 286 287 287 priv->legacy_irq_domain = irq_domain_add_linear(np_intc, PCI_NUM_INTX, 288 288 &uniphier_intx_domain_ops, pp); 289 289 if (!priv->legacy_irq_domain) { 290 290 dev_err(pci->dev, "Failed to get INTx domain\n"); 291 - return -ENODEV; 291 + ret = -ENODEV; 292 + goto out_put_node; 292 293 } 293 294 294 295 irq_set_chained_handler_and_data(pp->irq, uniphier_pcie_irq_handler, 295 296 pp); 296 297 297 - return 0; 298 + out_put_node: 299 + of_node_put(np_intc); 300 + return ret; 298 301 } 299 302 300 303 static int uniphier_pcie_host_init(struct pcie_port *pp)
+8 -5
drivers/pci/controller/pci-aardvark.c
··· 794 794 struct device_node *node = dev->of_node; 795 795 struct device_node *pcie_intc_node; 796 796 struct irq_chip *irq_chip; 797 + int ret = 0; 797 798 798 799 pcie_intc_node = of_get_next_child(node, NULL); 799 800 if (!pcie_intc_node) { ··· 807 806 irq_chip->name = devm_kasprintf(dev, GFP_KERNEL, "%s-irq", 808 807 dev_name(dev)); 809 808 if (!irq_chip->name) { 810 - of_node_put(pcie_intc_node); 811 - return -ENOMEM; 809 + ret = -ENOMEM; 810 + goto out_put_node; 812 811 } 813 812 814 813 irq_chip->irq_mask = advk_pcie_irq_mask; ··· 820 819 &advk_pcie_irq_domain_ops, pcie); 821 820 if (!pcie->irq_domain) { 822 821 dev_err(dev, "Failed to get a INTx IRQ domain\n"); 823 - of_node_put(pcie_intc_node); 824 - return -ENOMEM; 822 + ret = -ENOMEM; 823 + goto out_put_node; 825 824 } 826 825 827 - return 0; 826 + out_put_node: 827 + of_node_put(pcie_intc_node); 828 + return ret; 828 829 } 829 830 830 831 static void advk_pcie_remove_irq_domain(struct advk_pcie *pcie)
+6 -2
drivers/pci/controller/pcie-iproc.c
··· 1356 1356 if (pcie->need_msi_steer) { 1357 1357 ret = iproc_pcie_msi_steer(pcie, msi_node); 1358 1358 if (ret) 1359 - return ret; 1359 + goto out_put_node; 1360 1360 } 1361 1361 1362 1362 /* 1363 1363 * If another MSI controller is being used, the call below should fail 1364 1364 * but that is okay 1365 1365 */ 1366 - return iproc_msi_init(pcie, msi_node); 1366 + ret = iproc_msi_init(pcie, msi_node); 1367 + 1368 + out_put_node: 1369 + of_node_put(msi_node); 1370 + return ret; 1367 1371 } 1368 1372 1369 1373 static void iproc_pcie_msi_disable(struct iproc_pcie *pcie)
+1
drivers/pci/controller/pcie-mediatek.c
··· 578 578 579 579 port->irq_domain = irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, 580 580 &intx_domain_ops, port); 581 + of_node_put(pcie_intc_node); 581 582 if (!port->irq_domain) { 582 583 dev_err(dev, "failed to get INTx IRQ domain\n"); 583 584 return -ENODEV;
+1
drivers/pci/controller/pcie-rockchip-host.c
··· 724 724 725 725 rockchip->irq_domain = irq_domain_add_linear(intc, PCI_NUM_INTX, 726 726 &intx_domain_ops, rockchip); 727 + of_node_put(intc); 727 728 if (!rockchip->irq_domain) { 728 729 dev_err(dev, "failed to get a INTx IRQ domain\n"); 729 730 return -EINVAL;
+5
drivers/pci/endpoint/functions/pci-epf-test.c
··· 592 592 593 593 kpcitest_workqueue = alloc_workqueue("kpcitest", 594 594 WQ_MEM_RECLAIM | WQ_HIGHPRI, 0); 595 + if (!kpcitest_workqueue) { 596 + pr_err("Failed to allocate the kpcitest work queue\n"); 597 + return -ENOMEM; 598 + } 599 + 595 600 ret = pci_epf_register_driver(&test_driver); 596 601 if (ret) { 597 602 pr_err("Failed to register pci epf test driver --> %d\n", ret);
+7 -1
tools/pci/Makefile
··· 14 14 15 15 CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include 16 16 17 - ALL_TARGETS := pcitest pcitest.sh 17 + ALL_TARGETS := pcitest 18 18 ALL_PROGRAMS := $(patsubst %,$(OUTPUT)%,$(ALL_TARGETS)) 19 + 20 + SCRIPTS := pcitest.sh 21 + ALL_SCRIPTS := $(patsubst %,$(OUTPUT)%,$(SCRIPTS)) 19 22 20 23 all: $(ALL_PROGRAMS) 21 24 ··· 49 46 install -d -m 755 $(DESTDIR)$(bindir); \ 50 47 for program in $(ALL_PROGRAMS); do \ 51 48 install $$program $(DESTDIR)$(bindir); \ 49 + done; \ 50 + for script in $(ALL_SCRIPTS); do \ 51 + install $$script $(DESTDIR)$(bindir); \ 52 52 done 53 53 54 54 FORCE:
+4 -4
tools/pci/pcitest.c
··· 140 140 } 141 141 142 142 fflush(stdout); 143 + return (ret < 0) ? ret : 1 - ret; /* return 0 if test succeeded */ 143 144 } 144 145 145 146 int main(int argc, char **argv) ··· 163 162 /* set default endpoint device */ 164 163 test->device = "/dev/pci-endpoint-test.0"; 165 164 166 - while ((c = getopt(argc, argv, "D:b:m:x:i:Ilrwcs:")) != EOF) 165 + while ((c = getopt(argc, argv, "D:b:m:x:i:Ilhrwcs:")) != EOF) 167 166 switch (c) { 168 167 case 'D': 169 168 test->device = optarg; ··· 207 206 case 's': 208 207 test->size = strtoul(optarg, NULL, 0); 209 208 continue; 210 - case '?': 211 209 case 'h': 212 210 default: 213 211 usage: ··· 224 224 "\t-w Write buffer test\n" 225 225 "\t-c Copy buffer test\n" 226 226 "\t-s <size> Size of buffer {default: 100KB}\n", 227 + "\t-h Print this help message\n", 227 228 argv[0]); 228 229 return -EINVAL; 229 230 } 230 231 231 - run_test(test); 232 - return 0; 232 + return run_test(test); 233 233 }