Re: [PATCH] mm: migrate: add missing flush_dcache_page for non-mapped page migrate

From: Lars Persson
Date: Tue Feb 26 2019 - 03:40:40 EST

On 2/25/19 4:07 PM, Vlastimil Babka wrote:
On 2/19/19 1:32 PM, Lars Persson wrote:
Our MIPS 1004Kc SoCs were seeing random userspace crashes with SIGILL
and SIGSEGV that could not be traced back to a userspace code
bug. They had all the magic signs of an I/D cache coherency issue.

Now recently we noticed that the /proc/sys/vm/compact_memory interface
was quite efficient at provoking this class of userspace crashes.

Studying the code in mm/migrate.c there is a distinction made between
migrating a page that is mapped at the instant of migration and one
that is not mapped. Our problem turned out to be the non-mapped pages.

For the non-mapped page the code performs a copy of the page content
and all relevant meta-data of the page without doing the required
D-cache maintenance. This leaves dirty data in the D-cache of the CPU
and on the 1004K cores this data is not visible to the I-cache. A
subsequent page-fault that triggers a mapping of the page will happily
serve the process with potentially stale code.

What about ARM then, this bug should have seen greater exposure? Well
ARM became immune to this flaw back in 2010, see commit c01778001a4f
("ARM: 6379/1: Assume new page cache pages have dirty D-cache").

My proposed fix moves the D-cache maintenance inside move_to_new_page
to make it common for both cases.

Signed-off-by: Lars Persson <larper@xxxxxxxx>

What about CC stable and a Fixes tag, would it be applicable here?

Yes this is candidate for stable so let's add:
Cc: <stable@xxxxxxxxxxxxxxx>

I do not find a good candidate for a Fixes tag.