Messages in this thread | | | From | "Luck, Tony" <> | Subject | RE: [PATCH] mm,hwpoison: return -EBUSY when page already poisoned | Date | Fri, 12 Mar 2021 23:48:31 +0000 |
| |
>> 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
| |