On Thu, Nov 02, 2023, Paolo Bonzini wrote:
> On 11/2/23 10:35, Huang, Kai wrote:
> > IIUC KVM can already handle the case of poisoned
> > page by sending signal to user app:
> > 
> >     static int kvm_handle_error_pfn(struct kvm_vcpu *vcpu,                  
> > struct
> > kvm_page_fault *fault)                                                      
> > {
> >             ...
> > 
> >                     if (fault->pfn == KVM_PFN_ERR_HWPOISON) {
> >                             kvm_send_hwpoison_signal(fault->slot, 
> > fault->gfn);

No, this doesn't work, because that signals the host virtual address

        unsigned long hva = gfn_to_hva_memslot(slot, gfn);

        send_sig_mceerr(BUS_MCEERR_AR, (void __user *)hva, PAGE_SHIFT, current);

which is the *shared* page.

> >                     return RET_PF_RETRY;
> >     }
> >     }
> 
> EHWPOISON is not implemented by this series, so it should be left out of the
> documentation.

EHWPOISON *is* implemented.  kvm_gmem_get_pfn() returns -EWPOISON as 
appropriate,
and kvm_faultin_pfn() returns that directly without going through 
kvm_handle_error_pfn().

  kvm_faultin_pfn_private()
  |
  |-> kvm_gmem_get_pfn()
      |
      |-> if (folio_test_hwpoison(folio)) {
                r = -EHWPOISON;
                goto out_unlock;
          }

          |
          |->   r = kvm_gmem_get_pfn(vcpu->kvm, fault->slot, fault->gfn, 
&fault->pfn,
                             &max_order);
                if (r) {
                        kvm_mmu_prepare_memory_fault_exit(vcpu, fault);
                        return r;
                }

                |
                |-> ret = __kvm_faultin_pfn(vcpu, fault);
                    if (ret != RET_PF_CONTINUE)
                            return ret;

                    if (unlikely(is_error_pfn(fault->pfn)))
                            return kvm_handle_error_pfn(vcpu, fault);

Reply via email to