mm/huge_memory.c: rework the function vma_adjust_trans_huge()
Patch series "Some cleanups for huge_memory", v3. This series contains cleanups to rework some function logics to make it more readable, use helper function and so on. More details can be found in the respective changelogs. This patch (of 6): The current implementation of vma_adjust_trans_huge() contains some duplicated codes. Add helper function to get rid of these codes to make it more succinct. Link: https://lkml.kernel.org/r/20210318122722.13135-1-linmiaohe@huawei.com Link: https://lkml.kernel.org/r/20210318122722.13135-2-linmiaohe@huawei.com Signed-off-by: Miaohe Lin <linmiaohe@huawei.com> Reviewed-by: Peter Xu <peterx@redhat.com> Cc: Zi Yan <ziy@nvidia.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: William Kucharski <william.kucharski@oracle.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Peter Xu <peterx@redhat.com> Cc: yuleixzhang <yulei.kernel@gmail.com> Cc: Michel Lespinasse <walken@google.com> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Cc: Ralph Campbell <rcampbell@nvidia.com> Cc: Thomas Hellstrm (Intel) <thomas_os@shipmail.org> Cc: Yang Shi <yang.shi@linux.alibaba.com> Cc: Wei Yang <richard.weiyang@linux.alibaba.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8fd5eda4c7
commit
71f9e58eb4
|
@ -2301,44 +2301,38 @@ void split_huge_pmd_address(struct vm_area_struct *vma, unsigned long address,
|
|||
__split_huge_pmd(vma, pmd, address, freeze, page);
|
||||
}
|
||||
|
||||
static inline void split_huge_pmd_if_needed(struct vm_area_struct *vma, unsigned long address)
|
||||
{
|
||||
/*
|
||||
* If the new address isn't hpage aligned and it could previously
|
||||
* contain an hugepage: check if we need to split an huge pmd.
|
||||
*/
|
||||
if (!IS_ALIGNED(address, HPAGE_PMD_SIZE) &&
|
||||
range_in_vma(vma, ALIGN_DOWN(address, HPAGE_PMD_SIZE),
|
||||
ALIGN(address, HPAGE_PMD_SIZE)))
|
||||
split_huge_pmd_address(vma, address, false, NULL);
|
||||
}
|
||||
|
||||
void vma_adjust_trans_huge(struct vm_area_struct *vma,
|
||||
unsigned long start,
|
||||
unsigned long end,
|
||||
long adjust_next)
|
||||
{
|
||||
/*
|
||||
* If the new start address isn't hpage aligned and it could
|
||||
* previously contain an hugepage: check if we need to split
|
||||
* an huge pmd.
|
||||
*/
|
||||
if (start & ~HPAGE_PMD_MASK &&
|
||||
(start & HPAGE_PMD_MASK) >= vma->vm_start &&
|
||||
(start & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE <= vma->vm_end)
|
||||
split_huge_pmd_address(vma, start, false, NULL);
|
||||
/* Check if we need to split start first. */
|
||||
split_huge_pmd_if_needed(vma, start);
|
||||
|
||||
/* Check if we need to split end next. */
|
||||
split_huge_pmd_if_needed(vma, end);
|
||||
|
||||
/*
|
||||
* If the new end address isn't hpage aligned and it could
|
||||
* previously contain an hugepage: check if we need to split
|
||||
* an huge pmd.
|
||||
*/
|
||||
if (end & ~HPAGE_PMD_MASK &&
|
||||
(end & HPAGE_PMD_MASK) >= vma->vm_start &&
|
||||
(end & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE <= vma->vm_end)
|
||||
split_huge_pmd_address(vma, end, false, NULL);
|
||||
|
||||
/*
|
||||
* If we're also updating the vma->vm_next->vm_start, if the new
|
||||
* vm_next->vm_start isn't hpage aligned and it could previously
|
||||
* contain an hugepage: check if we need to split an huge pmd.
|
||||
* If we're also updating the vma->vm_next->vm_start,
|
||||
* check if we need to split it.
|
||||
*/
|
||||
if (adjust_next > 0) {
|
||||
struct vm_area_struct *next = vma->vm_next;
|
||||
unsigned long nstart = next->vm_start;
|
||||
nstart += adjust_next;
|
||||
if (nstart & ~HPAGE_PMD_MASK &&
|
||||
(nstart & HPAGE_PMD_MASK) >= next->vm_start &&
|
||||
(nstart & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE <= next->vm_end)
|
||||
split_huge_pmd_address(next, nstart, false, NULL);
|
||||
split_huge_pmd_if_needed(next, nstart);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue