Commit 77db5cbd authored by Huang Ying's avatar Huang Ying Committed by Avi Kivity

KVM: MCE: Send SRAR SIGBUS directly

Originally, SRAR SIGBUS is sent to QEMU-KVM via touching the poisoned
page. But commit 96054569 prevents the
signal from being sent. So now the signal is sent via
force_sig_info_fault directly.

[marcelo: use send_sig_info instead]
Reported-by: default avatarDean Nelson <dnelson@redhat.com>
Signed-off-by: default avatarHuang Ying <ying.huang@intel.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent 5854dbca
...@@ -2251,22 +2251,24 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write, ...@@ -2251,22 +2251,24 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write,
return pt_write; return pt_write;
} }
static void kvm_send_hwpoison_signal(struct kvm *kvm, gfn_t gfn) static void kvm_send_hwpoison_signal(unsigned long address, struct task_struct *tsk)
{ {
char buf[1]; siginfo_t info;
void __user *hva;
int r; info.si_signo = SIGBUS;
info.si_errno = 0;
info.si_code = BUS_MCEERR_AR;
info.si_addr = (void __user *)address;
info.si_addr_lsb = PAGE_SHIFT;
/* Touch the page, so send SIGBUS */ send_sig_info(SIGBUS, &info, tsk);
hva = (void __user *)gfn_to_hva(kvm, gfn);
r = copy_from_user(buf, hva, 1);
} }
static int kvm_handle_bad_page(struct kvm *kvm, gfn_t gfn, pfn_t pfn) static int kvm_handle_bad_page(struct kvm *kvm, gfn_t gfn, pfn_t pfn)
{ {
kvm_release_pfn_clean(pfn); kvm_release_pfn_clean(pfn);
if (is_hwpoison_pfn(pfn)) { if (is_hwpoison_pfn(pfn)) {
kvm_send_hwpoison_signal(kvm, gfn); kvm_send_hwpoison_signal(gfn_to_hva(kvm, gfn), current);
return 0; return 0;
} else if (is_fault_pfn(pfn)) } else if (is_fault_pfn(pfn))
return -EFAULT; return -EFAULT;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment