Files
odroid-linux/include/linux
Hugh Dickins 732ed55823 mm/thp: try_to_unmap() use TTU_SYNC for safe splitting
Stressing huge tmpfs often crashed on unmap_page()'s VM_BUG_ON_PAGE
(!unmap_success): with dump_page() showing mapcount:1, but then its raw
struct page output showing _mapcount ffffffff i.e.  mapcount 0.

And even if that particular VM_BUG_ON_PAGE(!unmap_success) is removed,
it is immediately followed by a VM_BUG_ON_PAGE(compound_mapcount(head)),
and further down an IS_ENABLED(CONFIG_DEBUG_VM) total_mapcount BUG():
all indicative of some mapcount difficulty in development here perhaps.
But the !CONFIG_DEBUG_VM path handles the failures correctly and
silently.

I believe the problem is that once a racing unmap has cleared pte or
pmd, try_to_unmap_one() may skip taking the page table lock, and emerge
from try_to_unmap() before the racing task has reached decrementing
mapcount.

Instead of abandoning the unsafe VM_BUG_ON_PAGE(), and the ones that
follow, use PVMW_SYNC in try_to_unmap_one() in this case: adding
TTU_SYNC to the options, and passing that from unmap_page().

When CONFIG_DEBUG_VM, or for non-debug too? Consensus is to do the same
for both: the slight overhead added should rarely matter, except perhaps
if splitting sparsely-populated multiply-mapped shmem.  Once confident
that bugs are fixed, TTU_SYNC here can be removed, and the race
tolerated.

Link: https://lkml.kernel.org/r/c1e95853-8bcd-d8fd-55fa-e7f2488e78f@google.com
Fixes: fec89c109f ("thp: rewrite freeze_page()/unfreeze_page() with generic rmap walkers")
Signed-off-by: Hugh Dickins <hughd@google.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Jue Wang <juew@google.com>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Peter Xu <peterx@redhat.com>
Cc: Ralph Campbell <rcampbell@nvidia.com>
Cc: Shakeel Butt <shakeelb@google.com>
Cc: Wang Yugui <wangyugui@e16-tech.com>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2021-06-16 09:24:42 -07:00
..
2021-02-02 00:16:57 +01:00
2020-12-09 19:26:02 -06:00
2021-01-23 14:57:21 +01:00
2021-05-18 17:24:52 +01:00
2021-05-06 19:24:11 -07:00
2021-04-14 16:30:30 +03:00
2021-05-08 21:49:48 -06:00
2020-12-02 09:46:55 -07:00
2021-01-24 14:27:17 +01:00
2021-02-26 09:41:03 -08:00
2021-04-08 16:04:20 -07:00
2021-05-24 12:45:26 -04:00
2021-05-24 12:45:26 -04:00
2021-04-08 16:04:20 -07:00
2021-04-08 16:04:20 -07:00
2021-01-21 14:06:00 -07:00
2021-05-06 19:24:11 -07:00
2021-04-19 13:13:26 -04:00
2021-01-18 14:26:51 +01:00
2021-03-22 03:57:39 +01:00
2021-02-08 12:28:07 +01:00
2020-12-10 12:42:59 -06:00
2021-04-12 15:04:23 +02:00
2021-03-30 22:37:06 +02:00
2021-05-07 00:26:34 -07:00
2021-02-11 13:24:44 -08:00
2020-12-02 22:10:35 -08:00
2021-04-30 11:20:40 -07:00
2020-11-23 14:16:55 +00:00
2020-11-24 16:47:48 +01:00
2021-03-22 04:23:14 +01:00
2021-04-05 22:39:38 -04:00
2020-12-15 16:19:31 +01:00
2021-01-21 16:16:10 +00:00
2021-02-26 09:41:02 -08:00
2021-02-26 09:41:03 -08:00
2021-01-22 15:09:42 +01:00
2021-05-14 19:41:32 -07:00
2021-04-08 16:04:20 -07:00
2021-01-04 11:42:21 -05:00
2021-04-06 08:34:39 +02:00
2021-02-17 13:17:49 -08:00
2021-04-21 10:24:41 -05:00
2021-02-26 09:40:59 -08:00
2021-02-03 19:05:50 +01:00
2021-01-24 14:27:17 +01:00
2021-01-24 14:27:20 +01:00
2021-03-06 12:40:22 +01:00
2021-02-26 09:41:03 -08:00
2020-12-03 11:20:52 +01:00
2021-03-17 14:16:15 -05:00
2021-01-16 23:19:26 +01:00
2021-03-22 02:45:52 +01:00
2021-03-18 12:58:27 -04:00
2020-12-10 16:17:15 +01:00
2020-12-10 10:45:36 +01:00
2021-05-06 19:24:11 -07:00
2021-03-19 04:58:25 +00:00
2021-03-25 17:39:33 -07:00
2021-01-06 16:24:59 -08:00
2021-03-10 09:34:06 +01:00
2021-04-15 10:32:17 +02:00
2021-02-13 17:17:53 +01:00
2021-03-30 17:06:49 -07:00
2021-04-26 22:55:12 +01:00
2021-04-09 16:00:00 +02:00
2021-01-21 16:16:10 +00:00
2021-03-22 15:02:14 +01:00
2021-05-07 00:26:35 -07:00
2021-02-09 12:15:07 +01:00
2021-01-21 14:06:00 -07:00
2021-04-16 15:31:02 -07:00
2021-03-30 13:42:33 -04:00
2021-01-24 14:27:17 +01:00
2021-02-08 22:58:55 +01:00