* [PATCH v2 0/3] arm/arm64: Add dirty page logging for ARMv8 (3.17.0-rc1)
@ 2014-11-15 8:19 m.smarduch at samsung.com
2014-11-15 8:19 ` [PATCH v2 1/3] KVM: arm64: ARMv8 header changes for page logging m.smarduch at samsung.com
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: m.smarduch at samsung.com @ 2014-11-15 8:19 UTC (permalink / raw)
To: linux-arm-kernel
From: Mario Smarduch <m.smarduch@samsung.com>
This patch series adds support for ARMv8 dirty page logging. It applies on top
of ARMv7 patch series. This feature hooks into generic dirty page logging,
and reuses earlier ARMv7 architecture support added with few ARMv8 additions.
Testing:
--------
- ARMv8 - Tested on Foundation Model.
- ARMv7 - retested on Exynos 5440 development board.
Test Description:
- Added mmio device to QEMU 'machvirt' with on board memory (1MB in this case),
Device memory is Posix shared memory segment visible to host. Enabled
dirty logging for that memslot.
- Added memslot migration thread to export dirty bit map to host.
- Implemented memory migration thread on host.
Operation:
o On Guest application mmaps() the region (via /dev/mem) and dirties pages.
o The host migration thread does a pre-copy of /dev/shm/aeshmem to a host
file, repeatedly requests QEMU for memory region dirty page log,
incrementally copies dirty pages from /dev/shm/aeshmem to host file.
o Guest application is stopped and both /dev/shm/aeshmem and host file are
checksummed to check for match to validate dirty page log applied
incremental updates, validating logging.
See https://github.com/mjsmar/arm-dirtylog-tests 'v8' subfolder
ARMv7/v8 Dirty page logging implementation overivew-
- initially write protects memory region pages 2nd stage page tables
- add support to read dirty page log and again write protect dirty pages
for next pass.
- second stage huge page are dissolved into small page tables to keep track of
dirty pages at page granularity. Tracking at huge page granularity limits
migration to an almost idle system. Small page size logging supports higher
memory dirty rates.
- In the event migration is canceled, normal behavior is resumed huge pages
are rebuilt over time.
Changes Since (v1):
- Rebased to ARMv7 version
- Addressed Christoffers review comments.
Mario Smarduch (3):
KVM: arm64: ARMv8 header changes for page logging
KVM: arm64: Add HYP interface to flush VM Stage 1/2nd TLB entires
KVM: arm/arm64: Enable Dirty Page logging for ARMv8
arch/arm/include/asm/kvm_host.h | 12 ------------
arch/arm/kvm/arm.c | 4 ----
arch/arm/kvm/mmu.c | 20 +++++++++++---------
arch/arm64/include/asm/kvm_asm.h | 1 +
arch/arm64/include/asm/kvm_host.h | 1 +
arch/arm64/include/asm/kvm_mmu.h | 20 ++++++++++++++++++++
arch/arm64/include/asm/pgtable-hwdef.h | 1 +
arch/arm64/kvm/Kconfig | 2 ++
arch/arm64/kvm/hyp.S | 22 ++++++++++++++++++++++
9 files changed, 58 insertions(+), 25 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/3] KVM: arm64: ARMv8 header changes for page logging
2014-11-15 8:19 [PATCH v2 0/3] arm/arm64: Add dirty page logging for ARMv8 (3.17.0-rc1) m.smarduch at samsung.com
@ 2014-11-15 8:19 ` m.smarduch at samsung.com
2014-11-22 20:01 ` Christoffer Dall
2014-11-15 8:19 ` [PATCH v2 2/3] KVM: arm64: Add HYP interface to flush VM TLB entires m.smarduch at samsung.com
2014-11-15 8:19 ` [PATCH v2 3/3] KVM: arm/arm64: Enable Dirty Page logging for ARMv8 m.smarduch at samsung.com
2 siblings, 1 reply; 8+ messages in thread
From: m.smarduch at samsung.com @ 2014-11-15 8:19 UTC (permalink / raw)
To: linux-arm-kernel
From: Mario Smarduch <m.smarduch@samsung.com>
This patch adds arm64 helpers to write protect pmds/ptes and retrieve
permissions while logging dirty pages. Also adds prototype to write protect
a memory slot and adds a pmd define to check for read-only pmds.
Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
---
arch/arm64/include/asm/kvm_asm.h | 1 +
arch/arm64/include/asm/kvm_host.h | 1 +
arch/arm64/include/asm/kvm_mmu.h | 20 ++++++++++++++++++++
arch/arm64/include/asm/pgtable-hwdef.h | 1 +
4 files changed, 23 insertions(+)
diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h
index 4838421..4f7310f 100644
--- a/arch/arm64/include/asm/kvm_asm.h
+++ b/arch/arm64/include/asm/kvm_asm.h
@@ -126,6 +126,7 @@ extern char __kvm_hyp_vector[];
extern void __kvm_flush_vm_context(void);
extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
+extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index e10c45a..7548dbc 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -196,6 +196,7 @@ struct kvm_vcpu *kvm_arm_get_running_vcpu(void);
struct kvm_vcpu __percpu **kvm_get_running_vcpus(void);
u64 kvm_call_hyp(void *hypfn, ...);
+void kvm_mmu_wp_memory_region(struct kvm *kvm, int slot);
int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,
int exception_index);
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
index 8e138c7..8b0ffe3 100644
--- a/arch/arm64/include/asm/kvm_mmu.h
+++ b/arch/arm64/include/asm/kvm_mmu.h
@@ -121,6 +121,26 @@ static inline void kvm_set_s2pmd_writable(pmd_t *pmd)
pmd_val(*pmd) |= PMD_S2_RDWR;
}
+static inline void kvm_set_s2pte_readonly(pte_t *pte)
+{
+ pte_val(*pte) = (pte_val(*pte) & ~PTE_S2_RDWR) | PTE_S2_RDONLY;
+}
+
+static inline bool kvm_s2pte_readonly(pte_t *pte)
+{
+ return (pte_val(*pte) & PTE_S2_RDWR) == PTE_S2_RDONLY;
+}
+
+static inline void kvm_set_s2pmd_readonly(pmd_t *pmd)
+{
+ pmd_val(*pmd) = (pmd_val(*pmd) & ~PMD_S2_RDWR) | PMD_S2_RDONLY;
+}
+
+static inline bool kvm_s2pmd_readonly(pmd_t *pmd)
+{
+ return (pmd_val(*pmd) & PMD_S2_RDWR) == PMD_S2_RDONLY;
+}
+
#define kvm_pgd_addr_end(addr, end) pgd_addr_end(addr, end)
#define kvm_pud_addr_end(addr, end) pud_addr_end(addr, end)
#define kvm_pmd_addr_end(addr, end) pmd_addr_end(addr, end)
diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h
index 88174e0..5f930cc 100644
--- a/arch/arm64/include/asm/pgtable-hwdef.h
+++ b/arch/arm64/include/asm/pgtable-hwdef.h
@@ -119,6 +119,7 @@
#define PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[2:1] */
#define PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */
+#define PMD_S2_RDONLY (_AT(pmdval_t, 1) << 6) /* HAP[2:1] */
#define PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */
/*
--
1.9.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 2/3] KVM: arm64: Add HYP interface to flush VM TLB entires
2014-11-15 8:19 [PATCH v2 0/3] arm/arm64: Add dirty page logging for ARMv8 (3.17.0-rc1) m.smarduch at samsung.com
2014-11-15 8:19 ` [PATCH v2 1/3] KVM: arm64: ARMv8 header changes for page logging m.smarduch at samsung.com
@ 2014-11-15 8:19 ` m.smarduch at samsung.com
2014-11-15 8:19 ` [PATCH v2 3/3] KVM: arm/arm64: Enable Dirty Page logging for ARMv8 m.smarduch at samsung.com
2 siblings, 0 replies; 8+ messages in thread
From: m.smarduch at samsung.com @ 2014-11-15 8:19 UTC (permalink / raw)
To: linux-arm-kernel
From: Mario Smarduch <m.smarduch@samsung.com>
This patch adds support for arm64 hyp interface to flush all TLBs associated
with VMID.
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
---
arch/arm64/kvm/hyp.S | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S
index b72aa9f..6e1b5df 100644
--- a/arch/arm64/kvm/hyp.S
+++ b/arch/arm64/kvm/hyp.S
@@ -1030,6 +1030,28 @@ ENTRY(__kvm_tlb_flush_vmid_ipa)
ret
ENDPROC(__kvm_tlb_flush_vmid_ipa)
+/**
+ * void __kvm_tlb_flush_vmid(struct kvm *kvm) - Flush per-VMID TLBs
+ * @struct kvm *kvm - pointer to kvm structure
+ *
+ * Invalidates all Stage 1 and 2 TLB entries for current VMID.
+ */
+ENTRY(__kvm_tlb_flush_vmid)
+ dsb ishst
+
+ kern_hyp_va x0
+ ldr x2, [x0, #KVM_VTTBR]
+ msr vttbr_el2, x2
+ isb
+
+ tlbi vmalls12e1is
+ dsb ish
+ isb
+
+ msr vttbr_el2, xzr
+ ret
+ENDPROC(__kvm_tlb_flush_vmid)
+
ENTRY(__kvm_flush_vm_context)
dsb ishst
tlbi alle1is
--
1.9.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 3/3] KVM: arm/arm64: Enable Dirty Page logging for ARMv8
2014-11-15 8:19 [PATCH v2 0/3] arm/arm64: Add dirty page logging for ARMv8 (3.17.0-rc1) m.smarduch at samsung.com
2014-11-15 8:19 ` [PATCH v2 1/3] KVM: arm64: ARMv8 header changes for page logging m.smarduch at samsung.com
2014-11-15 8:19 ` [PATCH v2 2/3] KVM: arm64: Add HYP interface to flush VM TLB entires m.smarduch at samsung.com
@ 2014-11-15 8:19 ` m.smarduch at samsung.com
2014-11-22 20:02 ` Christoffer Dall
2 siblings, 1 reply; 8+ messages in thread
From: m.smarduch at samsung.com @ 2014-11-15 8:19 UTC (permalink / raw)
To: linux-arm-kernel
From: Mario Smarduch <m.smarduch@samsung.com>
This patch enables ARMv8 ditry page logging support. Plugs ARMv8 into generic
layer through Kconfig symbol, and drops earlier ARM64 constraints to enable
logging at architecture layer.
Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
---
arch/arm/include/asm/kvm_host.h | 12 ------------
arch/arm/kvm/arm.c | 4 ----
arch/arm/kvm/mmu.c | 20 +++++++++++---------
arch/arm64/kvm/Kconfig | 2 ++
4 files changed, 13 insertions(+), 25 deletions(-)
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
index 8fa6238..21f828e 100644
--- a/arch/arm/include/asm/kvm_host.h
+++ b/arch/arm/include/asm/kvm_host.h
@@ -220,18 +220,6 @@ static inline void __cpu_init_hyp_mode(phys_addr_t boot_pgd_ptr,
kvm_call_hyp((void*)hyp_stack_ptr, vector_ptr, pgd_ptr);
}
-/**
- * kvm_flush_remote_tlbs() - flush all VM TLB entries
- * @kvm: pointer to kvm structure.
- *
- * Interface to HYP function to flush all VM TLB entries without address
- * parameter.
- */
-static inline void kvm_flush_remote_tlbs(struct kvm *kvm)
-{
- kvm_call_hyp(__kvm_tlb_flush_vmid, kvm);
-}
-
static inline int kvm_arch_dev_ioctl_check_extension(long ext)
{
return 0;
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 040c0f3..8d27e94 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -759,7 +759,6 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
*/
int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
{
-#ifdef CONFIG_ARM
int r;
bool is_dirty = false;
@@ -783,9 +782,6 @@ out:
mutex_unlock(&kvm->slots_lock);
return r;
-#else /* ARM64 */
- return -EINVAL;
-#endif
}
static int kvm_vm_ioctl_set_device_addr(struct kvm *kvm,
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index d29de77..95df040 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -52,11 +52,18 @@ static phys_addr_t hyp_idmap_vector;
static bool kvm_get_logging_state(struct kvm_memory_slot *memslot)
{
-#ifdef CONFIG_ARM
return !!memslot->dirty_bitmap;
-#else
- return false;
-#endif
+}
+
+/**
+ * kvm_flush_remote_tlbs() - flush all VM TLB entries for v7/8
+ * @kvm: pointer to kvm structure.
+ *
+ * Interface to HYP function to flush all VM TLB entries
+ */
+inline void kvm_flush_remote_tlbs(struct kvm *kvm)
+{
+ kvm_call_hyp(__kvm_tlb_flush_vmid, kvm);
}
static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
@@ -775,7 +782,6 @@ static bool transparent_hugepage_adjust(pfn_t *pfnp, phys_addr_t *ipap)
return false;
}
-#ifdef CONFIG_ARM
/**
* stage2_wp_ptes - write protect PMD range
* @pmd: pointer to pmd entry
@@ -920,7 +926,6 @@ void kvm_arch_mmu_write_protect_pt_masked(struct kvm *kvm,
stage2_wp_range(kvm, start, end);
}
-#endif
static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
struct kvm_memory_slot *memslot,
@@ -1323,7 +1328,6 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
spin_unlock(&kvm->mmu_lock);
}
-#ifdef CONFIG_ARM
/*
* At this point memslot has been committed and there is an
* allocated dirty_bitmap[], dirty pages will be be tracked while the
@@ -1332,8 +1336,6 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
if (change != KVM_MR_DELETE && change != KVM_MR_MOVE &&
mem->flags & KVM_MEM_LOG_DIRTY_PAGES)
kvm_mmu_wp_memory_region(kvm, mem->slot);
-#endif
-
}
int kvm_arch_prepare_memory_region(struct kvm *kvm,
diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig
index 8ba85e9..3ce389b 100644
--- a/arch/arm64/kvm/Kconfig
+++ b/arch/arm64/kvm/Kconfig
@@ -22,10 +22,12 @@ config KVM
select PREEMPT_NOTIFIERS
select ANON_INODES
select HAVE_KVM_CPU_RELAX_INTERCEPT
+ select HAVE_KVM_ARCH_TLB_FLUSH_ALL
select KVM_MMIO
select KVM_ARM_HOST
select KVM_ARM_VGIC
select KVM_ARM_TIMER
+ select KVM_GENERIC_DIRTYLOG_READ_PROTECT
---help---
Support hosting virtualized guest machines.
--
1.9.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 1/3] KVM: arm64: ARMv8 header changes for page logging
2014-11-15 8:19 ` [PATCH v2 1/3] KVM: arm64: ARMv8 header changes for page logging m.smarduch at samsung.com
@ 2014-11-22 20:01 ` Christoffer Dall
0 siblings, 0 replies; 8+ messages in thread
From: Christoffer Dall @ 2014-11-22 20:01 UTC (permalink / raw)
To: linux-arm-kernel
On Sat, Nov 15, 2014 at 12:19:08AM -0800, m.smarduch at samsung.com wrote:
> From: Mario Smarduch <m.smarduch@samsung.com>
>
> This patch adds arm64 helpers to write protect pmds/ptes and retrieve
> permissions while logging dirty pages. Also adds prototype to write protect
> a memory slot and adds a pmd define to check for read-only pmds.
>
> Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/3] KVM: arm/arm64: Enable Dirty Page logging for ARMv8
2014-11-15 8:19 ` [PATCH v2 3/3] KVM: arm/arm64: Enable Dirty Page logging for ARMv8 m.smarduch at samsung.com
@ 2014-11-22 20:02 ` Christoffer Dall
2014-11-24 21:22 ` Mario Smarduch
0 siblings, 1 reply; 8+ messages in thread
From: Christoffer Dall @ 2014-11-22 20:02 UTC (permalink / raw)
To: linux-arm-kernel
On Sat, Nov 15, 2014 at 12:19:10AM -0800, m.smarduch at samsung.com wrote:
> From: Mario Smarduch <m.smarduch@samsung.com>
>
> This patch enables ARMv8 ditry page logging support. Plugs ARMv8 into generic
> layer through Kconfig symbol, and drops earlier ARM64 constraints to enable
> logging at architecture layer.
>
> Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
Just reminding you again of what I said in the previous thread (think
that was before you sent this out), that you need to handle the pud_huge
case in arch/arm/kvm/mmu.c for ARMv8 here.
-Christoffer
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/3] KVM: arm/arm64: Enable Dirty Page logging for ARMv8
2014-11-22 20:02 ` Christoffer Dall
@ 2014-11-24 21:22 ` Mario Smarduch
2014-11-25 11:10 ` Christoffer Dall
0 siblings, 1 reply; 8+ messages in thread
From: Mario Smarduch @ 2014-11-24 21:22 UTC (permalink / raw)
To: linux-arm-kernel
On 11/22/2014 12:02 PM, Christoffer Dall wrote:
> On Sat, Nov 15, 2014 at 12:19:10AM -0800, m.smarduch at samsung.com wrote:
>> From: Mario Smarduch <m.smarduch@samsung.com>
>>
>> This patch enables ARMv8 ditry page logging support. Plugs ARMv8 into generic
>> layer through Kconfig symbol, and drops earlier ARM64 constraints to enable
>> logging at architecture layer.
>>
>> Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
>
> Just reminding you again of what I said in the previous thread (think
> that was before you sent this out), that you need to handle the pud_huge
> case in arch/arm/kvm/mmu.c for ARMv8 here.
>
> -Christoffer
>
Yes, so like similar handling to what unmap_puds() does when
it encounters a PUD Block?
Should next revision be rebased to 'queued' 3.18.0-rc2?
Thanks.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/3] KVM: arm/arm64: Enable Dirty Page logging for ARMv8
2014-11-24 21:22 ` Mario Smarduch
@ 2014-11-25 11:10 ` Christoffer Dall
0 siblings, 0 replies; 8+ messages in thread
From: Christoffer Dall @ 2014-11-25 11:10 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Nov 24, 2014 at 01:22:16PM -0800, Mario Smarduch wrote:
> On 11/22/2014 12:02 PM, Christoffer Dall wrote:
> > On Sat, Nov 15, 2014 at 12:19:10AM -0800, m.smarduch at samsung.com wrote:
> >> From: Mario Smarduch <m.smarduch@samsung.com>
> >>
> >> This patch enables ARMv8 ditry page logging support. Plugs ARMv8 into generic
> >> layer through Kconfig symbol, and drops earlier ARM64 constraints to enable
> >> logging at architecture layer.
> >>
> >> Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
> >
> > Just reminding you again of what I said in the previous thread (think
> > that was before you sent this out), that you need to handle the pud_huge
> > case in arch/arm/kvm/mmu.c for ARMv8 here.
> >
> > -Christoffer
> >
>
>
> Yes, so like similar handling to what unmap_puds() does when
> it encounters a PUD Block?
yes
>
> Should next revision be rebased to 'queued' 3.18.0-rc2?
>
rebase onto kvmarm/next whenever we move that to kvm/next after the
merge window (keep an eye out), typically it will be 3.19-rc1 + some
stuff from Paolo.
-Christoffer
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2014-11-25 11:10 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-15 8:19 [PATCH v2 0/3] arm/arm64: Add dirty page logging for ARMv8 (3.17.0-rc1) m.smarduch at samsung.com
2014-11-15 8:19 ` [PATCH v2 1/3] KVM: arm64: ARMv8 header changes for page logging m.smarduch at samsung.com
2014-11-22 20:01 ` Christoffer Dall
2014-11-15 8:19 ` [PATCH v2 2/3] KVM: arm64: Add HYP interface to flush VM TLB entires m.smarduch at samsung.com
2014-11-15 8:19 ` [PATCH v2 3/3] KVM: arm/arm64: Enable Dirty Page logging for ARMv8 m.smarduch at samsung.com
2014-11-22 20:02 ` Christoffer Dall
2014-11-24 21:22 ` Mario Smarduch
2014-11-25 11:10 ` Christoffer Dall
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).