[PATCH] KVM swapping (+ seqlock fix) with mmu notifiers #v6

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Andrea Arcangeli
Date: Wednesday, February 20, 2008 - 3:45 am

This is the same as before but against the mmu notifier #v6 patch,
running on top of 2.6.25-rc latest, and in this last update I fixed
the last race condition with a seqlock. I described the exact fix in a
earlier email, in short the seqlock-write is in the
invalidate_page/pages, and the reader will re-issue gfn_to_page if it
finds a seqlock read failure (see the change to paging_tmpl.h). With
this on top of mmu notifier #v6 there are no more practical or
theoretical known problems, nor in the kvm swapping, nor in the mmu
notifier patch (which also supports all sleeping users not just KVM,
without requiring a page pin).

Signed-off-by: Andrea Arcangeli <andrea@qumranet.com>

diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig
index 41962e7..e1287ab 100644
--- a/arch/x86/kvm/Kconfig
+++ b/arch/x86/kvm/Kconfig
@@ -21,6 +21,7 @@ config KVM
 	tristate "Kernel-based Virtual Machine (KVM) support"
 	depends on HAVE_KVM && EXPERIMENTAL
 	select PREEMPT_NOTIFIERS
+	select MMU_NOTIFIER
 	select ANON_INODES
 	---help---
 	  Support hosting fully virtualized guest machines using hardware
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 6656efa..9151d64 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -533,6 +533,110 @@ static void rmap_write_protect(struct kvm *kvm, u64 gfn)
 		kvm_flush_remote_tlbs(kvm);
 }
 
+static void kvm_unmap_spte(struct kvm *kvm, u64 *spte)
+{
+	struct page *page = pfn_to_page((*spte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT);
+	get_page(page);
+	rmap_remove(kvm, spte);
+	set_shadow_pte(spte, shadow_trap_nonpresent_pte);
+	kvm_flush_remote_tlbs(kvm);
+	__free_page(page);
+}
+
+static void kvm_unmap_rmapp(struct kvm *kvm, unsigned long *rmapp)
+{
+	u64 *spte, *curr_spte;
+
+	spte = rmap_next(kvm, rmapp, NULL);
+	while (spte) {
+		BUG_ON(!(*spte & PT_PRESENT_MASK));
+		rmap_printk("kvm_rmap_unmap_hva: spte %p %llx\n", spte, *spte);
+		curr_spte = spte;
+		spte = rmap_next(kvm, rmapp, spte);
+		kvm_unmap_spte(kvm, curr_spte);
+	}
+}
+
+void kvm_unmap_hva(struct kvm *kvm, unsigned long hva)
+{
+	int i;
+
+	/*
+	 * If mmap_sem isn't taken, we can look the memslots with only
+	 * the mmu_lock by skipping over the slots with userspace_addr == 0.
+	 */
+	spin_lock(&kvm->mmu_lock);
+	for (i = 0; i < kvm->nmemslots; i++) {
+		struct kvm_memory_slot *memslot = &kvm->memslots[i];
+		unsigned long start = memslot->userspace_addr;
+		unsigned long end;
+
+		/* mmu_lock protects userspace_addr */
+		if (!start)
+			continue;
+
+		end = start + (memslot->npages << PAGE_SHIFT);
+		if (hva >= start && hva < end) {
+			gfn_t gfn_offset = (hva - start) >> PAGE_SHIFT;
+			kvm_unmap_rmapp(kvm, &memslot->rmap[gfn_offset]);
+		}
+	}
+	spin_unlock(&kvm->mmu_lock);
+}
+
+static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp)
+{
+	u64 *spte;
+	int young = 0;
+
+	spte = rmap_next(kvm, rmapp, NULL);
+	while (spte) {
+		int _young;
+		u64 _spte = *spte;
+		BUG_ON(!(_spte & PT_PRESENT_MASK));
+		_young = _spte & PT_ACCESSED_MASK;
+		if (_young) {
+			young = !!_young;
+			set_shadow_pte(spte, _spte & ~PT_ACCESSED_MASK);
+		}
+		spte = rmap_next(kvm, rmapp, spte);
+	}
+	return young;
+}
+
+int kvm_age_hva(struct kvm *kvm, unsigned long hva)
+{
+	int i;
+	int young = 0;
+
+	/*
+	 * If mmap_sem isn't taken, we can look the memslots with only
+	 * the mmu_lock by skipping over the slots with userspace_addr == 0.
+	 */
+	spin_lock(&kvm->mmu_lock);
+	for (i = 0; i < kvm->nmemslots; i++) {
+		struct kvm_memory_slot *memslot = &kvm->memslots[i];
+		unsigned long start = memslot->userspace_addr;
+		unsigned long end;
+
+		/* mmu_lock protects userspace_addr */
+		if (!start)
+			continue;
+
+		end = start + (memslot->npages << PAGE_SHIFT);
+		if (hva >= start && hva < end) {
+			gfn_t gfn_offset = (hva - start) >> PAGE_SHIFT;
+			young |= kvm_age_rmapp(kvm, &memslot->rmap[gfn_offset]);
+		}
+	}
+	spin_unlock(&kvm->mmu_lock);
+
+	if (young)
+		kvm_flush_remote_tlbs(kvm);
+
+	return young;
+}
+
 #ifdef MMU_DEBUG
 static int is_empty_shadow_page(u64 *spt)
 {
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
index cdafce3..6d09d13 100644
--- a/arch/x86/kvm/paging_tmpl.h
+++ b/arch/x86/kvm/paging_tmpl.h
@@ -370,6 +370,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
 	int write_pt = 0;
 	int r;
 	struct page *page;
+	unsigned mmu_seq;
 
 	pgprintk("%s: addr %lx err %x\n", __FUNCTION__, addr, error_code);
 	kvm_mmu_audit(vcpu, "pre page fault");
@@ -397,6 +398,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
 	}
 
 	down_read(&current->mm->mmap_sem);
