Skip to content

Commit 8988854

Browse files
author
Claudio Imbrenda
committed
KVM: s390: Use guest address to mark guest page dirty
Stop using the userspace address to mark the guest page dirty. mark_page_dirty() expects a guest frame number, but was being passed a host virtual frame number. When slot == NULL, mark_page_dirty_in_slot() does nothing and does not complain. This means that in some circumstances the dirtiness of the guest page might have been lost. Fix by adding two fields in struct kvm_s390_adapter_int to keep the guest addressses, and use those for mark_page_dirty(). Fixes: f654706 ("KVM: s390/interrupt: do not pin adapter interrupt pages") Reviewed-by: Steffen Eiden <seiden@linux.ibm.com> Reviewed-by: Janosch Frank <frankja@linux.ibm.com> Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com> Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
1 parent f7ab71f commit 8988854

2 files changed

Lines changed: 6 additions & 2 deletions

File tree

arch/s390/kvm/interrupt.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2768,13 +2768,13 @@ static int adapter_indicators_set(struct kvm *kvm,
27682768
bit = get_ind_bit(adapter_int->ind_addr,
27692769
adapter_int->ind_offset, adapter->swap);
27702770
set_bit(bit, map);
2771-
mark_page_dirty(kvm, adapter_int->ind_addr >> PAGE_SHIFT);
2771+
mark_page_dirty(kvm, adapter_int->ind_gaddr >> PAGE_SHIFT);
27722772
set_page_dirty_lock(ind_page);
27732773
map = page_address(summary_page);
27742774
bit = get_ind_bit(adapter_int->summary_addr,
27752775
adapter_int->summary_offset, adapter->swap);
27762776
summary_set = test_and_set_bit(bit, map);
2777-
mark_page_dirty(kvm, adapter_int->summary_addr >> PAGE_SHIFT);
2777+
mark_page_dirty(kvm, adapter_int->summary_gaddr >> PAGE_SHIFT);
27782778
set_page_dirty_lock(summary_page);
27792779
srcu_read_unlock(&kvm->srcu, idx);
27802780

@@ -2870,7 +2870,9 @@ int kvm_set_routing_entry(struct kvm *kvm,
28702870
if (kvm_is_error_hva(uaddr_s) || kvm_is_error_hva(uaddr_i))
28712871
return -EFAULT;
28722872
e->adapter.summary_addr = uaddr_s;
2873+
e->adapter.summary_gaddr = ue->u.adapter.summary_addr;
28732874
e->adapter.ind_addr = uaddr_i;
2875+
e->adapter.ind_gaddr = ue->u.adapter.ind_addr;
28742876
e->adapter.summary_offset = ue->u.adapter.summary_offset;
28752877
e->adapter.ind_offset = ue->u.adapter.ind_offset;
28762878
e->adapter.adapter_id = ue->u.adapter.adapter_id;

include/linux/kvm_host.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,9 @@ static inline unsigned long *kvm_second_dirty_bitmap(struct kvm_memory_slot *mem
645645

646646
struct kvm_s390_adapter_int {
647647
u64 ind_addr;
648+
u64 ind_gaddr;
648649
u64 summary_addr;
650+
u64 summary_gaddr;
649651
u64 ind_offset;
650652
u32 summary_offset;
651653
u32 adapter_id;

0 commit comments

Comments
 (0)