[PATCHv2] arm: mm: dump: don't skip regions
Mark Rutland
mark.rutland at arm.com
Wed Dec 17 09:00:09 PST 2014
On Thu, Dec 11, 2014 at 06:50:43PM +0000, Mark Rutland wrote:
> Hi,
>
> This is an update to v1 [1], dropping the unnecessary use of
> USER_PGTABLES_CEILING, as discussed [2]. I've given this a spin on TC2 and the
> output looks correct.
>
> Steve, I dropped your ack given the change, but I hope to receive a new one
> soon :)
>
> Russell, if you're happy with this should I drop it in the patch system
> shortly, or should I hold off until -rc1?
On the assumption this is fine, I've dropped this in the patch system as
8249/1.
Thanks,
Mark.
>
> Thanks,
> Mark.
>
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-December/308952.html
> [2] http://lists.infradead.org/pipermail/linux-arm-kernel/2014-December/310161.html
>
> ---->8----
> Currently the arm page table dumping code starts dumping page tables
> from USER_PGTABLES_CEILING. This is unnecessary for skipping any entries
> related to userspace as the swapper_pg_dir does not contain such
> entries, and results in a couple of unfortuante side effects.
>
> Firstly, any kernel mappings which might exist below
> USER_PGTABLES_CEILING will not be accounted in the dump output. This
> masks any entries erroneously created below this address.
>
> Secondly, if the final page table entry walked is part of a valid
> mapping the page table dumping code will not log the region this entry
> is part of, as the final note_page call in walk_pgd will trigger an
> early return when 0 < USER_PGTABLES_CEILING. Luckily this isn't seen on
> contemporary systems as they typically don't have enough RAM to extend
> the linear mapping right to the end of the address space.
>
> Due to the way addr is constructed in the walk_* functions, it can never
> be less than USER_PGTABLES_CEILING when walking the page tables, so it
> is not necessary to avoid dereferencing invalid table addresses. The
> existing checks for st->current_prot and st->marker[1].start_address are
> sufficient to ensure we will not print and/or dereference garbage when
> trying to log information.
>
> This patch removes both problematic uses of USER_PGTABLES_CEILING from
> the arm page table dumping code, preventing both of these issues. We
> will now report any low mappings, and the final note_page call will not
> return early, ensuring all regions are logged.
>
> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Cc: Steve Capper <steve.capper at linaro.org>
> Cc: Kees Cook <keescook at chromium.org>
> Cc: Russell King <linux at arm.linux.org.uk>
> Cc: Will Deacon <will.deacon at arm.com>
> ---
> arch/arm/mm/dump.c | 9 ++-------
> 1 file changed, 2 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/mm/dump.c b/arch/arm/mm/dump.c
> index 5942493..9fe8e24 100644
> --- a/arch/arm/mm/dump.c
> +++ b/arch/arm/mm/dump.c
> @@ -220,9 +220,6 @@ static void note_page(struct pg_state *st, unsigned long addr, unsigned level, u
> static const char units[] = "KMGTPE";
> u64 prot = val & pg_level[level].mask;
>
> - if (addr < USER_PGTABLES_CEILING)
> - return;
> -
> if (!st->level) {
> st->level = level;
> st->current_prot = prot;
> @@ -308,15 +305,13 @@ static void walk_pgd(struct seq_file *m)
> pgd_t *pgd = swapper_pg_dir;
> struct pg_state st;
> unsigned long addr;
> - unsigned i, pgdoff = USER_PGTABLES_CEILING / PGDIR_SIZE;
> + unsigned i;
>
> memset(&st, 0, sizeof(st));
> st.seq = m;
> st.marker = address_markers;
>
> - pgd += pgdoff;
> -
> - for (i = pgdoff; i < PTRS_PER_PGD; i++, pgd++) {
> + for (i = 0; i < PTRS_PER_PGD; i++, pgd++) {
> addr = i * PGDIR_SIZE;
> if (!pgd_none(*pgd)) {
> walk_pud(&st, pgd, addr);
> --
> 1.9.1
>
More information about the linux-arm-kernel
mailing list