Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp622211ybx; Fri, 1 Nov 2019 08:38:36 -0700 (PDT) X-Google-Smtp-Source: APXvYqzTXMOXlq6h5lU0IgCmsqpwX/5gg4K8QPFUaq0iYpfT9F7hYbJb4qJbECLjwdufQLlTic7Q X-Received: by 2002:a17:906:229a:: with SMTP id p26mr10347554eja.76.1572622716684; Fri, 01 Nov 2019 08:38:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572622716; cv=none; d=google.com; s=arc-20160816; b=a3Q4iawKvCag+M3nm4eFg9iiSbr3BzVQ7QNJaPb5c1hvyAQhSjC4vwumFEznq7NtA5 6cnpf0tpXVfQx5ztTxVVoKtSnKWqs68L+LQKb0wbDt+XBOSc6ZXcYco+wErHSbJWNT7U 7FsayphKhkErLuMmVKtRl47bw1PbqqdRm1JR5lZd9Npq5NZcrSyi0E83vb/VDb7E7mnX Po6c7Iw+GciYhTNCwgFouPetcsrI+Id0PhK4+4GHtZkQcKQIlqFld7mz5RtPhlsBS9Pe AW606EL0KJ4E2LfwbKMN5d8WVxiiz1ColljglQn7TBtKuIjXF1fODT+xXzaZb+yx6Ofj G+fQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=nGSpTetS+6cf5hrvOPnrh3fY23YC71bqHT11p8/Y+wI=; b=hW2Iq+aTAA385rYRNOFlN3xjJXXT+CdG0e26J6vBed4JFsl6XsAec20pMzMJ/z4diB zVjFJDvnFY/pObe7WeH5vIP4LG7jvW62IDaKdsHcWTdE3d5fKSw3f++922QVREqXTsJB RsBQnyQ1TPCrGWgsuTlBG37K3L2lEUw7KwybIcD4dp/mNw8YnSuFKEuE1d0PIB9AZEwD qSSVTabYUwmg7jWZ+0vyxJYfXPwQjq2xfwWkyOB9WlZf5AJwm/pi4MqFz2Zuuq3Gd1/G 0DOqTWXHWsF8JZesEJSppVNUb2BPYtL09K/nvUtT6ZvN8xT5aWpZ8zE0wjbpwh96K7wU DI7Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f6si6228741ejl.293.2019.11.01.08.38.12; Fri, 01 Nov 2019 08:38:36 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727923AbfKAOJy (ORCPT + 99 others); Fri, 1 Nov 2019 10:09:54 -0400 Received: from foss.arm.com ([217.140.110.172]:35818 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727725AbfKAOJy (ORCPT ); Fri, 1 Nov 2019 10:09:54 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id D624031F; Fri, 1 Nov 2019 07:09:52 -0700 (PDT) Received: from e112269-lin.cambridge.arm.com (e112269-lin.cambridge.arm.com [10.1.194.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 459193F718; Fri, 1 Nov 2019 07:09:50 -0700 (PDT) From: Steven Price To: Andrew Morton , linux-mm@kvack.org Cc: Steven Price , Andy Lutomirski , Ard Biesheuvel , Arnd Bergmann , Borislav Petkov , Catalin Marinas , Dave Hansen , Ingo Molnar , James Morse , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Peter Zijlstra , Thomas Gleixner , Will Deacon , x86@kernel.org, "H. Peter Anvin" , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Mark Rutland , "Liang, Kan" Subject: [PATCH v15 00/23] Generic page walk and ptdump Date: Fri, 1 Nov 2019 14:09:19 +0000 Message-Id: <20191101140942.51554-1-steven.price@arm.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Many architectures current have a debugfs file for dumping the kernel page tables. Currently each architecture has to implement custom functions for this because the details of walking the page tables used by the kernel are different between architectures. This series extends the capabilities of walk_page_range() so that it can deal with the page tables of the kernel (which have no VMAs and can contain larger huge pages than exist for user space). A generic PTDUMP implementation is the implemented making use of the new functionality of walk_page_range() and finally arm64 and x86 are switch to using it, removing the custom table walkers. To enable a generic page table walker to walk the unusual mappings of the kernel we need to implement a set of functions which let us know when the walker has reached the leaf entry. After a suggestion from Will Deacon I've chosen the name p?d_leaf() as this (hopefully) describes the purpose (and is a new name so has no historic baggage). Some architectures have p?d_large macros but this is easily confused with "large pages". This series ends with a generic PTDUMP implemention for arm64 and x86. Mostly this is a clean up and there should be very little functional change. The exceptions are: * arm64 PTDUMP debugfs now displays pages which aren't present (patch 22). * arm64 has the ability to efficiently process KASAN pages (which previously only x86 implemented). This means that the combination of KASAN and DEBUG_WX is now useable. Also available as a git tree: git://linux-arm.org/linux-sp.git walk_page_range/v15 Changes since v14: https://lore.kernel.org/lkml/20191028135910.33253-1-steven.price@arm.com/ * Switch walk_page_range() into two functions, the existing walk_page_range() now still requires VMAs (and treats areas without a VMA as a 'hole'). The new walk_page_range_novma() ignores VMAs and will report the actual page table layout. This fixes the previous breakage of /proc//pagemap * New patch at the end of the series which reduces the 'level' numbers by 1 to simplify the code slightly * Added tags Changes since v13: https://lore.kernel.org/lkml/20191024093716.49420-1-steven.price@arm.com/ * Fixed typo in arc definition of pmd_leaf() spotted by the kbuild test robot * Added tags Changes since v12: https://lore.kernel.org/lkml/20191018101248.33727-1-steven.price@arm.com/ * Correct code format in riscv pud_leaf()/pmd_leaf() * v12 may not have reached everyone because of mail server problems (which are now hopefully resolved!) Changes since v11: https://lore.kernel.org/lkml/20191007153822.16518-1-steven.price@arm.com/ * Use "-1" as dummy depth parameter in patch 14. Changes since v10: https://lore.kernel.org/lkml/20190731154603.41797-1-steven.price@arm.com/ * Rebased to v5.4-rc1 - mainly various updates to deal with the splitting out of ops from struct mm_walk. * Deal with PGD_LEVEL_MULT not always being constant on x86. Changes since v9: https://lore.kernel.org/lkml/20190722154210.42799-1-steven.price@arm.com/ * Moved generic macros to first page in the series and explained the macro naming in the commit message. * mips: Moved macros to pgtable.h as they are now valid for both 32 and 64 bit * x86: Dropped patch which changed the debugfs output for x86, instead we have... * new patch adding 'depth' parameter to pte_hole. This is used to provide the necessary information to output lines for 'holes' in the debugfs files * new patch changing arm64 debugfs output to include holes to match x86 * generic ptdump KASAN handling has been simplified and now works with CONFIG_DEBUG_VIRTUAL. Changes since v8: https://lore.kernel.org/lkml/20190403141627.11664-1-steven.price@arm.com/ * Rename from p?d_large() to p?d_leaf() * Dropped patches migrating arm64/x86 custom walkers to walk_page_range() in favour of adding a generic PTDUMP implementation and migrating arm64/x86 to that instead. * Rebased to v5.3-rc1 Steven Price (23): mm: Add generic p?d_leaf() macros arc: mm: Add p?d_leaf() definitions arm: mm: Add p?d_leaf() definitions arm64: mm: Add p?d_leaf() definitions mips: mm: Add p?d_leaf() definitions powerpc: mm: Add p?d_leaf() definitions riscv: mm: Add p?d_leaf() definitions s390: mm: Add p?d_leaf() definitions sparc: mm: Add p?d_leaf() definitions x86: mm: Add p?d_leaf() definitions mm: pagewalk: Add p4d_entry() and pgd_entry() mm: pagewalk: Allow walking without vma mm: pagewalk: Add test_p?d callbacks mm: pagewalk: Add 'depth' parameter to pte_hole x86: mm: Point to struct seq_file from struct pg_state x86: mm+efi: Convert ptdump_walk_pgd_level() to take a mm_struct x86: mm: Convert ptdump_walk_pgd_level_debugfs() to take an mm_struct x86: mm: Convert ptdump_walk_pgd_level_core() to take an mm_struct mm: Add generic ptdump x86: mm: Convert dump_pagetables to use walk_page_range arm64: mm: Convert mm/dump.c to use walk_page_range() arm64: mm: Display non-present entries in ptdump mm: ptdump: Reduce level numbers by 1 in note_page() arch/arc/include/asm/pgtable.h | 1 + arch/arm/include/asm/pgtable-2level.h | 1 + arch/arm/include/asm/pgtable-3level.h | 1 + arch/arm64/Kconfig | 1 + arch/arm64/Kconfig.debug | 19 +- arch/arm64/include/asm/pgtable.h | 2 + arch/arm64/include/asm/ptdump.h | 8 +- arch/arm64/mm/Makefile | 4 +- arch/arm64/mm/dump.c | 148 +++----- arch/arm64/mm/mmu.c | 4 +- arch/arm64/mm/ptdump_debugfs.c | 2 +- arch/mips/include/asm/pgtable.h | 5 + arch/powerpc/include/asm/book3s/64/pgtable.h | 30 +- arch/riscv/include/asm/pgtable-64.h | 7 + arch/riscv/include/asm/pgtable.h | 7 + arch/s390/include/asm/pgtable.h | 2 + arch/sparc/include/asm/pgtable_64.h | 2 + arch/x86/Kconfig | 1 + arch/x86/Kconfig.debug | 20 +- arch/x86/include/asm/pgtable.h | 10 +- arch/x86/mm/Makefile | 4 +- arch/x86/mm/debug_pagetables.c | 8 +- arch/x86/mm/dump_pagetables.c | 343 +++++-------------- arch/x86/platform/efi/efi_32.c | 2 +- arch/x86/platform/efi/efi_64.c | 4 +- drivers/firmware/efi/arm-runtime.c | 2 +- fs/proc/task_mmu.c | 4 +- include/asm-generic/pgtable.h | 20 ++ include/linux/pagewalk.h | 42 ++- include/linux/ptdump.h | 22 ++ mm/Kconfig.debug | 21 ++ mm/Makefile | 1 + mm/hmm.c | 8 +- mm/migrate.c | 5 +- mm/mincore.c | 1 + mm/pagewalk.c | 126 +++++-- mm/ptdump.c | 151 ++++++++ 37 files changed, 586 insertions(+), 453 deletions(-) create mode 100644 include/linux/ptdump.h create mode 100644 mm/ptdump.c -- 2.20.1