diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 11:59:37 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 14:20:42 +0200 | 
| commit | dbb6be6d5e974c42bbecd183effaa0df69e1dd8b (patch) | |
| tree | 5735cb47e70853d057a9881dd0ce44b83e88fa63 /virt/kvm/kvm_main.c | |
| parent | 6a867a395558a7f882d041783e4cdea6744ca2bf (diff) | |
| parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff) | |
| download | olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.tar.xz olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.zip  | |
Merge branch 'linus' into timers/core
Reason: Further posix_cpu_timer patches depend on mainline changes
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'virt/kvm/kvm_main.c')
| -rw-r--r-- | virt/kvm/kvm_main.c | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 548f9253c19..c82ae249263 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -22,7 +22,6 @@  #include <linux/module.h>  #include <linux/errno.h>  #include <linux/percpu.h> -#include <linux/gfp.h>  #include <linux/mm.h>  #include <linux/miscdevice.h>  #include <linux/vmalloc.h> @@ -46,6 +45,7 @@  #include <linux/compat.h>  #include <linux/srcu.h>  #include <linux/hugetlb.h> +#include <linux/slab.h>  #include <asm/processor.h>  #include <asm/io.h> @@ -341,7 +341,11 @@ static void kvm_mmu_notifier_release(struct mmu_notifier *mn,  				     struct mm_struct *mm)  {  	struct kvm *kvm = mmu_notifier_to_kvm(mn); +	int idx; + +	idx = srcu_read_lock(&kvm->srcu);  	kvm_arch_flush_shadow(kvm); +	srcu_read_unlock(&kvm->srcu, idx);  }  static const struct mmu_notifier_ops kvm_mmu_notifier_ops = { @@ -648,7 +652,7 @@ skip_lpage:  	/* Allocate page dirty bitmap if needed */  	if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) { -		unsigned dirty_bytes = ALIGN(npages, BITS_PER_LONG) / 8; +		unsigned long dirty_bytes = kvm_dirty_bitmap_bytes(&new);  		new.dirty_bitmap = vmalloc(dirty_bytes);  		if (!new.dirty_bitmap) @@ -768,7 +772,7 @@ int kvm_get_dirty_log(struct kvm *kvm,  {  	struct kvm_memory_slot *memslot;  	int r, i; -	int n; +	unsigned long n;  	unsigned long any = 0;  	r = -EINVAL; @@ -780,7 +784,7 @@ int kvm_get_dirty_log(struct kvm *kvm,  	if (!memslot->dirty_bitmap)  		goto out; -	n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; +	n = kvm_dirty_bitmap_bytes(memslot);  	for (i = 0; !any && i < n/sizeof(long); ++i)  		any = memslot->dirty_bitmap[i]; @@ -1186,10 +1190,13 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn)  	memslot = gfn_to_memslot_unaliased(kvm, gfn);  	if (memslot && memslot->dirty_bitmap) {  		unsigned long rel_gfn = gfn - memslot->base_gfn; +		unsigned long *p = memslot->dirty_bitmap + +					rel_gfn / BITS_PER_LONG; +		int offset = rel_gfn % BITS_PER_LONG;  		/* avoid RMW */ -		if (!generic_test_le_bit(rel_gfn, memslot->dirty_bitmap)) -			generic___set_le_bit(rel_gfn, memslot->dirty_bitmap); +		if (!generic_test_le_bit(offset, p)) +			generic___set_le_bit(offset, p);  	}  }  |