]> git.baikalelectronics.ru Git - kernel.git/commitdiff
powerpc/powernv/pci: Use kzalloc() for phb related allocations
authorMichael Ellerman <mpe@ellerman.id.au>
Thu, 11 Feb 2021 11:23:57 +0000 (22:23 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 11 Feb 2021 12:28:34 +0000 (23:28 +1100)
As part of commit fbbefb320214 ("powerpc/pci: Move PHB discovery for
PCI_DN using platforms"), I switched some allocations from
memblock_alloc() to kmalloc(), otherwise memblock would warn that it
was being called after slab init.

However I missed that the code relied on the allocations being zeroed,
without which we could end up crashing:

  pci_bus 0000:00: busn_res: [bus 00-ff] end is updated to ff
  BUG: Unable to handle kernel data access on read at 0x6b6b6b6b6b6b6af7
  Faulting instruction address: 0xc0000000000dbc90
  Oops: Kernel access of bad area, sig: 11 [#1]
  LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA PowerNV
  ...
  NIP  pnv_ioda_get_pe_state+0xe0/0x1d0
  LR   pnv_ioda_get_pe_state+0xb4/0x1d0
  Call Trace:
    pnv_ioda_get_pe_state+0xb4/0x1d0 (unreliable)
    pnv_pci_config_check_eeh.isra.9+0x78/0x270
    pnv_pci_read_config+0xf8/0x160
    pci_bus_read_config_dword+0xa4/0x120
    pci_bus_generic_read_dev_vendor_id+0x54/0x270
    pci_scan_single_device+0xb8/0x140
    pci_scan_slot+0x80/0x1b0
    pci_scan_child_bus_extend+0x94/0x490
    pcibios_scan_phb+0x1f8/0x3c0
    pcibios_init+0x8c/0x12c
    do_one_initcall+0x94/0x510
    kernel_init_freeable+0x35c/0x3fc
    kernel_init+0x2c/0x168
    ret_from_kernel_thread+0x5c/0x70

Switch them to kzalloc().

Fixes: fbbefb320214 ("powerpc/pci: Move PHB discovery for PCI_DN using platforms")
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210211112749.3410771-1-mpe@ellerman.id.au
arch/powerpc/platforms/powernv/pci-ioda.c

index 7ee14ac275bd97429f5b49153216ee8ddb5abd35..f0f901683a2fe1056cc67190cccc09c76732640d 100644 (file)
@@ -2921,7 +2921,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
        phb_id = be64_to_cpup(prop64);
        pr_debug("  PHB-ID  : 0x%016llx\n", phb_id);
 
-       phb = kmalloc(sizeof(*phb), GFP_KERNEL);
+       phb = kzalloc(sizeof(*phb), GFP_KERNEL);
        if (!phb)
                panic("%s: Failed to allocate %zu bytes\n", __func__,
                      sizeof(*phb));
@@ -2970,7 +2970,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
        else
                phb->diag_data_size = PNV_PCI_DIAG_BUF_SIZE;
 
-       phb->diag_data = kmalloc(phb->diag_data_size, GFP_KERNEL);
+       phb->diag_data = kzalloc(phb->diag_data_size, GFP_KERNEL);
        if (!phb->diag_data)
                panic("%s: Failed to allocate %u bytes\n", __func__,
                      phb->diag_data_size);
@@ -3032,7 +3032,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
        }
        pemap_off = size;
        size += phb->ioda.total_pe_num * sizeof(struct pnv_ioda_pe);
-       aux = kmalloc(size, GFP_KERNEL);
+       aux = kzalloc(size, GFP_KERNEL);
        if (!aux)
                panic("%s: Failed to allocate %lu bytes\n", __func__, size);