aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoropeneuler-ci-bot <george@openeuler.sh>2024-04-29 12:18:34 +0000
committerGitee <noreply@gitee.com>2024-04-29 12:18:34 +0000
commit1ddaf66e6e1a2a23c3bab61557bc375c02ae835c (patch)
tree44ded0d3de84f5899d14a60c704337ecc3dbf5d3
parentd50b253934f51e6d23d53e25f92013e6390a2df9 (diff)
parentdeb461419eb3dddd058a438568bbe55d2933d7b5 (diff)
downloadopenEuler-kernel-openEuler-22.03-LTS.tar.gz
!6751 [sync] PR-6677: v3 olk-5.10: bugfix for mmopenEuler-22.03-LTS
Merge Pull Request from: @openeuler-sync-bot Origin pull request: https://gitee.com/openeuler/kernel/pulls/6677 PR sync from: Wupeng Ma <mawupeng1@huawei.com> https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/F2VRDUQ6NU77XVWZ7ZJ63PSSBRJBGCO4/ From: Ma Wupeng <mawupeng1@huawei.com> backport minor bugfix for mm. Changelog since v2: - fix style problem. Changelog since v1: - fix style problem. Mel Gorman (1): mm/page_alloc: always attempt to allocate at least one page during bulk allocation Miaohe Lin (1): mm/madvise: fix potential pte_unmap_unlock pte error -- 2.25.1 https://gitee.com/openeuler/kernel/issues/I9JPDJ Link:https://gitee.com/openeuler/kernel/pulls/6751 Reviewed-by: Jialin Zhang <zhangjialin11@huawei.com> Signed-off-by: Jialin Zhang <zhangjialin11@huawei.com>
-rw-r--r--mm/madvise.c8
-rw-r--r--mm/page_alloc.c7
2 files changed, 8 insertions, 7 deletions
diff --git a/mm/madvise.c b/mm/madvise.c
index 885fc6e31f4f4e..c0bb4242f50ae3 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -431,12 +431,12 @@ regular_page:
if (split_huge_page(page)) {
unlock_page(page);
put_page(page);
- pte_offset_map_lock(mm, pmd, addr, &ptl);
+ orig_pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
break;
}
unlock_page(page);
put_page(page);
- pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
+ orig_pte = pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
pte--;
addr -= PAGE_SIZE;
continue;
@@ -646,12 +646,12 @@ static int madvise_free_pte_range(pmd_t *pmd, unsigned long addr,
if (split_huge_page(page)) {
unlock_page(page);
put_page(page);
- pte_offset_map_lock(mm, pmd, addr, &ptl);
+ orig_pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
goto out;
}
unlock_page(page);
put_page(page);
- pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
+ orig_pte = pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
pte--;
addr -= PAGE_SIZE;
continue;
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 085aeecca0c603..7b99b9d1019182 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5025,7 +5025,7 @@ unsigned long __alloc_pages_bulk(gfp_t gfp, int preferred_nid,
struct alloc_context ac;
gfp_t alloc_gfp;
unsigned int alloc_flags = ALLOC_WMARK_LOW;
- int nr_populated = 0;
+ int nr_populated = 0, nr_account = 0;
/*
* Skip populated array elements to determine if any pages need
@@ -5110,11 +5110,12 @@ unsigned long __alloc_pages_bulk(gfp_t gfp, int preferred_nid,
page = __rmqueue_pcplist(zone, ac.migratetype, alloc_flags,
pcp, pcp_list);
if (unlikely(!page)) {
- /* Try and get at least one page */
- if (!nr_populated)
+ /* Try and allocate at least one page */
+ if (!nr_account)
goto failed_irq;
break;
}
+ nr_account++;
/*
* Ideally this would be batched but the best way to do