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

ie31200_edac: Allocate mci and map mchbar first

Check for memory allocation and mchbar mapping failures before
initializing the dimm info tables needlessly.

Signed-off-by: Jason Baron <jbaron@akamai.com>
Suggested-by: Borislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/ead8f53e699f1ce21c2e17f3cffb4685d4faf72a.1404939455.git.jbaron@akamai.com
Signed-off-by: Borislav Petkov <bp@suse.de>

authored by

Jason Baron and committed by
Borislav Petkov
78fd4d12 7ee40b89

+37 -42
+37 -42
drivers/edac/ie31200_edac.c
··· 328 328 329 329 static int ie31200_probe1(struct pci_dev *pdev, int dev_idx) 330 330 { 331 - int rc; 332 - int i, j; 331 + int i, j, ret; 333 332 struct mem_ctl_info *mci = NULL; 334 333 struct edac_mc_layer layers[2]; 335 334 struct dimm_data dimm_info[IE31200_CHANNELS][IE31200_DIMMS_PER_CHANNEL]; ··· 343 344 return -ENODEV; 344 345 } 345 346 347 + nr_channels = how_many_channels(pdev); 348 + layers[0].type = EDAC_MC_LAYER_CHIP_SELECT; 349 + layers[0].size = IE31200_DIMMS; 350 + layers[0].is_virt_csrow = true; 351 + layers[1].type = EDAC_MC_LAYER_CHANNEL; 352 + layers[1].size = nr_channels; 353 + layers[1].is_virt_csrow = false; 354 + mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, 355 + sizeof(struct ie31200_priv)); 356 + if (!mci) 357 + return -ENOMEM; 358 + 346 359 window = ie31200_map_mchbar(pdev); 347 - if (!window) 348 - return -ENODEV; 360 + if (!window) { 361 + ret = -ENODEV; 362 + goto fail_free; 363 + } 364 + 365 + edac_dbg(3, "MC: init mci\n"); 366 + mci->pdev = &pdev->dev; 367 + mci->mtype_cap = MEM_FLAG_DDR3; 368 + mci->edac_ctl_cap = EDAC_FLAG_SECDED; 369 + mci->edac_cap = EDAC_FLAG_SECDED; 370 + mci->mod_name = EDAC_MOD_STR; 371 + mci->mod_ver = IE31200_REVISION; 372 + mci->ctl_name = ie31200_devs[dev_idx].ctl_name; 373 + mci->dev_name = pci_name(pdev); 374 + mci->edac_check = ie31200_check; 375 + mci->ctl_page_to_phys = NULL; 376 + priv = mci->pvt_info; 377 + priv->window = window; 349 378 350 379 /* populate DIMM info */ 351 380 for (i = 0; i < IE31200_CHANNELS; i++) { ··· 393 366 dimm_info[i][j].x16_width); 394 367 } 395 368 } 396 - 397 - nr_channels = how_many_channels(pdev); 398 - 399 - layers[0].type = EDAC_MC_LAYER_CHIP_SELECT; 400 - layers[0].size = IE31200_DIMMS; 401 - layers[0].is_virt_csrow = true; 402 - layers[1].type = EDAC_MC_LAYER_CHANNEL; 403 - layers[1].size = nr_channels; 404 - layers[1].is_virt_csrow = false; 405 - mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, 406 - sizeof(struct ie31200_priv)); 407 - 408 - rc = -ENOMEM; 409 - if (!mci) 410 - goto fail_unmap; 411 - 412 - edac_dbg(3, "MC: init mci\n"); 413 - 414 - mci->pdev = &pdev->dev; 415 - mci->mtype_cap = MEM_FLAG_DDR3; 416 - 417 - mci->edac_ctl_cap = EDAC_FLAG_SECDED; 418 - mci->edac_cap = EDAC_FLAG_SECDED; 419 - 420 - mci->mod_name = EDAC_MOD_STR; 421 - mci->mod_ver = IE31200_REVISION; 422 - mci->ctl_name = ie31200_devs[dev_idx].ctl_name; 423 - mci->dev_name = pci_name(pdev); 424 - mci->edac_check = ie31200_check; 425 - mci->ctl_page_to_phys = NULL; 426 - priv = mci->pvt_info; 427 - priv->window = window; 428 369 429 370 /* 430 371 * The dram rank boundary (DRB) reg values are boundary addresses ··· 434 439 435 440 ie31200_clear_error_info(mci); 436 441 437 - rc = -ENODEV; 438 442 if (edac_mc_add_mc(mci)) { 439 443 edac_dbg(3, "MC: failed edac_mc_add_mc()\n"); 440 - goto fail_free; 444 + ret = -ENODEV; 445 + goto fail_unmap; 441 446 } 442 447 443 448 /* get this far and it's successful */ 444 449 edac_dbg(3, "MC: success\n"); 445 450 return 0; 446 451 447 - fail_free: 448 - if (mci) 449 - edac_mc_free(mci); 450 452 fail_unmap: 451 453 iounmap(window); 452 454 453 - return rc; 455 + fail_free: 456 + edac_mc_free(mci); 457 + 458 + return ret; 454 459 } 455 460 456 461 static int ie31200_init_one(struct pci_dev *pdev,