mm: Don't free pages in the page cache
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Oct 2017 17:48:39 +0000 (13:48 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Oct 2017 18:57:25 +0000 (14:57 -0400)
commit6738e82742df39c63ea9275aa53e9a6d7ad75482
tree70dab1d8c2ee318d396e7f59c12b3971d06f024b
parente92df5ce615277cc81ed7f252eaf7cebdd3fe86c
mm: Don't free pages in the page cache

map_page_at_addr() should have had !page_is_pagemap() (note the !).
Instead, we were actually freeing page cache pages under those rare
circumstances where map_page_at_addr() frees a page.

Specifically, we had a case where we'd have multiple PFs at once, and we
hit the benign race.  But we accidentally freed the page cache page and
then reused it.  Reusing the page, which was a binary text page, destroyed
the program (crazy faults).  Also, when we reused the page, its PG_PAGEMAP
flag was still set, which caused it to be PM-decreffed without a
corresponding incref.  That led to a negative refcnt, and an assertion
flipped out when it didn't have a positive ref.

Fixes brho/akaros#42.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/mm.c