mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 13:22:23 +00:00
KVM: Pass in kvm pointer into mark_page_dirty_in_slot()
The context will be needed to implement the kvm dirty ring. Signed-off-by: Peter Xu <peterx@redhat.com> Message-Id: <20201001012044.5151-5-peterx@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
2f5414423e
commit
28bd726aa4
@ -797,7 +797,7 @@ struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);
|
|||||||
bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn);
|
bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn);
|
||||||
bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn);
|
bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn);
|
||||||
unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn);
|
unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn);
|
||||||
void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn);
|
void mark_page_dirty_in_slot(struct kvm *kvm, struct kvm_memory_slot *memslot, gfn_t gfn);
|
||||||
void mark_page_dirty(struct kvm *kvm, gfn_t gfn);
|
void mark_page_dirty(struct kvm *kvm, gfn_t gfn);
|
||||||
|
|
||||||
struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu);
|
struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu);
|
||||||
|
@ -2196,7 +2196,8 @@ int kvm_vcpu_map(struct kvm_vcpu *vcpu, gfn_t gfn, struct kvm_host_map *map)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_vcpu_map);
|
EXPORT_SYMBOL_GPL(kvm_vcpu_map);
|
||||||
|
|
||||||
static void __kvm_unmap_gfn(struct kvm_memory_slot *memslot,
|
static void __kvm_unmap_gfn(struct kvm *kvm,
|
||||||
|
struct kvm_memory_slot *memslot,
|
||||||
struct kvm_host_map *map,
|
struct kvm_host_map *map,
|
||||||
struct gfn_to_pfn_cache *cache,
|
struct gfn_to_pfn_cache *cache,
|
||||||
bool dirty, bool atomic)
|
bool dirty, bool atomic)
|
||||||
@ -2221,7 +2222,7 @@ static void __kvm_unmap_gfn(struct kvm_memory_slot *memslot,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (dirty)
|
if (dirty)
|
||||||
mark_page_dirty_in_slot(memslot, map->gfn);
|
mark_page_dirty_in_slot(kvm, memslot, map->gfn);
|
||||||
|
|
||||||
if (cache)
|
if (cache)
|
||||||
cache->dirty |= dirty;
|
cache->dirty |= dirty;
|
||||||
@ -2235,7 +2236,7 @@ static void __kvm_unmap_gfn(struct kvm_memory_slot *memslot,
|
|||||||
int kvm_unmap_gfn(struct kvm_vcpu *vcpu, struct kvm_host_map *map,
|
int kvm_unmap_gfn(struct kvm_vcpu *vcpu, struct kvm_host_map *map,
|
||||||
struct gfn_to_pfn_cache *cache, bool dirty, bool atomic)
|
struct gfn_to_pfn_cache *cache, bool dirty, bool atomic)
|
||||||
{
|
{
|
||||||
__kvm_unmap_gfn(gfn_to_memslot(vcpu->kvm, map->gfn), map,
|
__kvm_unmap_gfn(vcpu->kvm, gfn_to_memslot(vcpu->kvm, map->gfn), map,
|
||||||
cache, dirty, atomic);
|
cache, dirty, atomic);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2243,8 +2244,8 @@ EXPORT_SYMBOL_GPL(kvm_unmap_gfn);
|
|||||||
|
|
||||||
void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool dirty)
|
void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool dirty)
|
||||||
{
|
{
|
||||||
__kvm_unmap_gfn(kvm_vcpu_gfn_to_memslot(vcpu, map->gfn), map, NULL,
|
__kvm_unmap_gfn(vcpu->kvm, kvm_vcpu_gfn_to_memslot(vcpu, map->gfn),
|
||||||
dirty, false);
|
map, NULL, dirty, false);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_vcpu_unmap);
|
EXPORT_SYMBOL_GPL(kvm_vcpu_unmap);
|
||||||
|
|
||||||
@ -2418,7 +2419,8 @@ int kvm_vcpu_read_guest_atomic(struct kvm_vcpu *vcpu, gpa_t gpa,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_vcpu_read_guest_atomic);
|
EXPORT_SYMBOL_GPL(kvm_vcpu_read_guest_atomic);
|
||||||
|
|
||||||
static int __kvm_write_guest_page(struct kvm_memory_slot *memslot, gfn_t gfn,
|
static int __kvm_write_guest_page(struct kvm *kvm,
|
||||||
|
struct kvm_memory_slot *memslot, gfn_t gfn,
|
||||||
const void *data, int offset, int len)
|
const void *data, int offset, int len)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
@ -2430,7 +2432,7 @@ static int __kvm_write_guest_page(struct kvm_memory_slot *memslot, gfn_t gfn,
|
|||||||
r = __copy_to_user((void __user *)addr + offset, data, len);
|
r = __copy_to_user((void __user *)addr + offset, data, len);
|
||||||
if (r)
|
if (r)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
mark_page_dirty_in_slot(memslot, gfn);
|
mark_page_dirty_in_slot(kvm, memslot, gfn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2439,7 +2441,7 @@ int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn,
|
|||||||
{
|
{
|
||||||
struct kvm_memory_slot *slot = gfn_to_memslot(kvm, gfn);
|
struct kvm_memory_slot *slot = gfn_to_memslot(kvm, gfn);
|
||||||
|
|
||||||
return __kvm_write_guest_page(slot, gfn, data, offset, len);
|
return __kvm_write_guest_page(kvm, slot, gfn, data, offset, len);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_write_guest_page);
|
EXPORT_SYMBOL_GPL(kvm_write_guest_page);
|
||||||
|
|
||||||
@ -2448,7 +2450,7 @@ int kvm_vcpu_write_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn,
|
|||||||
{
|
{
|
||||||
struct kvm_memory_slot *slot = kvm_vcpu_gfn_to_memslot(vcpu, gfn);
|
struct kvm_memory_slot *slot = kvm_vcpu_gfn_to_memslot(vcpu, gfn);
|
||||||
|
|
||||||
return __kvm_write_guest_page(slot, gfn, data, offset, len);
|
return __kvm_write_guest_page(vcpu->kvm, slot, gfn, data, offset, len);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_vcpu_write_guest_page);
|
EXPORT_SYMBOL_GPL(kvm_vcpu_write_guest_page);
|
||||||
|
|
||||||
@ -2567,7 +2569,7 @@ int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
|
|||||||
r = __copy_to_user((void __user *)ghc->hva + offset, data, len);
|
r = __copy_to_user((void __user *)ghc->hva + offset, data, len);
|
||||||
if (r)
|
if (r)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
mark_page_dirty_in_slot(ghc->memslot, gpa >> PAGE_SHIFT);
|
mark_page_dirty_in_slot(kvm, ghc->memslot, gpa >> PAGE_SHIFT);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2636,7 +2638,9 @@ int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_clear_guest);
|
EXPORT_SYMBOL_GPL(kvm_clear_guest);
|
||||||
|
|
||||||
void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn)
|
void mark_page_dirty_in_slot(struct kvm *kvm,
|
||||||
|
struct kvm_memory_slot *memslot,
|
||||||
|
gfn_t gfn)
|
||||||
{
|
{
|
||||||
if (memslot && memslot->dirty_bitmap) {
|
if (memslot && memslot->dirty_bitmap) {
|
||||||
unsigned long rel_gfn = gfn - memslot->base_gfn;
|
unsigned long rel_gfn = gfn - memslot->base_gfn;
|
||||||
@ -2651,7 +2655,7 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn)
|
|||||||
struct kvm_memory_slot *memslot;
|
struct kvm_memory_slot *memslot;
|
||||||
|
|
||||||
memslot = gfn_to_memslot(kvm, gfn);
|
memslot = gfn_to_memslot(kvm, gfn);
|
||||||
mark_page_dirty_in_slot(memslot, gfn);
|
mark_page_dirty_in_slot(kvm, memslot, gfn);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mark_page_dirty);
|
EXPORT_SYMBOL_GPL(mark_page_dirty);
|
||||||
|
|
||||||
@ -2660,7 +2664,7 @@ void kvm_vcpu_mark_page_dirty(struct kvm_vcpu *vcpu, gfn_t gfn)
|
|||||||
struct kvm_memory_slot *memslot;
|
struct kvm_memory_slot *memslot;
|
||||||
|
|
||||||
memslot = kvm_vcpu_gfn_to_memslot(vcpu, gfn);
|
memslot = kvm_vcpu_gfn_to_memslot(vcpu, gfn);
|
||||||
mark_page_dirty_in_slot(memslot, gfn);
|
mark_page_dirty_in_slot(vcpu->kvm, memslot, gfn);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_vcpu_mark_page_dirty);
|
EXPORT_SYMBOL_GPL(kvm_vcpu_mark_page_dirty);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user