Re: [PATCH v4 5/5] change update_range to handle 4GB 2nd stage range for ARMv7

2014-05-05 Thread Gavin Guo
Hi Mario,

On Tue, Apr 29, 2014 at 9:06 AM, Mario Smarduch m.smard...@samsung.com wrote:

 This patch adds support for unmapping 2nd stage page tables for addresses 4GB
 on ARMv7.

 Signed-off-by: Mario Smarduch m.smard...@samsung.com
 ---
  arch/arm/kvm/mmu.c |   20 
  1 file changed, 12 insertions(+), 8 deletions(-)

 diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
 index 88f5503..afbf8ba 100644
 --- a/arch/arm/kvm/mmu.c
 +++ b/arch/arm/kvm/mmu.c
 @@ -176,21 +176,25 @@ static void clear_pte_entry(struct kvm *kvm, pte_t 
 *pte, phys_addr_t addr)
 }
  }

 +/* Function shared between identity and 2nd stage mappings. For 2nd stage
 + * the IPA may be  4GB on ARMv7, and page table range functions
 + * will fail. kvm_xxx_addr_end() is used to handle both cases.
 + */
  static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
 -   unsigned long long start, u64 size)
 +   phys_addr_t start, u64 size)
  {
 pgd_t *pgd;
 pud_t *pud;
 pmd_t *pmd;
 pte_t *pte;
 -   unsigned long long addr = start, end = start + size;
 -   u64 next;
 +   phys_addr_t addr = start, end = start + size;
 +   phys_addr_t next;

 while (addr  end) {
 pgd = pgdp + pgd_index(addr);
 pud = pud_offset(pgd, addr);
 if (pud_none(*pud)) {
 -   addr = pud_addr_end(addr, end);
 +   addr = kvm_pud_addr_end(addr, end);
 continue;
 }

 @@ -200,13 +204,13 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
  * move on.
  */
 clear_pud_entry(kvm, pud, addr);
 -   addr = pud_addr_end(addr, end);
 +   addr = kvm_pud_addr_end(addr, end);
 continue;
 }

 pmd = pmd_offset(pud, addr);
 if (pmd_none(*pmd)) {
 -   addr = pmd_addr_end(addr, end);
 +   addr = kvm_pmd_addr_end(addr, end);
 continue;
 }

 @@ -221,10 +225,10 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
  */
 if (kvm_pmd_huge(*pmd) || page_empty(pte)) {
 clear_pmd_entry(kvm, pmd, addr);
 -   next = pmd_addr_end(addr, end);
 +   next = kvm_pmd_addr_end(addr, end);
 if (page_empty(pmd)  !page_empty(pud)) {
 clear_pud_entry(kvm, pud, addr);
 -   next = pud_addr_end(addr, end);
 +   next = kvm_pud_addr_end(addr, end);
 }
 }

 --
 1.7.9.5




It seems that your adding kvm_pmd_addr_end(addr, end) already exists
in the following patch and may need to remove these parts from your
patch.

commit a3c8bd31af260a17d626514f636849ee1cd1f63e
Author: Marc Zyngier marc.zyng...@arm.com
Date:   Tue Feb 18 14:29:03 2014 +

ARM: KVM: introduce kvm_p*d_addr_end

The use of p*d_addr_end with stage-2 translation is slightly dodgy,
as the IPA is 40bits, while all the p*d_addr_end helpers are
taking an unsigned long (arm64 is fine with that as unligned long
is 64bit).

The fix is to introduce 64bit clean versions of the same helpers,
and use them in the stage-2 page table code.

Signed-off-by: Marc Zyngier marc.zyng...@arm.com
Acked-by: Catalin Marinas catalin.mari...@arm.com
Reviewed-by: Christoffer Dall christoffer.d...@linaro.org

Gavin
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v4 5/5] change update_range to handle 4GB 2nd stage range for ARMv7

2014-05-05 Thread Mario Smarduch
Hi Gavin,
   thanks, didn't catch that, I'll remove these calls.

- Mario

