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

Merge tag 'edac_for_4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp

Pull EDAC updates from Borislav Petkov:

- Add support for systems with PCI segmented buses to sb_edac, by
Masayoshi Mizuma

- The usual pile of fixes and cleanups

* tag 'edac_for_4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp:
EDAC, sb_edac: Add support for systems with segmented PCI buses
EDAC, thunderx: Remove VLA usage
EDAC, i7core: Fix memleaks and use-after-free on probe and remove
EDAC: Fix memleak in module init error path
EDAC, altera: Fix an error handling path in altr_s10_sdram_probe()

+41 -21
+2 -1
drivers/edac/altera_edac.c
··· 730 730 S10_DDR0_IRQ_MASK)) { 731 731 edac_printk(KERN_ERR, EDAC_MC, 732 732 "Error clearing SDRAM ECC count\n"); 733 - return -ENODEV; 733 + ret = -ENODEV; 734 + goto err2; 734 735 } 735 736 736 737 if (regmap_update_bits(drvdata->mc_vbase, priv->ecc_irq_en_offset,
+3 -3
drivers/edac/edac_mc_sysfs.c
··· 1075 1075 1076 1076 err = device_add(mci_pdev); 1077 1077 if (err < 0) 1078 - goto out_dev_free; 1078 + goto out_put_device; 1079 1079 1080 1080 edac_dbg(0, "device %s created\n", dev_name(mci_pdev)); 1081 1081 1082 1082 return 0; 1083 1083 1084 - out_dev_free: 1085 - kfree(mci_pdev); 1084 + out_put_device: 1085 + put_device(mci_pdev); 1086 1086 out: 1087 1087 return err; 1088 1088 }
+15 -7
drivers/edac/i7core_edac.c
··· 1177 1177 1178 1178 rc = device_add(pvt->addrmatch_dev); 1179 1179 if (rc < 0) 1180 - return rc; 1180 + goto err_put_addrmatch; 1181 1181 1182 1182 if (!pvt->is_registered) { 1183 1183 pvt->chancounts_dev = kzalloc(sizeof(*pvt->chancounts_dev), 1184 1184 GFP_KERNEL); 1185 1185 if (!pvt->chancounts_dev) { 1186 - put_device(pvt->addrmatch_dev); 1187 - device_del(pvt->addrmatch_dev); 1188 - return -ENOMEM; 1186 + rc = -ENOMEM; 1187 + goto err_del_addrmatch; 1189 1188 } 1190 1189 1191 1190 pvt->chancounts_dev->type = &all_channel_counts_type; ··· 1198 1199 1199 1200 rc = device_add(pvt->chancounts_dev); 1200 1201 if (rc < 0) 1201 - return rc; 1202 + goto err_put_chancounts; 1202 1203 } 1203 1204 return 0; 1205 + 1206 + err_put_chancounts: 1207 + put_device(pvt->chancounts_dev); 1208 + err_del_addrmatch: 1209 + device_del(pvt->addrmatch_dev); 1210 + err_put_addrmatch: 1211 + put_device(pvt->addrmatch_dev); 1212 + 1213 + return rc; 1204 1214 } 1205 1215 1206 1216 static void i7core_delete_sysfs_devices(struct mem_ctl_info *mci) ··· 1219 1211 edac_dbg(1, "\n"); 1220 1212 1221 1213 if (!pvt->is_registered) { 1222 - put_device(pvt->chancounts_dev); 1223 1214 device_del(pvt->chancounts_dev); 1215 + put_device(pvt->chancounts_dev); 1224 1216 } 1225 - put_device(pvt->addrmatch_dev); 1226 1217 device_del(pvt->addrmatch_dev); 1218 + put_device(pvt->addrmatch_dev); 1227 1219 } 1228 1220 1229 1221 /****************************************************************************
+12 -5
drivers/edac/sb_edac.c
··· 352 352 353 353 struct sbridge_dev { 354 354 struct list_head list; 355 + int seg; 355 356 u8 bus, mc; 356 357 u8 node_id, source_id; 357 358 struct pci_dev **pdev; ··· 730 729 return 1 << cols; 731 730 } 732 731 733 - static struct sbridge_dev *get_sbridge_dev(u8 bus, enum domain dom, int multi_bus, 732 + static struct sbridge_dev *get_sbridge_dev(int seg, u8 bus, enum domain dom, 733 + int multi_bus, 734 734 struct sbridge_dev *prev) 735 735 { 736 736 struct sbridge_dev *sbridge_dev; ··· 749 747 : sbridge_edac_list.next, struct sbridge_dev, list); 750 748 751 749 list_for_each_entry_from(sbridge_dev, &sbridge_edac_list, list) { 752 - if (sbridge_dev->bus == bus && (dom == SOCK || dom == sbridge_dev->dom)) 750 + if ((sbridge_dev->seg == seg) && (sbridge_dev->bus == bus) && 751 + (dom == SOCK || dom == sbridge_dev->dom)) 753 752 return sbridge_dev; 754 753 } 755 754 756 755 return NULL; 757 756 } 758 757 759 - static struct sbridge_dev *alloc_sbridge_dev(u8 bus, enum domain dom, 758 + static struct sbridge_dev *alloc_sbridge_dev(int seg, u8 bus, enum domain dom, 760 759 const struct pci_id_table *table) 761 760 { 762 761 struct sbridge_dev *sbridge_dev; ··· 774 771 return NULL; 775 772 } 776 773 774 + sbridge_dev->seg = seg; 777 775 sbridge_dev->bus = bus; 778 776 sbridge_dev->dom = dom; 779 777 sbridge_dev->n_devs = table->n_devs_per_imc; ··· 2250 2246 struct sbridge_dev *sbridge_dev = NULL; 2251 2247 const struct pci_id_descr *dev_descr = &table->descr[devno]; 2252 2248 struct pci_dev *pdev = NULL; 2249 + int seg = 0; 2253 2250 u8 bus = 0; 2254 2251 int i = 0; 2255 2252 ··· 2281 2276 /* End of list, leave */ 2282 2277 return -ENODEV; 2283 2278 } 2279 + seg = pci_domain_nr(pdev->bus); 2284 2280 bus = pdev->bus->number; 2285 2281 2286 2282 next_imc: 2287 - sbridge_dev = get_sbridge_dev(bus, dev_descr->dom, multi_bus, sbridge_dev); 2283 + sbridge_dev = get_sbridge_dev(seg, bus, dev_descr->dom, 2284 + multi_bus, sbridge_dev); 2288 2285 if (!sbridge_dev) { 2289 2286 /* If the HA1 wasn't found, don't create EDAC second memory controller */ 2290 2287 if (dev_descr->dom == IMC1 && devno != 1) { ··· 2299 2292 if (dev_descr->dom == SOCK) 2300 2293 goto out_imc; 2301 2294 2302 - sbridge_dev = alloc_sbridge_dev(bus, dev_descr->dom, table); 2295 + sbridge_dev = alloc_sbridge_dev(seg, bus, dev_descr->dom, table); 2303 2296 if (!sbridge_dev) { 2304 2297 pci_dev_put(pdev); 2305 2298 return -ENOMEM;
+9 -5
drivers/edac/thunderx_edac.c
··· 408 408 size_t count, loff_t *ppos) 409 409 { 410 410 struct thunderx_lmc *lmc = file->private_data; 411 - 412 411 unsigned int cline_size = cache_line_size(); 413 - 414 - u8 tmp[cline_size]; 412 + u8 *tmp; 415 413 void __iomem *addr; 416 414 unsigned int offs, timeout = 100000; 417 415 418 416 atomic_set(&lmc->ecc_int, 0); 419 417 420 418 lmc->mem = alloc_pages_node(lmc->node, GFP_KERNEL, 0); 421 - 422 419 if (!lmc->mem) 423 420 return -ENOMEM; 421 + 422 + tmp = kmalloc(cline_size, GFP_KERNEL); 423 + if (!tmp) { 424 + __free_pages(lmc->mem, 0); 425 + return -ENOMEM; 426 + } 424 427 425 428 addr = page_address(lmc->mem); 426 429 427 430 while (!atomic_read(&lmc->ecc_int) && timeout--) { 428 431 stop_machine(inject_ecc_fn, lmc, NULL); 429 432 430 - for (offs = 0; offs < PAGE_SIZE; offs += sizeof(tmp)) { 433 + for (offs = 0; offs < PAGE_SIZE; offs += cline_size) { 431 434 /* 432 435 * Do a load from the previously rigged location 433 436 * This should generate an error interrupt. ··· 440 437 } 441 438 } 442 439 440 + kfree(tmp); 443 441 __free_pages(lmc->mem, 0); 444 442 445 443 return count;