KVM page tables are currently not RCU safe against remapping, i.e.,
kvmppc_unmap_free_pmd_entry_table() et al. The previous
mmu_notifier_ops members rely on kvm->mmu_lock to synchronize with
that operation.

However, the new mmu_notifier_ops member test_clear_young() provides
a fast path that does not take kvm->mmu_lock. To implement
kvm_arch_test_clear_young() for that path, orphan page tables need to
be freed by RCU.

Unmapping, specifically kvm_unmap_radix(), does not free page tables,
hence not a concern.

Signed-off-by: Yu Zhao <yuz...@google.com>
---
 arch/powerpc/kvm/book3s_64_mmu_radix.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c 
b/arch/powerpc/kvm/book3s_64_mmu_radix.c
index 461307b89c3a..3b65b3b11041 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_radix.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c
@@ -1469,13 +1469,15 @@ int kvmppc_radix_init(void)
 {
        unsigned long size = sizeof(void *) << RADIX_PTE_INDEX_SIZE;
 
-       kvm_pte_cache = kmem_cache_create("kvm-pte", size, size, 0, pte_ctor);
+       kvm_pte_cache = kmem_cache_create("kvm-pte", size, size,
+                                         SLAB_TYPESAFE_BY_RCU, pte_ctor);
        if (!kvm_pte_cache)
                return -ENOMEM;
 
        size = sizeof(void *) << RADIX_PMD_INDEX_SIZE;
 
-       kvm_pmd_cache = kmem_cache_create("kvm-pmd", size, size, 0, pmd_ctor);
+       kvm_pmd_cache = kmem_cache_create("kvm-pmd", size, size,
+                                         SLAB_TYPESAFE_BY_RCU, pmd_ctor);
        if (!kvm_pmd_cache) {
                kmem_cache_destroy(kvm_pte_cache);
                return -ENOMEM;
-- 
2.41.0.rc0.172.g3f132b7071-goog

Reply via email to