| From 88fb8b7b1e9acefe927b4005426f22fb6e7542a2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 4 May 2021 18:34:38 -0700 |
| Subject: mm/hugeltb: handle the error case in hugetlb_fix_reserve_counts() |
| |
| From: Miaohe Lin <linmiaohe@huawei.com> |
| |
| [ Upstream commit da56388c4397878a65b74f7fe97760f5aa7d316b ] |
| |
| A rare out of memory error would prevent removal of the reserve map region |
| for a page. hugetlb_fix_reserve_counts() handles this rare case to avoid |
| dangling with incorrect counts. Unfortunately, hugepage_subpool_get_pages |
| and hugetlb_acct_memory could possibly fail too. We should correctly |
| handle these cases. |
| |
| Link: https://lkml.kernel.org/r/20210410072348.20437-5-linmiaohe@huawei.com |
| Fixes: b5cec28d36f5 ("hugetlbfs: truncate_hugepages() takes a range of pages") |
| Signed-off-by: Miaohe Lin <linmiaohe@huawei.com> |
| Cc: Feilong Lin <linfeilong@huawei.com> |
| Cc: Mike Kravetz <mike.kravetz@oracle.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| mm/hugetlb.c | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
| index 573f1a0183be..900851a4f914 100644 |
| --- a/mm/hugetlb.c |
| +++ b/mm/hugetlb.c |
| @@ -745,13 +745,20 @@ void hugetlb_fix_reserve_counts(struct inode *inode) |
| { |
| struct hugepage_subpool *spool = subpool_inode(inode); |
| long rsv_adjust; |
| + bool reserved = false; |
| |
| rsv_adjust = hugepage_subpool_get_pages(spool, 1); |
| - if (rsv_adjust) { |
| + if (rsv_adjust > 0) { |
| struct hstate *h = hstate_inode(inode); |
| |
| - hugetlb_acct_memory(h, 1); |
| + if (!hugetlb_acct_memory(h, 1)) |
| + reserved = true; |
| + } else if (!rsv_adjust) { |
| + reserved = true; |
| } |
| + |
| + if (!reserved) |
| + pr_warn("hugetlb: Huge Page Reserved count may go negative.\n"); |
| } |
| |
| /* |
| -- |
| 2.30.2 |
| |