Re: [RFC PATCH 09/33] irqchip/gic-v3-its: Split out property table allocation

From: Prakash B
Date: Fri Feb 17 2017 - 15:40:44 EST


Hi Marc Zyngier,

Verifying this RFC series on Cavium ThunderX board to validate the
GICV3 changes, noticed host crash as below.

Host booted fine with this change
"gic_flush_dcache_to_poc(page_address(prop_page), LPI_PROPBASE_SZ);"

Loading Linux 4.10.0-rc3-mz-rfc1+ ...
Loading initial ramdisk ...
EFI stub: Booting Linux Kernel...
EFI stub: Using DTB from configuration table
EFI stub: Exiting boot services and installing virtual address map...
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 4.10.0-rc3-mz-rfc1+ (root@ubuntu-gbt2s)
(gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) )
#1 SMP Fri Feb 17 10:30:37 PST 2017
[ 0.000000] Boot CPU: AArch64 Processor [431f0a10]
[ 0.000000] earlycon: pl11 at MMIO 0x000087e024000000 (options '')
[ 0.000000] bootconsole [pl11] enabled
[ 0.000000] Unable to handle kernel paging request at virtual
address ffff800000000000
[ 0.000000] pgd = ffff0000093b0000
[ 0.000000] [ffff800000000000] *pgd=0000011ffff70003,
*pud=0000011ffff70003, *pmd=0000011ffff60003, *pte=0000000000000000
[ 0.000000] Internal error: Oops: 96000147 [#1] SMP
[ 0.000000] Modules linked in:
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.10.0-rc3-mz-rfc1+ #1
[ 0.000000] Hardware name: cavium,thunder-88xx (DT)
[ 0.000000] task: ffff0000090aeb80 task.stack: ffff000009080000
[ 0.000000] PC is at __flush_dcache_area+0x20/0x40
[ 0.000000] LR is at its_allocate_prop_table+0x6c/0x80
[ 0.000000] pc : [<ffff00000809b2a0>] lr : [<ffff000008585704>]
pstate: 400000c5
[ 0.000000] sp : ffff000009083d20

------
--
[ 0.000000] 3c40: ffff7fe007f00660 ffff801ff76e7f20
0000000000000000 2030303030303032
[ 0.000000] [<ffff00000809b2a0>] __flush_dcache_area+0x20/0x40
[ 0.000000] [<ffff000008f8c0d8>] its_init+0xa4/0x384
[ 0.000000] [<ffff000008f8af7c>] gic_init_bases+0x184/0x2c4
[ 0.000000] [<ffff000008f8b224>] gic_of_init+0x168/0x210
[ 0.000000] [<ffff000008fab3d4>] of_irq_init+0x198/0x324
[ 0.000000] [<ffff000008f898f4>] irqchip_init+0x14/0x38
[ 0.000000] [<ffff000008f53bd0>] init_IRQ+0xc/0x2c
[ 0.000000] [<ffff000008f50a78>] start_kernel+0x268/0x3f0
[ 0.000000] [<ffff000008f501e0>] __primary_switched+0x64/0x6c
[ 0.000000] Code: 9ac32042 8b010001 d1000443 8a230000 (d50b7e20)
[ 0.000000] ---[ end trace f68728a0d3053b52 ]---
[ 0.000000] Kernel panic - not syncing: Attempted to kill the idle task!
[ 0.000000] ---[ end Kernel panic - not syncing: Attempted to kill
the idle task!


> +static struct page *its_allocate_prop_table(gfp_t gfp_flags)
> +{
> + struct page *prop_page;
> +
> + prop_page = alloc_pages(gfp_flags, get_order(LPI_PROPBASE_SZ));
> + if (!prop_page)
> + return NULL;
> +
> + /* Priority 0xa0, Group-1, disabled */
> + memset(page_address(prop_page),
> + LPI_PROP_DEFAULT_PRIO | LPI_PROP_GROUP1,
> + LPI_PROPBASE_SZ);
> +
> + /* Make sure the GIC will observe the written configuration */
> + gic_flush_dcache_to_poc(page_address(gic_rdists->prop_page), LPI_PROPBASE_SZ);

gic_flush_dcache_to_poc(page_address(prop_page), LPI_PROPBASE_SZ);

>
> + return prop_page;
> +}

Regards,
Prakash B