On 05/05/2014 04:34 PM, Gavin Guo wrote:
 Hi Mario,
 
 On Tue, Apr 29, 2014 at 9:06 AM, Mario Smarduch m.smard...@samsung.com 
 wrote:

 This patch adds support for unmapping 2nd stage page tables for addresses 
 4GB
 on ARMv7.

 Signed-off-by: Mario Smarduch m.smard...@samsung.com
 ---
  arch/arm/kvm/mmu.c |   20 
  1 file changed, 12 insertions(+), 8 deletions(-)

 diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
 index 88f5503..afbf8ba 100644
 --- a/arch/arm/kvm/mmu.c
 +++ b/arch/arm/kvm/mmu.c
 @@ -176,21 +176,25 @@ static void clear_pte_entry(struct kvm *kvm, pte_t 
 *pte, phys_addr_t addr)
 }
  }

 +/* Function shared between identity and 2nd stage mappings. For 2nd stage
 + * the IPA may be  4GB on ARMv7, and page table range functions
 + * will fail. kvm_xxx_addr_end() is used to handle both cases.
 + */
  static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
 -   unsigned long long start, u64 size)
 +   phys_addr_t start, u64 size)
  {
 pgd_t *pgd;
 pud_t *pud;
 pmd_t *pmd;
 pte_t *pte;
 -   unsigned long long addr = start, end = start + size;
 -   u64 next;
 +   phys_addr_t addr = start, end = start + size;
 +   phys_addr_t next;

 while (addr  end) {
 pgd = pgdp + pgd_index(addr);
 pud = pud_offset(pgd, addr);
 if (pud_none(*pud)) {
 -   addr = pud_addr_end(addr, end);
 +   addr = kvm_pud_addr_end(addr, end);
 continue;
 }

 @@ -200,13 +204,13 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
  * move on.
  */
 clear_pud_entry(kvm, pud, addr);
 -   addr = pud_addr_end(addr, end);
 +   addr = kvm_pud_addr_end(addr, end);
 continue;
 }

 pmd = pmd_offset(pud, addr);
 if (pmd_none(*pmd)) {
 -   addr = pmd_addr_end(addr, end);
 +   addr = kvm_pmd_addr_end(addr, end);
 continue;
 }

 @@ -221,10 +225,10 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
  */
 if (kvm_pmd_huge(*pmd) || page_empty(pte)) {
 clear_pmd_entry(kvm, pmd, addr);
 -   next = pmd_addr_end(addr, end);
 +   next = kvm_pmd_addr_end(addr, end);
 if (page_empty(pmd)  !page_empty(pud)) {
 clear_pud_entry(kvm, pud, addr);
 -   next = pud_addr_end(addr, end);
 +   next = kvm_pud_addr_end(addr, end);
 }
 }

 --
 1.7.9.5



 
 It seems that your adding kvm_pmd_addr_end(addr, end) already exists
 in the following patch and may need to remove these parts from your
 patch.
 
 commit a3c8bd31af260a17d626514f636849ee1cd1f63e
 Author: Marc Zyngier marc.zyng...@arm.com
 Date:   Tue Feb 18 14:29:03 2014 +
 
 ARM: KVM: introduce kvm_p*d_addr_end
 
 The use of p*d_addr_end with stage-2 translation is slightly dodgy,
 as the IPA is 40bits, while all the p*d_addr_end helpers are
 taking an unsigned long (arm64 is fine with that as unligned long
 is 64bit).
 
 The fix is to introduce 64bit clean versions of the same helpers,
 and use them in the stage-2 page table code.
 
 Signed-off-by: Marc Zyngier marc.zyng...@arm.com
 Acked-by: Catalin Marinas catalin.mari...@arm.com
 Reviewed-by: Christoffer Dall christoffer.d...@linaro.org
 
 Gavin
 

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v4 5/5] change update_range to handle 4GB 2nd stage range for ARMv7

2014-04-28 Thread Mario Smarduch

This patch adds support for unmapping 2nd stage page tables for addresses 4GB
on ARMv7.

Signed-off-by: Mario Smarduch m.smard...@samsung.com
---
 arch/arm/kvm/mmu.c |   20 
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 88f5503..afbf8ba 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -176,21 +176,25 @@ static void clear_pte_entry(struct kvm *kvm, pte_t *pte, 
phys_addr_t addr)
}
 }
 
+/* Function shared between identity and 2nd stage mappings. For 2nd stage
+ * the IPA may be  4GB on ARMv7, and page table range functions
+ * will fail. kvm_xxx_addr_end() is used to handle both cases.
+ */
 static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
-   unsigned long long start, u64 size)
+   phys_addr_t start, u64 size)
 {
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
pte_t *pte;
-   unsigned long long addr = start, end = start + size;
-   u64 next;
+   phys_addr_t addr = start, end = start + size;
+   phys_addr_t next;
 
while (addr  end) {
pgd = pgdp + pgd_index(addr);
pud = pud_offset(pgd, addr);
if (pud_none(*pud)) {
-   addr = pud_addr_end(addr, end);
+   addr = kvm_pud_addr_end(addr, end);
continue;
}
 
@@ -200,13 +204,13 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
 * move on.
 */
clear_pud_entry(kvm, pud, addr);
-   addr = pud_addr_end(addr, end);
+   addr = kvm_pud_addr_end(addr, end);
continue;
}
 
pmd = pmd_offset(pud, addr);
if (pmd_none(*pmd)) {
-   addr = pmd_addr_end(addr, end);
+   addr = kvm_pmd_addr_end(addr, end);
continue;
}
 
@@ -221,10 +225,10 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
 */
if (kvm_pmd_huge(*pmd) || page_empty(pte)) {
clear_pmd_entry(kvm, pmd, addr);
-   next = pmd_addr_end(addr, end);
+   next = kvm_pmd_addr_end(addr, end);
if (page_empty(pmd)  !page_empty(pud)) {
clear_pud_entry(kvm, pud, addr);
-   next = pud_addr_end(addr, end);
+   next = kvm_pud_addr_end(addr, end);
}
}
 
-- 
1.7.9.5



--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html