From: ebiederm@xmission.com (Eric W. Biederman)
To: zhongjiang <zhongjiang@huawei.com>
Cc: dyoung@redhat.com, horms@verge.net.au, vgoyal@redhat.com,
yinghai@kernel.org, akpm@linux-foundation.org,
linux-mm@kvack.org, kexec@lists.infradead.org
Subject: Re: [PATCH 2/2] kexec: add a pmd huge entry condition during the page table
Date: Tue, 12 Jul 2016 10:46:17 -0500 [thread overview]
Message-ID: <87a8hm3lme.fsf@x220.int.ebiederm.org> (raw)
In-Reply-To: <1468299403-27954-2-git-send-email-zhongjiang@huawei.com> (zhongjiang@huawei.com's message of "Tue, 12 Jul 2016 12:56:43 +0800")
zhongjiang <zhongjiang@huawei.com> writes:
> From: zhong jiang <zhongjiang@huawei.com>
>
> when image is loaded into kernel, we need set up page table for it. and
> all valid pfn also set up new mapping. it will tend to establish a pmd
> page table in the form of a large page if pud_present is true. relocate_kernel
> points to code segment can locate in the pmd huge entry in init_transtion_pgtable.
> therefore, we need to take the situation into account.
I can see how in theory this might be necessary but when is a kernel virtual
address on x86_64 that is above 0x8000000000000000 in conflict with an
identity mapped physicall address that are all below 0x8000000000000000?
If anything the code could be simplified to always assume those mappings
are unoccupied.
Did you run into an actual failure somewhere?
Eric
> Signed-off-by: zhong jiang <zhongjiang@huawei.com>
> ---
> arch/x86/kernel/machine_kexec_64.c | 20 ++++++++++++++++++--
> 1 file changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
> index 5a294e4..c33e344 100644
> --- a/arch/x86/kernel/machine_kexec_64.c
> +++ b/arch/x86/kernel/machine_kexec_64.c
> @@ -14,6 +14,7 @@
> #include <linux/gfp.h>
> #include <linux/reboot.h>
> #include <linux/numa.h>
> +#include <linux/hugetlb.h>
> #include <linux/ftrace.h>
> #include <linux/io.h>
> #include <linux/suspend.h>
> @@ -34,6 +35,17 @@ static struct kexec_file_ops *kexec_file_loaders[] = {
> };
> #endif
>
> +static void split_pmd(pmd_t *pmd, pte_t *pte)
> +{
> + unsigned long pfn = pmd_pfn(*pmd);
> + int i = 0;
> +
> + do {
> + set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC));
> + pfn++;
> + } while (pte++, i++, i < PTRS_PER_PTE);
> +}
> +
> static void free_transition_pgtable(struct kimage *image)
> {
> free_page((unsigned long)image->arch.pud);
> @@ -68,15 +80,19 @@ static int init_transition_pgtable(struct kimage *image, pgd_t *pgd)
> set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE));
> }
> pmd = pmd_offset(pud, vaddr);
> - if (!pmd_present(*pmd)) {
> + if (!pmd_present(*pmd) || pmd_huge(*pmd)) {
> pte = (pte_t *)get_zeroed_page(GFP_KERNEL);
> if (!pte)
> goto err;
> image->arch.pte = pte;
> - set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE));
> + if (pmd_huge(*pmd))
> + split_pmd(pmd, pte);
> + else
> + set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE));
> }
> pte = pte_offset_kernel(pmd, vaddr);
> set_pte(pte, pfn_pte(paddr >> PAGE_SHIFT, PAGE_KERNEL_EXEC));
> +
> return 0;
> err:
> free_transition_pgtable(image);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2016-07-12 15:58 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-12 4:56 [PATCH 1/2] kexec: remove unnecessary unusable_pages zhongjiang
2016-07-12 4:56 ` [PATCH 2/2] kexec: add a pmd huge entry condition during the page table zhongjiang
2016-07-12 15:46 ` Eric W. Biederman [this message]
2016-07-13 7:01 ` zhong jiang
2016-07-14 13:19 ` Eric W. Biederman
2016-07-20 7:25 ` zhong jiang
2016-07-12 15:19 ` [PATCH 1/2] kexec: remove unnecessary unusable_pages Eric W. Biederman
2016-07-13 4:08 ` zhong jiang
2016-07-13 5:07 ` Eric W. Biederman
2016-07-13 7:07 ` zhong jiang
-- strict thread matches above, loose matches on Subject: below --
2016-07-11 6:36 zhongjiang
2016-07-11 6:36 ` [PATCH 2/2] kexec: add a pmd huge entry condition during the page table zhongjiang
2016-07-11 20:25 ` Andrew Morton
2016-07-12 2:21 ` zhong jiang
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=87a8hm3lme.fsf@x220.int.ebiederm.org \
--to=ebiederm@xmission.com \
--cc=akpm@linux-foundation.org \
--cc=dyoung@redhat.com \
--cc=horms@verge.net.au \
--cc=kexec@lists.infradead.org \
--cc=linux-mm@kvack.org \
--cc=vgoyal@redhat.com \
--cc=yinghai@kernel.org \
--cc=zhongjiang@huawei.com \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox