From: Sergey Dyasli <sergey.dyasli@citrix.com> To: <xen-devel@lists.xen.org>, <kasan-dev@googlegroups.com>, <linux-mm@kvack.org>, <linux-kernel@vger.kernel.org> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>, Alexander Potapenko <glider@google.com>, Dmitry Vyukov <dvyukov@google.com>, Boris Ostrovsky <boris.ostrovsky@oracle.com>, Juergen Gross <jgross@suse.com>, "Stefano Stabellini" <sstabellini@kernel.org>, George Dunlap <george.dunlap@citrix.com>, Ross Lagerwall <ross.lagerwall@citrix.com>, Andrew Morton <akpm@linux-foundation.org>, Sergey Dyasli <sergey.dyasli@citrix.com> Subject: [PATCH v1 1/4] kasan: introduce set_pmd_early_shadow() Date: Wed, 8 Jan 2020 15:20:57 +0000 [thread overview] Message-ID: <20200108152100.7630-2-sergey.dyasli@citrix.com> (raw) In-Reply-To: <20200108152100.7630-1-sergey.dyasli@citrix.com> It is incorrect to call pmd_populate_kernel() multiple times for the same page table. Xen notices it during kasan_populate_early_shadow(): (XEN) mm.c:3222:d155v0 mfn 3704b already pinned This happens for kasan_early_shadow_pte when USE_SPLIT_PTE_PTLOCKS is enabled. Fix this by introducing set_pmd_early_shadow() which calls pmd_populate_kernel() only once and uses set_pmd() afterwards. Signed-off-by: Sergey Dyasli <sergey.dyasli@citrix.com> --- RFC --> v1: - New patch --- mm/kasan/init.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/mm/kasan/init.c b/mm/kasan/init.c index ce45c491ebcd..a4077320777f 100644 --- a/mm/kasan/init.c +++ b/mm/kasan/init.c @@ -81,6 +81,19 @@ static inline bool kasan_early_shadow_page_entry(pte_t pte) return pte_page(pte) == virt_to_page(lm_alias(kasan_early_shadow_page)); } +static inline void set_pmd_early_shadow(pmd_t *pmd) +{ + static bool pmd_populated = false; + pte_t *early_shadow = lm_alias(kasan_early_shadow_pte); + + if (likely(pmd_populated)) { + set_pmd(pmd, __pmd(__pa(early_shadow) | _PAGE_TABLE)); + } else { + pmd_populate_kernel(&init_mm, pmd, early_shadow); + pmd_populated = true; + } +} + static __init void *early_alloc(size_t size, int node) { void *ptr = memblock_alloc_try_nid(size, size, __pa(MAX_DMA_ADDRESS), @@ -120,8 +133,7 @@ static int __ref zero_pmd_populate(pud_t *pud, unsigned long addr, next = pmd_addr_end(addr, end); if (IS_ALIGNED(addr, PMD_SIZE) && end - addr >= PMD_SIZE) { - pmd_populate_kernel(&init_mm, pmd, - lm_alias(kasan_early_shadow_pte)); + set_pmd_early_shadow(pmd); continue; } @@ -157,8 +169,7 @@ static int __ref zero_pud_populate(p4d_t *p4d, unsigned long addr, pud_populate(&init_mm, pud, lm_alias(kasan_early_shadow_pmd)); pmd = pmd_offset(pud, addr); - pmd_populate_kernel(&init_mm, pmd, - lm_alias(kasan_early_shadow_pte)); + set_pmd_early_shadow(pmd); continue; } @@ -198,8 +209,7 @@ static int __ref zero_p4d_populate(pgd_t *pgd, unsigned long addr, pud_populate(&init_mm, pud, lm_alias(kasan_early_shadow_pmd)); pmd = pmd_offset(pud, addr); - pmd_populate_kernel(&init_mm, pmd, - lm_alias(kasan_early_shadow_pte)); + set_pmd_early_shadow(pmd); continue; } @@ -271,8 +281,7 @@ int __ref kasan_populate_early_shadow(const void *shadow_start, pud_populate(&init_mm, pud, lm_alias(kasan_early_shadow_pmd)); pmd = pmd_offset(pud, addr); - pmd_populate_kernel(&init_mm, pmd, - lm_alias(kasan_early_shadow_pte)); + set_pmd_early_shadow(pmd); continue; } -- 2.17.1
WARNING: multiple messages have this Message-ID (diff)
From: Sergey Dyasli <sergey.dyasli@citrix.com> To: <xen-devel@lists.xen.org>, <kasan-dev@googlegroups.com>, <linux-mm@kvack.org>, <linux-kernel@vger.kernel.org> Cc: Juergen Gross <jgross@suse.com>, Sergey Dyasli <sergey.dyasli@citrix.com>, Stefano Stabellini <sstabellini@kernel.org>, George Dunlap <george.dunlap@citrix.com>, Ross Lagerwall <ross.lagerwall@citrix.com>, Alexander Potapenko <glider@google.com>, Andrey Ryabinin <aryabinin@virtuozzo.com>, Boris Ostrovsky <boris.ostrovsky@oracle.com>, Andrew Morton <akpm@linux-foundation.org>, Dmitry Vyukov <dvyukov@google.com> Subject: [Xen-devel] [PATCH v1 1/4] kasan: introduce set_pmd_early_shadow() Date: Wed, 8 Jan 2020 15:20:57 +0000 [thread overview] Message-ID: <20200108152100.7630-2-sergey.dyasli@citrix.com> (raw) In-Reply-To: <20200108152100.7630-1-sergey.dyasli@citrix.com> It is incorrect to call pmd_populate_kernel() multiple times for the same page table. Xen notices it during kasan_populate_early_shadow(): (XEN) mm.c:3222:d155v0 mfn 3704b already pinned This happens for kasan_early_shadow_pte when USE_SPLIT_PTE_PTLOCKS is enabled. Fix this by introducing set_pmd_early_shadow() which calls pmd_populate_kernel() only once and uses set_pmd() afterwards. Signed-off-by: Sergey Dyasli <sergey.dyasli@citrix.com> --- RFC --> v1: - New patch --- mm/kasan/init.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/mm/kasan/init.c b/mm/kasan/init.c index ce45c491ebcd..a4077320777f 100644 --- a/mm/kasan/init.c +++ b/mm/kasan/init.c @@ -81,6 +81,19 @@ static inline bool kasan_early_shadow_page_entry(pte_t pte) return pte_page(pte) == virt_to_page(lm_alias(kasan_early_shadow_page)); } +static inline void set_pmd_early_shadow(pmd_t *pmd) +{ + static bool pmd_populated = false; + pte_t *early_shadow = lm_alias(kasan_early_shadow_pte); + + if (likely(pmd_populated)) { + set_pmd(pmd, __pmd(__pa(early_shadow) | _PAGE_TABLE)); + } else { + pmd_populate_kernel(&init_mm, pmd, early_shadow); + pmd_populated = true; + } +} + static __init void *early_alloc(size_t size, int node) { void *ptr = memblock_alloc_try_nid(size, size, __pa(MAX_DMA_ADDRESS), @@ -120,8 +133,7 @@ static int __ref zero_pmd_populate(pud_t *pud, unsigned long addr, next = pmd_addr_end(addr, end); if (IS_ALIGNED(addr, PMD_SIZE) && end - addr >= PMD_SIZE) { - pmd_populate_kernel(&init_mm, pmd, - lm_alias(kasan_early_shadow_pte)); + set_pmd_early_shadow(pmd); continue; } @@ -157,8 +169,7 @@ static int __ref zero_pud_populate(p4d_t *p4d, unsigned long addr, pud_populate(&init_mm, pud, lm_alias(kasan_early_shadow_pmd)); pmd = pmd_offset(pud, addr); - pmd_populate_kernel(&init_mm, pmd, - lm_alias(kasan_early_shadow_pte)); + set_pmd_early_shadow(pmd); continue; } @@ -198,8 +209,7 @@ static int __ref zero_p4d_populate(pgd_t *pgd, unsigned long addr, pud_populate(&init_mm, pud, lm_alias(kasan_early_shadow_pmd)); pmd = pmd_offset(pud, addr); - pmd_populate_kernel(&init_mm, pmd, - lm_alias(kasan_early_shadow_pte)); + set_pmd_early_shadow(pmd); continue; } @@ -271,8 +281,7 @@ int __ref kasan_populate_early_shadow(const void *shadow_start, pud_populate(&init_mm, pud, lm_alias(kasan_early_shadow_pmd)); pmd = pmd_offset(pud, addr); - pmd_populate_kernel(&init_mm, pmd, - lm_alias(kasan_early_shadow_pte)); + set_pmd_early_shadow(pmd); continue; } -- 2.17.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2020-01-08 15:28 UTC|newest] Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-01-08 15:20 [PATCH v1 0/4] basic KASAN support for Xen PV domains Sergey Dyasli 2020-01-08 15:20 ` [Xen-devel] " Sergey Dyasli 2020-01-08 15:20 ` Sergey Dyasli [this message] 2020-01-08 15:20 ` [Xen-devel] [PATCH v1 1/4] kasan: introduce set_pmd_early_shadow() Sergey Dyasli 2020-01-10 14:41 ` kbuild test robot 2020-01-10 14:41 ` kbuild test robot 2020-01-10 14:41 ` [Xen-devel] " kbuild test robot 2020-01-11 5:21 ` kbuild test robot 2020-01-11 5:21 ` kbuild test robot 2020-01-11 5:21 ` [Xen-devel] " kbuild test robot 2020-01-15 10:54 ` Sergey Dyasli 2020-01-15 10:54 ` [Xen-devel] " Sergey Dyasli 2020-01-15 10:54 ` Sergey Dyasli 2020-01-15 11:09 ` Jürgen Groß 2020-01-15 11:09 ` [Xen-devel] " Jürgen Groß 2020-01-15 16:32 ` Sergey Dyasli 2020-01-15 16:32 ` [Xen-devel] " Sergey Dyasli 2020-01-15 16:32 ` Sergey Dyasli 2020-01-16 7:54 ` Jürgen Groß 2020-01-16 7:54 ` [Xen-devel] " Jürgen Groß 2020-01-08 15:20 ` [PATCH v1 2/4] x86/xen: add basic KASAN support for PV kernel Sergey Dyasli 2020-01-08 15:20 ` [Xen-devel] " Sergey Dyasli 2020-01-09 9:15 ` Jürgen Groß 2020-01-09 9:15 ` [Xen-devel] " Jürgen Groß 2020-01-10 11:07 ` Sergey Dyasli 2020-01-10 11:07 ` [Xen-devel] " Sergey Dyasli 2020-01-10 11:07 ` Sergey Dyasli 2020-01-09 23:27 ` Boris Ostrovsky 2020-01-09 23:27 ` [Xen-devel] " Boris Ostrovsky 2020-01-10 11:46 ` Sergey Dyasli 2020-01-10 11:46 ` [Xen-devel] " Sergey Dyasli 2020-01-10 11:46 ` Sergey Dyasli 2020-01-10 13:05 ` kbuild test robot 2020-01-10 13:05 ` kbuild test robot 2020-01-10 13:05 ` [Xen-devel] " kbuild test robot 2020-01-10 17:19 ` kbuild test robot 2020-01-10 17:19 ` kbuild test robot 2020-01-10 17:19 ` [Xen-devel] " kbuild test robot 2020-01-08 15:20 ` [PATCH v1 3/4] xen: teach KASAN about grant tables Sergey Dyasli 2020-01-08 15:20 ` [Xen-devel] " Sergey Dyasli 2020-01-08 15:21 ` [PATCH v1 4/4] xen/netback: Fix grant copy across page boundary with KASAN Sergey Dyasli 2020-01-08 15:21 ` [Xen-devel] " Sergey Dyasli 2020-01-09 10:33 ` Vlastimil Babka 2020-01-09 10:33 ` [Xen-devel] " Vlastimil Babka 2020-01-15 11:02 ` Sergey Dyasli 2020-01-15 11:02 ` [Xen-devel] " Sergey Dyasli 2020-01-15 11:02 ` Sergey Dyasli 2020-01-09 13:36 ` Paul Durrant 2020-01-09 13:36 ` [Xen-devel] " Paul Durrant 2020-01-09 13:36 ` Paul Durrant 2020-01-10 14:27 ` Sergey Dyasli 2020-01-10 14:27 ` [Xen-devel] " Sergey Dyasli 2020-01-10 14:27 ` Sergey Dyasli
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200108152100.7630-2-sergey.dyasli@citrix.com \ --to=sergey.dyasli@citrix.com \ --cc=akpm@linux-foundation.org \ --cc=aryabinin@virtuozzo.com \ --cc=boris.ostrovsky@oracle.com \ --cc=dvyukov@google.com \ --cc=george.dunlap@citrix.com \ --cc=glider@google.com \ --cc=jgross@suse.com \ --cc=kasan-dev@googlegroups.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=ross.lagerwall@citrix.com \ --cc=sstabellini@kernel.org \ --cc=xen-devel@lists.xen.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.