From: Mike Rapoport <rppt@kernel.org>
To: Wei Yang <richard.weiyang@gmail.com>
Cc: akpm@linux-foundation.org, linux-mm@kvack.org
Subject: Re: [PATCH 2/6] memblock tests: add the 129th memory block at all possible position
Date: Mon, 15 Apr 2024 18:19:42 +0300 [thread overview]
Message-ID: <Zh1FjvBP0HqF_grj@kernel.org> (raw)
In-Reply-To: <20240414004531.6601-2-richard.weiyang@gmail.com>
On Sun, Apr 14, 2024 at 12:45:27AM +0000, Wei Yang wrote:
> After previous change, we may double the array based on the position of
> the new range.
>
> Let's make sure the 129th memory block would double the size correctly
> at all possible position.
Rather than rewrite an existing test, just add a new one.
Besides, it would be more interesting to test additions to
memblock.reserved and a mix of memblock_add() and memblock_reserve() that
will require resizing the memblock arrays.
> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
> ---
> tools/testing/memblock/tests/basic_api.c | 132 +++++++++++++----------
> 1 file changed, 73 insertions(+), 59 deletions(-)
>
> diff --git a/tools/testing/memblock/tests/basic_api.c b/tools/testing/memblock/tests/basic_api.c
> index f317fe691fc4..f1569ebb9872 100644
> --- a/tools/testing/memblock/tests/basic_api.c
> +++ b/tools/testing/memblock/tests/basic_api.c
> @@ -431,84 +431,98 @@ static int memblock_add_near_max_check(void)
> */
> static int memblock_add_many_check(void)
> {
> - int i;
> + int i, skip;
> void *orig_region;
> struct region r = {
> .base = SZ_16K,
> .size = SZ_16K,
> };
> phys_addr_t new_memory_regions_size;
> - phys_addr_t base, size = SZ_64;
> + phys_addr_t base, base_start, size = SZ_64;
> phys_addr_t gap_size = SZ_64;
>
> PREFIX_PUSH();
>
> - reset_memblock_regions();
> - memblock_allow_resize();
> -
> - dummy_physical_memory_init();
> - /*
> - * We allocated enough memory by using dummy_physical_memory_init(), and
> - * split it into small block. First we split a large enough memory block
> - * as the memory region which will be choosed by memblock_double_array().
> - */
> - base = PAGE_ALIGN(dummy_physical_memory_base());
> - new_memory_regions_size = PAGE_ALIGN(INIT_MEMBLOCK_REGIONS * 2 *
> - sizeof(struct memblock_region));
> - memblock_add(base, new_memory_regions_size);
> -
> - /* This is the base of small memory block. */
> - base += new_memory_regions_size + gap_size;
> -
> - orig_region = memblock.memory.regions;
> + /* Add the 129th memory block for all possible positions*/
> + for (skip = 0; skip < INIT_MEMBLOCK_REGIONS; skip++) {
> + reset_memblock_regions();
> + memblock_allow_resize();
>
> - for (i = 0; i < INIT_MEMBLOCK_REGIONS; i++) {
> + dummy_physical_memory_init();
> /*
> - * Add these small block to fulfill the memblock. We keep a
> - * gap between the nearby memory to avoid being merged.
> + * We allocated enough memory by using dummy_physical_memory_init(), and
> + * split it into small block. First we split a large enough memory block
> + * as the memory region which will be choosed by memblock_double_array().
> */
> - memblock_add(base, size);
> - base += size + gap_size;
> -
> - ASSERT_EQ(memblock.memory.cnt, i + 2);
> + base = PAGE_ALIGN(dummy_physical_memory_base());
> + new_memory_regions_size = PAGE_ALIGN(INIT_MEMBLOCK_REGIONS * 2 *
> + sizeof(struct memblock_region));
> + memblock_add(base, new_memory_regions_size);
> +
> + /* This is the base of small memory block. */
> + base_start = base += new_memory_regions_size + gap_size;
> + orig_region = memblock.memory.regions;
> +
> + for (i = 0; i < INIT_MEMBLOCK_REGIONS; i++, base += size + gap_size) {
> + if (i == skip)
> + continue;
> + /*
> + * Add these small block to fulfill the memblock. We keep a
> + * gap between the nearby memory to avoid being merged.
> + */
> + memblock_add(base, size);
> +
> + if (i < skip) {
> + ASSERT_EQ(memblock.memory.cnt, i + 2);
> + ASSERT_EQ(memblock.memory.total_size,
> + new_memory_regions_size + (i + 1) * size);
> + } else {
> + ASSERT_EQ(memblock.memory.cnt, i + 1);
> + ASSERT_EQ(memblock.memory.total_size,
> + new_memory_regions_size + i * size);
> + }
> + }
> +
> + /* Add the skipped one to trigger memblock_double_array() */
> + memblock_add(base_start + skip * (size + gap_size), size);
> + ASSERT_EQ(memblock.memory.cnt, i + 1);
> ASSERT_EQ(memblock.memory.total_size, new_memory_regions_size +
> - (i + 1) * size);
> - }
> + i * size);
> + /*
> + * At there, memblock_double_array() has been succeed, check if it
> + * update the memory.max.
> + */
> + ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2);
>
> - /*
> - * At there, memblock_double_array() has been succeed, check if it
> - * update the memory.max.
> - */
> - ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2);
> + /* memblock_double_array() will reserve the memory it used. Check it. */
> + ASSERT_EQ(memblock.reserved.cnt, 1);
> + ASSERT_EQ(memblock.reserved.total_size, new_memory_regions_size);
>
> - /* memblock_double_array() will reserve the memory it used. Check it. */
> - ASSERT_EQ(memblock.reserved.cnt, 1);
> - ASSERT_EQ(memblock.reserved.total_size, new_memory_regions_size);
> -
> - /*
> - * Now memblock_double_array() works fine. Let's check after the
> - * double_array(), the memblock_add() still works as normal.
> - */
> - memblock_add(r.base, r.size);
> - ASSERT_EQ(memblock.memory.regions[0].base, r.base);
> - ASSERT_EQ(memblock.memory.regions[0].size, r.size);
> + /*
> + * Now memblock_double_array() works fine. Let's check after the
> + * double_array(), the memblock_add() still works as normal.
> + */
> + memblock_add(r.base, r.size);
> + ASSERT_EQ(memblock.memory.regions[0].base, r.base);
> + ASSERT_EQ(memblock.memory.regions[0].size, r.size);
>
> - ASSERT_EQ(memblock.memory.cnt, INIT_MEMBLOCK_REGIONS + 2);
> - ASSERT_EQ(memblock.memory.total_size, INIT_MEMBLOCK_REGIONS * size +
> - new_memory_regions_size +
> - r.size);
> - ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2);
> + ASSERT_EQ(memblock.memory.cnt, INIT_MEMBLOCK_REGIONS + 2);
> + ASSERT_EQ(memblock.memory.total_size, INIT_MEMBLOCK_REGIONS * size +
> + new_memory_regions_size +
> + r.size);
> + ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2);
>
> - dummy_physical_memory_cleanup();
> + dummy_physical_memory_cleanup();
>
> - /*
> - * The current memory.regions is occupying a range of memory that
> - * allocated from dummy_physical_memory_init(). After free the memory,
> - * we must not use it. So restore the origin memory region to make sure
> - * the tests can run as normal and not affected by the double array.
> - */
> - memblock.memory.regions = orig_region;
> - memblock.memory.cnt = INIT_MEMBLOCK_REGIONS;
> + /*
> + * The current memory.regions is occupying a range of memory that
> + * allocated from dummy_physical_memory_init(). After free the memory,
> + * we must not use it. So restore the origin memory region to make sure
> + * the tests can run as normal and not affected by the double array.
> + */
> + memblock.memory.regions = orig_region;
> + memblock.memory.cnt = INIT_MEMBLOCK_REGIONS;
> + }
>
> test_pass_pop();
>
> --
> 2.34.1
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2024-04-15 15:20 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-14 0:45 [PATCH 1/6] mm/memblock: reduce the two round insertion of memblock_add_range() Wei Yang
2024-04-14 0:45 ` [PATCH 2/6] memblock tests: add the 129th memory block at all possible position Wei Yang
2024-04-15 15:19 ` Mike Rapoport [this message]
2024-04-16 12:55 ` Wei Yang
2024-04-17 5:51 ` Mike Rapoport
2024-04-18 9:02 ` Wei Yang
2024-04-19 3:15 ` Wei Yang
2024-04-24 13:13 ` Mike Rapoport
2024-04-14 0:45 ` [PATCH 3/6] mm/memblock: fix comment for memblock_isolate_range() Wei Yang
2024-04-14 0:45 ` [PATCH 4/6] mm/memblock: remove consecutive regions at once Wei Yang
2024-04-14 0:45 ` [PATCH 5/6] memblock tests: add memblock_overlaps_region_checks Wei Yang
2024-04-14 0:45 ` [PATCH 6/6] mm/memblock: return true directly on finding overlap region Wei Yang
2024-04-15 15:17 ` [PATCH 1/6] mm/memblock: reduce the two round insertion of memblock_add_range() Mike Rapoport
2024-04-22 2:55 ` Wei Yang
2024-04-24 13:15 ` Mike Rapoport
2024-04-25 1:38 ` Wei Yang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zh1FjvBP0HqF_grj@kernel.org \
--to=rppt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=linux-mm@kvack.org \
--cc=richard.weiyang@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).