>> will memory_failure() find it and unmap it? if succeed, then the current 
>> will be
>> signaled with correct vaddr and shift?
>
> That's a very good question.  I didn't see a SIGBUS when I first wrote this 
> code,
> hence all the p->mce_vaddr.  But now I'm
> a) not sure why there wasn't a signal
> b) if we are to fix the problems noted by AndyL, need to make sure that there 
> isn't a SIGBUS

Tests on upstream kernel today show that memory_failure() is both unmapping the 
page
and sending a SIGBUS.


My biggest issue with the KERNEL_COPYIN recovery path is that we don't have code
to mark the page not present while we are still in do_machine_check().  That's 
resulted
in recovery working for simple cases where there is a single get_user() call 
followed by
an error return if that failed. But more complex cases require more machine 
checks and
a touching faith that the kernel will eventually give up trying (spoiler: it 
sometimes doesn't).

Thanks to the decode of the instruction we do have the virtual address. So we 
just need
a safe walk of pgd->p4d->pud->pmd->pte (truncated if we hit a huge page) with a 
write
of a "not-present" value. Maybe a different poison type from the one we get from
memory_failure() so that the #PF code can recognize this as a special case and 
do any
other work that we avoided because we were in #MC context.

-Tony

Reply via email to