+	mmu_seq = read_seqbegin(&vcpu->kvm->arch.mmu_notifier_invalidate_lock);
 	page = gfn_to_page(vcpu->kvm, walker.gfn);
 	up_read(&current->mm->mmap_sem);
 
@@ -421,6 +423,15 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
 	++vcpu->stat.pf_fixed;
 	kvm_mmu_audit(vcpu, "post page fault (fixed)");
 	spin_unlock(&vcpu->kvm->mmu_lock);
+
+	if (read_seqretry(&vcpu->kvm->arch.mmu_notifier_invalidate_lock, mmu_seq)) {
+		down_read(&current->mm->mmap_sem);
+		if (page != gfn_to_page(vcpu->kvm, walker.gfn))
+			BUG();
+		up_read(&current->mm->mmap_sem);
+		kvm_release_page_clean(page);
+	}
+
 	up_read(&vcpu->kvm->slots_lock);
 
 	return write_pt;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index dc8d538..f2594be 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3279,6 +3279,47 @@ void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu)
 	free_page((unsigned long)vcpu->arch.pio_data);
 }
 
+static inline struct kvm *mmu_notifier_to_kvm(struct mmu_notifier *mn)
+{
+	struct kvm_arch *kvm_arch;
+	kvm_arch = container_of(mn, struct kvm_arch, mmu_notifier);
+	return container_of(kvm_arch, struct kvm, arch);
+}
+
+void kvm_mmu_notifier_invalidate_page(struct mmu_notifier *mn,
+				      struct mm_struct *mm,
+				      unsigned long address)
+{
+	struct kvm *kvm = mmu_notifier_to_kvm(mn);
+	BUG_ON(mm != kvm->mm);
+	write_seqlock(&kvm->arch.mmu_notifier_invalidate_lock);
+	kvm_unmap_hva(kvm, address);
+	write_sequnlock(&kvm->arch.mmu_notifier_invalidate_lock);
+}
+
+void kvm_mmu_notifier_invalidate_pages(struct mmu_notifier *mn,
+				       struct mm_struct *mm,
+				       unsigned long start, unsigned long end)
+{
+	for (; start < end; start += PAGE_SIZE)
+		kvm_mmu_notifier_invalidate_page(mn, mm, start);
+}
+
+int kvm_mmu_notifier_age_page(struct mmu_notifier *mn,
+			      struct mm_struct *mm,
+			      unsigned long address)
+{
+	struct kvm *kvm = mmu_notifier_to_kvm(mn);
+	BUG_ON(mm != kvm->mm);
+	return kvm_age_hva(kvm, address);
+}
+
+static const struct mmu_notifier_ops kvm_mmu_notifier_ops = {
+	.invalidate_page	= kvm_mmu_notifier_invalidate_page,
+	.invalidate_pages	= kvm_mmu_notifier_invalidate_pages,
+	.age_page		= kvm_mmu_notifier_age_page,
+};
+
 struct  kvm *kvm_arch_create_vm(void)
 {
 	struct kvm *kvm = kzalloc(sizeof(struct kvm), GFP_KERNEL);
@@ -3288,6 +3329,10 @@ struct  kvm *kvm_arch_create_vm(void)
 
 	INIT_LIST_HEAD(&kvm->arch.active_mmu_pages);
 
+	kvm->arch.mmu_notifier.ops = &kvm_mmu_notifier_ops;
+	mmu_notifier_register(&kvm->arch.mmu_notifier, current->mm);
+	seqlock_init(&kvm->arch.mmu_notifier_invalidate_lock);
+
 	return kvm;
 }
 
diff --git a/include/asm-x86/kvm_host.h b/include/asm-x86/kvm_host.h
index 0c429c8..306beaa 100644
--- a/include/asm-x86/kvm_host.h
+++ b/include/asm-x86/kvm_host.h
@@ -13,6 +13,7 @@
 
 #include <linux/types.h>
 #include <linux/mm.h>
+#include <linux/mmu_notifier.h>
 
 #include <linux/kvm.h>
 #include <linux/kvm_para.h>
@@ -294,6 +295,9 @@ struct kvm_arch{
 	struct page *apic_access_page;
 
 	gpa_t wall_clock;
+
+	struct mmu_notifier mmu_notifier;
+	seqlock_t mmu_notifier_invalidate_lock;
 };
 
 struct kvm_vm_stat {
@@ -411,6 +415,8 @@ int kvm_mmu_create(struct kvm_vcpu *vcpu);
 int kvm_mmu_setup(struct kvm_vcpu *vcpu);
 void kvm_mmu_set_nonpresent_ptes(u64 trap_pte, u64 notrap_pte);
 
+void kvm_unmap_hva(struct kvm *kvm, unsigned long hva);
+int kvm_age_hva(struct kvm *kvm, unsigned long hva);
 int kvm_mmu_reset_context(struct kvm_vcpu *vcpu);
 void kvm_mmu_slot_remove_write_access(struct kvm *kvm, int slot);
 void kvm_mmu_zap_all(struct kvm *kvm);


This as usual is the KVM locking patch to browse memslots without the
memslot lock mutex.

Signed-off-by: Andrea Arcangeli <andrea@qumranet.com>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 0c910c7..80b719d 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3245,16 +3245,23 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
 	 */
 	if (!user_alloc) {
 		if (npages && !old.rmap) {
+			unsigned long userspace_addr;
+
 			down_write(&current->mm->mmap_sem);
-			memslot->userspace_addr = do_mmap(NULL, 0,
-						     npages * PAGE_SIZE,
-						     PROT_READ | PROT_WRITE,
-						     MAP_SHARED | MAP_ANONYMOUS,
-						     0);
+			userspace_addr = do_mmap(NULL, 0,
+						 npages * PAGE_SIZE,
+						 PROT_READ | PROT_WRITE,
+						 MAP_SHARED | MAP_ANONYMOUS,
+						 0);
 			up_write(&current->mm->mmap_sem);
 
-			if (IS_ERR((void *)memslot->userspace_addr))
-				return PTR_ERR((void *)memslot->userspace_addr);
+			if (IS_ERR((void *)userspace_addr))
+				return PTR_ERR((void *)userspace_addr);
+
+			/* set userspace_addr atomically for kvm_hva_to_rmapp */
+			spin_lock(&kvm->mmu_lock);
+			memslot->userspace_addr = userspace_addr;
+			spin_unlock(&kvm->mmu_lock);
 		} else {
 			if (!old.user_alloc && old.rmap) {
 				int ret;
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index cf6df51..743c5c5 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -299,7 +299,15 @@ int __kvm_set_memory_region(struct kvm *kvm,
 		memset(new.rmap, 0, npages * sizeof(*new.rmap));
 
 		new.user_alloc = user_alloc;
-		new.userspace_addr = mem->userspace_addr;
+		/*
+		 * hva_to_rmmap() serialzies with the mmu_lock and to be
+		 * safe it has to ignore memslots with !user_alloc &&
+		 * !userspace_addr.
+		 */
+		if (user_alloc)
+			new.userspace_addr = mem->userspace_addr;
+		else
+			new.userspace_addr = 0;
 	}
 
 	/* Allocate page dirty bitmap if needed */
@@ -312,14 +320,18 @@ int __kvm_set_memory_region(struct kvm *kvm,
 		memset(new.dirty_bitmap, 0, dirty_bytes);
 	}
 
+	spin_lock(&kvm->mmu_lock);
 	if (mem->slot >= kvm->nmemslots)
 		kvm->nmemslots = mem->slot + 1;
 
 	*memslot = new;
+	spin_unlock(&kvm->mmu_lock);
 
 	r = kvm_arch_set_memory_region(kvm, mem, old, user_alloc);
 	if (r) {
+		spin_lock(&kvm->mmu_lock);
 		*memslot = old;
+		spin_unlock(&kvm->mmu_lock);
 		goto out_free;
 	}
 
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[patch] my mmu notifiers, Nick Piggin, (Tue Feb 19, 1:43 am)
[patch] my mmu notifier sample driver, Nick Piggin, (Tue Feb 19, 1:44 am)
Re: [patch] my mmu notifiers, Robin Holt, (Tue Feb 19, 4:59 am)
Re: [patch] my mmu notifiers, Andrea Arcangeli, (Tue Feb 19, 6:58 am)
Re: [patch] my mmu notifiers, Jack Steiner, (Tue Feb 19, 7:27 am)
Re: [patch] my mmu notifiers, Nick Piggin, (Tue Feb 19, 3:59 pm)
Re: [patch] my mmu notifiers, Nick Piggin, (Tue Feb 19, 4:04 pm)
Re: [patch] my mmu notifiers, Nick Piggin, (Tue Feb 19, 4:11 pm)
Re: [patch] my mmu notifiers, Jack Steiner, (Tue Feb 19, 4:40 pm)
Re: [patch] my mmu notifiers, Andrea Arcangeli, (Tue Feb 19, 5:46 pm)
Re: [patch] my mmu notifiers, Andrea Arcangeli, (Tue Feb 19, 5:52 pm)
Re: [patch] my mmu notifiers, Andrea Arcangeli, (Tue Feb 19, 6:09 pm)
Re: [patch] my mmu notifiers, Robin Holt, (Tue Feb 19, 7:46 pm)
Re: [patch] my mmu notifiers, Robin Holt, (Tue Feb 19, 7:49 pm)
[PATCH] mmu notifiers #v6, Andrea Arcangeli, (Wed Feb 20, 3:39 am)
[PATCH] KVM swapping (+ seqlock fix) with mmu notifiers #v6, Andrea Arcangeli, (Wed Feb 20, 3:45 am)
Re: [PATCH] mmu notifiers #v6, Robin Holt, (Wed Feb 20, 4:33 am)
Re: [PATCH] mmu notifiers #v6, Andrea Arcangeli, (Wed Feb 20, 5:03 am)
Re: [PATCH] mmu notifiers #v6, Robin Holt, (Wed Feb 20, 5:24 am)
Re: [PATCH] mmu notifiers #v6, Andrea Arcangeli, (Wed Feb 20, 5:32 am)
Re: [PATCH] mmu notifiers #v6, Robin Holt, (Wed Feb 20, 6:15 am)
Re: [PATCH] mmu notifiers #v6, Robin Holt, (Wed Feb 20, 7:41 am)
Re: [PATCH] mmu notifiers #v6, Andrea Arcangeli, (Wed Feb 20, 8:34 am)
Re: [PATCH] mmu notifiers #v6, Jack Steiner, (Wed Feb 20, 2:03 pm)
Re: [patch] my mmu notifiers, Nick Piggin, (Wed Feb 20, 9:42 pm)
Re: [patch] my mmu notifiers, Nick Piggin, (Wed Feb 20, 9:47 pm)
Re: [PATCH] mmu notifiers #v6, Nick Piggin, (Wed Feb 20, 9:54 pm)
Re: [PATCH] mmu notifiers #v6, Nick Piggin, (Wed Feb 20, 10:02 pm)
Re: [PATCH] mmu notifiers #v6, Andrea Arcangeli, (Thu Feb 21, 7:40 am)
Re: [PATCH] mmu notifiers #v6, Jack Steiner, (Thu Feb 21, 9:10 am)
Re: [patch] my mmu notifiers, Jack Steiner, (Fri Feb 22, 9:31 am)
[PATCH] mmu notifiers #v7, Andrea Arcangeli, (Wed Feb 27, 12:26 pm)
Re: [PATCH] mmu notifiers #v7, Peter Zijlstra, (Wed Feb 27, 1:04 pm)
[PATCH] KVM swapping with mmu notifiers #v7, Andrea Arcangeli, (Wed Feb 27, 3:06 pm)
Re: [patch] my mmu notifiers, Christoph Lameter, (Wed Feb 27, 3:50 pm)
Re: [patch] my mmu notifiers, Christoph Lameter, (Wed Feb 27, 3:55 pm)
Re: [patch] my mmu notifiers, Christoph Lameter, (Wed Feb 27, 3:56 pm)
Re: [PATCH] mmu notifiers #v7, Christoph Lameter, (Wed Feb 27, 4:06 pm)
Re: [kvm-devel] [PATCH] mmu notifiers #v7, Andrea Arcangeli, (Wed Feb 27, 4:43 pm)
Re: [kvm-devel] [PATCH] mmu notifiers #v7, Christoph Lameter, (Wed Feb 27, 5:08 pm)
Re: [kvm-devel] [PATCH] mmu notifiers #v7, Andrea Arcangeli, (Wed Feb 27, 5:21 pm)
Re: [kvm-devel] [PATCH] mmu notifiers #v7, Christoph Lameter, (Wed Feb 27, 5:24 pm)
Re: [PATCH] KVM swapping with mmu notifiers #v7, izik eidus, (Thu Feb 28, 1:42 am)
Re: [PATCH] mmu notifiers #v7, Christoph Lameter, (Thu Feb 28, 12:48 pm)
Re: [PATCH] mmu notifiers #v7, Andrea Arcangeli, (Thu Feb 28, 2:52 pm)
Re: [PATCH] mmu notifiers #v7, Christoph Lameter, (Thu Feb 28, 3:00 pm)
Re: [PATCH] mmu notifiers #v7, Christoph Lameter, (Thu Feb 28, 4:05 pm)
Re: [PATCH] mmu notifiers #v7, Jack Steiner, (Thu Feb 28, 4:17 pm)
Re: [PATCH] mmu notifiers #v7, Andrea Arcangeli, (Thu Feb 28, 5:24 pm)
Re: [PATCH] mmu notifiers #v7, Andrea Arcangeli, (Thu Feb 28, 5:40 pm)
Re: [PATCH] mmu notifiers #v7, Andrew Morton, (Thu Feb 28, 5:56 pm)
Re: [PATCH] mmu notifiers #v7, Christoph Lameter, (Thu Feb 28, 6:03 pm)
Re: [PATCH] mmu notifiers #v7, Christoph Lameter, (Thu Feb 28, 6:13 pm)
Re: [PATCH] mmu notifiers #v7, Andrea Arcangeli, (Fri Feb 29, 6:09 am)
Re: [PATCH] mmu notifiers #v7, Christoph Lameter, (Fri Feb 29, 12:46 pm)
[PATCH] mmu notifiers #v8, Andrea Arcangeli, (Sun Mar 2, 8:54 am)
Re: [PATCH] mmu notifiers #v8 + xpmem, Andrea Arcangeli, (Sun Mar 2, 9:03 am)
Re: [PATCH] mmu notifiers #v8 + xpmem, Peter Zijlstra, (Sun Mar 2, 9:23 am)
Re: [PATCH] mmu notifiers #v8, Nick Piggin, (Sun Mar 2, 8:29 pm)
Re: [PATCH] mmu notifiers #v8, Nick Piggin, (Sun Mar 2, 8:33 pm)
Re: [PATCH] mmu notifiers #v8, Nick Piggin, (Sun Mar 2, 8:34 pm)
Re: [PATCH] mmu notifiers #v8, Nick Piggin, (Sun Mar 2, 8:39 pm)
Re: [PATCH] mmu notifiers #v8, Andrea Arcangeli, (Mon Mar 3, 5:51 am)
Re: [PATCH] mmu notifiers #v8, Nick Piggin, (Mon Mar 3, 6:10 am)
Re: [PATCH] mmu notifiers #v8, Andrea Arcangeli, (Mon Mar 3, 6:24 am)
Re: [PATCH] mmu notifiers #v8, Jack Steiner, (Mon Mar 3, 8:18 am)
Re: [PATCH] mmu notifiers #v8, Nick Piggin, (Mon Mar 3, 9:59 am)
Re: [PATCH] mmu notifiers #v8, Jack Steiner, (Mon Mar 3, 11:06 am)
Re: [PATCH] mmu notifiers #v8, Avi Kivity, (Mon Mar 3, 11:09 am)
Re: [PATCH] mmu notifiers #v8, Jack Steiner, (Mon Mar 3, 11:23 am)
Re: [PATCH] mmu notifiers #v8, Nick Piggin, (Mon Mar 3, 11:45 am)
Re: [PATCH] mmu notifiers #v8, Christoph Lameter, (Mon Mar 3, 12:01 pm)
Re: [PATCH] mmu notifiers #v8, Christoph Lameter, (Mon Mar 3, 12:02 pm)
Re: [PATCH] mmu notifiers #v8, Christoph Lameter, (Mon Mar 3, 12:03 pm)
Re: [PATCH] mmu notifiers #v8, Christoph Lameter, (Mon Mar 3, 12:04 pm)
Re: [PATCH] mmu notifiers #v8, Jack Steiner, (Mon Mar 3, 12:15 pm)
Re: [PATCH] mmu notifiers #v8, Andrea Arcangeli, (Mon Mar 3, 2:15 pm)
[PATCH] mmu notifiers #v9, Andrea Arcangeli, (Mon Mar 3, 2:37 pm)
[PATCH] KVM swapping with mmu notifiers #v9, Andrea Arcangeli, (Mon Mar 3, 3:05 pm)
Re: [PATCH] KVM swapping with mmu notifiers #v9, izik eidus, (Mon Mar 3, 5:44 pm)
[RFC] Notifier for Externally Mapped Memory (EMM), Christoph Lameter, (Tue Mar 4, 12:31 am)
[Early draft] Conversion of i_mmap_lock to semaphore, Christoph Lameter, (Tue Mar 4, 12:34 am)
Re: [PATCH] mmu notifiers #v8, Peter Zijlstra, (Tue Mar 4, 3:35 am)
Re: [PATCH] KVM swapping with mmu notifiers #v9, Andrea Arcangeli, (Tue Mar 4, 6:21 am)
Re: [RFC] Notifier for Externally Mapped Memory (EMM), Andrea Arcangeli, (Tue Mar 4, 6:30 am)
Re: [PATCH] mmu notifiers #v8, Jack Steiner, (Tue Mar 4, 7:44 am)
Re: [RFC] Notifier for Externally Mapped Memory (EMM), Christoph Lameter, (Tue Mar 4, 12:00 pm)
Re: [RFC] Notifier for Externally Mapped Memory (EMM), Andrea Arcangeli, (Tue Mar 4, 3:20 pm)
Re: [RFC] Notifier for Externally Mapped Memory (EMM), Christoph Lameter, (Tue Mar 4, 3:35 pm)
Re: [RFC] Notifier for Externally Mapped Memory (EMM), Peter Zijlstra, (Tue Mar 4, 3:42 pm)
Re: [RFC] Notifier for Externally Mapped Memory (EMM), Christoph Lameter, (Tue Mar 4, 4:14 pm)
Re: [RFC] Notifier for Externally Mapped Memory (EMM), Peter Zijlstra, (Tue Mar 4, 4:25 pm)
Re: [RFC] Notifier for Externally Mapped Memory (EMM), Peter Zijlstra, (Tue Mar 4, 4:30 pm)
Re: [PATCH] mmu notifiers #v8, Nick Piggin, (Tue Mar 4, 5:37 pm)
Re: [PATCH] mmu notifiers #v8, Christoph Lameter, (Wed Mar 5, 11:48 am)
Re: [PATCH] mmu notifiers #v8, Nick Piggin, (Wed Mar 5, 7:59 pm)
[PATCH] 4/4 i_mmap_lock spinlock2rwsem (#v9 was 1/4), Andrea Arcangeli, (Fri Mar 7, 8:52 am)
Re: [PATCH] 2/4 move all invalidate_page outside of PT loc ..., Christoph Lameter, (Fri Mar 7, 12:54 pm)
Re: [PATCH] 4/4 i_mmap_lock spinlock2rwsem (#v9 was 1/4), Christoph Lameter, (Fri Mar 7, 1:03 pm)
Re: [PATCH] 4/4 i_mmap_lock spinlock2rwsem (#v9 was 1/4), Christoph Lameter, (Wed Mar 19, 2:27 pm)