Re: [PATCH 2/2] kexec: add a pmd huge entry condition during the page table

2016-07-11 Thread zhong jiang
On 2016/7/12 4:25, Andrew Morton wrote:
> On Mon, 11 Jul 2016 14:36:01 +0800 zhongjiang  wrote:
>
>> From: zhong jiang 
>>
>> 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 set up a pmd huge
>> entry 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.
> Sorry, I just don't understand this changelog.  The second sentence is
> particularly hard.
>
> So can you please have another attempt at preparing the changelog text?
> The resend the patches and this time be sure to Cc the kexec
> maintainers.  I suggest this list:
>
> Cc: ke...@lists.infradead.org
> Cc: Eric Biederman 
> Cc: Dave Young 
> Cc: Vivek Goyal 
> Cc: Simon Horman 
>
>
> .
>
 ok ,  I will modify the changelog and resend to this list. thanks.



Re: [PATCH 2/2] kexec: add a pmd huge entry condition during the page table

2016-07-11 Thread zhong jiang
On 2016/7/12 4:25, Andrew Morton wrote:
> On Mon, 11 Jul 2016 14:36:01 +0800 zhongjiang  wrote:
>
>> From: zhong jiang 
>>
>> 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 set up a pmd huge
>> entry 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.
> Sorry, I just don't understand this changelog.  The second sentence is
> particularly hard.
>
> So can you please have another attempt at preparing the changelog text?
> The resend the patches and this time be sure to Cc the kexec
> maintainers.  I suggest this list:
>
> Cc: ke...@lists.infradead.org
> Cc: Eric Biederman 
> Cc: Dave Young 
> Cc: Vivek Goyal 
> Cc: Simon Horman 
>
>
> .
>
 ok ,  I will modify the changelog and resend to this list. thanks.



Re: [PATCH 2/2] kexec: add a pmd huge entry condition during the page table

2016-07-11 Thread Andrew Morton
On Mon, 11 Jul 2016 14:36:01 +0800 zhongjiang  wrote:

> From: zhong jiang 
> 
> 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 set up a pmd huge
> entry 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.

Sorry, I just don't understand this changelog.  The second sentence is
particularly hard.

So can you please have another attempt at preparing the changelog text?
The resend the patches and this time be sure to Cc the kexec
maintainers.  I suggest this list:

Cc: ke...@lists.infradead.org
Cc: Eric Biederman 
Cc: Dave Young 
Cc: Vivek Goyal 
Cc: Simon Horman 



Re: [PATCH 2/2] kexec: add a pmd huge entry condition during the page table

2016-07-11 Thread Andrew Morton
On Mon, 11 Jul 2016 14:36:01 +0800 zhongjiang  wrote:

> From: zhong jiang 
> 
> 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 set up a pmd huge
> entry 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.

Sorry, I just don't understand this changelog.  The second sentence is
particularly hard.

So can you please have another attempt at preparing the changelog text?
The resend the patches and this time be sure to Cc the kexec
maintainers.  I suggest this list:

Cc: ke...@lists.infradead.org
Cc: Eric Biederman 
Cc: Dave Young 
Cc: Vivek Goyal 
Cc: Simon Horman 



[PATCH 2/2] kexec: add a pmd huge entry condition during the page table

2016-07-11 Thread zhongjiang
From: zhong jiang 

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 set up a pmd huge
entry 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.

Signed-off-by: zhong jiang 
---
 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 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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);
-- 
1.8.3.1



[PATCH 2/2] kexec: add a pmd huge entry condition during the page table

2016-07-11 Thread zhongjiang
From: zhong jiang 

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 set up a pmd huge
entry 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.

Signed-off-by: zhong jiang 
---
 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 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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);
-- 
1.8.3.1