Re: [PATCH v2 4/9] KVM: s390: Fix dirty marking in adapter_indicators_set*()
Christian Borntraeger <[email protected]>
| Newsgroups | org.kernel.vger.linux-s390,org.kernel.vger.kvm,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Am 12.08.26 um 12:44 schrieb Claudio Imbrenda:
> @@ -3017,26 +3017,30 @@ static int adapter_indicators_set_fast(struct kvm *kvm,
> struct kvm_s390_adapter_int *adapter_int,
> int setbit)
> {
> + struct s390_map_info *ind_info, *summary_info;
> unsigned long bit;
> int summary_set;
> - struct s390_map_info *ind_info, *summary_info;
> void *map;
>
> - spin_lock(&adapter->maps_lock);
> + guard(srcu)(&kvm->srcu);
> + guard(spinlock)(&adapter->maps_lock);
> +
> ind_info = get_map_info(adapter, adapter_int->ind_addr);
> - if (!ind_info) {
> - spin_unlock(&adapter->maps_lock);
> + if (!ind_info)
> return -EWOULDBLOCK;
> - }
> +
> map = page_address(ind_info->page);
> bit = get_ind_bit(ind_info->addr, adapter_int->ind_offset, adapter->swap);
> - if (setbit)
> + if (setbit) {
> + mark_page_dirty(kvm, gpa_to_gfn(adapter_int->ind_gaddr));
> + set_page_dirty(ind_info->page);
> set_bit(bit, map);
> + }
This marks the indicator page dirty before writing it.
The summary twenty lines below does it the other way round and so do both
slow-path branches.
The order matters because kvm_get_dirty_log_protect() harvests destructively.