mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 04:53:36 +01:00
tools: testing: add expand-only mode VMA test
Add a test to assert that VMG_FLAG_JUST_EXPAND functions as expected - that is, when the VMA iterator is positioned at the previous VMA and no VMAs proceed it, we observe an expansion with all state as expected. Explicitly place a prior VMA that would otherwise fail this test if the mode were not enabled (as it would traverse to the previous-previous VMA). Link: https://lkml.kernel.org/r/d2f88330254a6448092412bf7dfe077a579ab0dc.1729174352.git.lorenzo.stoakes@oracle.com Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Cc: Jann Horn <jannh@google.com> Cc: kernel test robot <oliver.sang@intel.com> Cc: Liam R. Howlett <Liam.Howlett@Oracle.com> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
c4d91e225f
commit
e8133a7799
1 changed files with 40 additions and 0 deletions
|
@ -1522,6 +1522,45 @@ static bool test_copy_vma(void)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool test_expand_only_mode(void)
|
||||||
|
{
|
||||||
|
unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
|
||||||
|
struct mm_struct mm = {};
|
||||||
|
VMA_ITERATOR(vmi, &mm, 0);
|
||||||
|
struct vm_area_struct *vma_prev, *vma;
|
||||||
|
VMG_STATE(vmg, &mm, &vmi, 0x5000, 0x9000, flags, 5);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Place a VMA prior to the one we're expanding so we assert that we do
|
||||||
|
* not erroneously try to traverse to the previous VMA even though we
|
||||||
|
* have, through the use of VMG_FLAG_JUST_EXPAND, indicated we do not
|
||||||
|
* need to do so.
|
||||||
|
*/
|
||||||
|
alloc_and_link_vma(&mm, 0, 0x2000, 0, flags);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We will be positioned at the prev VMA, but looking to expand to
|
||||||
|
* 0x9000.
|
||||||
|
*/
|
||||||
|
vma_iter_set(&vmi, 0x3000);
|
||||||
|
vma_prev = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
|
||||||
|
vmg.prev = vma_prev;
|
||||||
|
vmg.merge_flags = VMG_FLAG_JUST_EXPAND;
|
||||||
|
|
||||||
|
vma = vma_merge_new_range(&vmg);
|
||||||
|
ASSERT_NE(vma, NULL);
|
||||||
|
ASSERT_EQ(vma, vma_prev);
|
||||||
|
ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
|
||||||
|
ASSERT_EQ(vma->vm_start, 0x3000);
|
||||||
|
ASSERT_EQ(vma->vm_end, 0x9000);
|
||||||
|
ASSERT_EQ(vma->vm_pgoff, 3);
|
||||||
|
ASSERT_TRUE(vma_write_started(vma));
|
||||||
|
ASSERT_EQ(vma_iter_addr(&vmi), 0x3000);
|
||||||
|
|
||||||
|
cleanup_mm(&mm, &vmi);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
int num_tests = 0, num_fail = 0;
|
int num_tests = 0, num_fail = 0;
|
||||||
|
@ -1553,6 +1592,7 @@ int main(void)
|
||||||
TEST(vmi_prealloc_fail);
|
TEST(vmi_prealloc_fail);
|
||||||
TEST(merge_extend);
|
TEST(merge_extend);
|
||||||
TEST(copy_vma);
|
TEST(copy_vma);
|
||||||
|
TEST(expand_only_mode);
|
||||||
|
|
||||||
#undef TEST
|
#undef TEST
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue