From: Rebecca Mckeever <remckee0@gmail.com>
To: Mike Rapoport <rppt@kernel.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
David Hildenbrand <david@redhat.com>
Subject: Re: [PATCH v3 2/4] memblock tests: add top-down NUMA tests for memblock_alloc_try_nid*
Date: Thu, 1 Sep 2022 19:51:21 -0500 [thread overview]
Message-ID: <20220902005121.GC18733@sophie> (raw)
In-Reply-To: <YxB0fh+YaVMq+AF+@kernel.org>
On Thu, Sep 01, 2022 at 11:59:42AM +0300, Mike Rapoport wrote:
> On Sat, Aug 27, 2022 at 12:53:00AM -0500, Rebecca Mckeever wrote:
> > Add tests for memblock_alloc_try_nid() and memblock_alloc_try_nid_raw()
> > where the simulated physical memory is set up with multiple NUMA nodes.
> > Additionally, all of these tests set nid != NUMA_NO_NODE. These tests are
> > run with a top-down allocation direction.
> >
> > The tested scenarios are:
> >
> > Range unrestricted:
> > - region can be allocated in the specific node requested:
> > + there are no previously reserved regions
> > + the requested node is partially reserved but has enough space
> > - the specific node requested cannot accommodate the request, but the
> > region can be allocated in a different node:
> > + there are no previously reserved regions, but node is too small
> > + the requested node is fully reserved
> > + the requested node is partially reserved and does not have
> > enough space
> >
> > Range restricted:
> > - region can be allocated in the specific node requested after dropping
> > min_addr:
> > + range partially overlaps with two different nodes, where the first
> > node is the requested node
> > + range partially overlaps with two different nodes, where the
> > requested node ends before min_addr
> > - region cannot be allocated in the specific node requested, but it can be
> > allocated in the requested range:
> > + range overlaps with multiple nodes along node boundaries, and the
> > requested node ends before min_addr
> > + range overlaps with multiple nodes along node boundaries, and the
> > requested node starts after max_addr
> > - region cannot be allocated in the specific node requested, but it can be
> > allocated after dropping min_addr:
> > + range partially overlaps with two different nodes, where the
> > second node is the requested node
> >
> > Signed-off-by: Rebecca Mckeever <remckee0@gmail.com>
> > ---
> > tools/testing/memblock/tests/alloc_nid_api.c | 702 ++++++++++++++++++-
> > tools/testing/memblock/tests/alloc_nid_api.h | 16 +
> > tools/testing/memblock/tests/common.h | 18 +
> > 3 files changed, 725 insertions(+), 11 deletions(-)
> >
> > diff --git a/tools/testing/memblock/tests/alloc_nid_api.c b/tools/testing/memblock/tests/alloc_nid_api.c
> > index 32b3c1594fdd..e5ef93ea1ce5 100644
> > --- a/tools/testing/memblock/tests/alloc_nid_api.c
> > +++ b/tools/testing/memblock/tests/alloc_nid_api.c
> > @@ -1094,7 +1094,7 @@ static int alloc_try_nid_bottom_up_cap_min_check(void)
> > return 0;
> > }
> >
> > -/* Test case wrappers */
> > +/* Test case wrappers for range tests */
> > static int alloc_try_nid_simple_check(void)
> > {
> > test_print("\tRunning %s...\n", __func__);
> > @@ -1226,17 +1226,10 @@ static int alloc_try_nid_low_max_check(void)
> > return 0;
> > }
> >
> > -static int memblock_alloc_nid_checks_internal(int flags)
> > +static int memblock_alloc_nid_range_checks(void)
> > {
> > - const char *func = get_memblock_alloc_try_nid_name(flags);
> > -
> > - alloc_nid_test_flags = flags;
> > - prefix_reset();
> > - prefix_push(func);
> > - test_print("Running %s tests...\n", func);
> > -
> > - reset_memblock_attributes();
> > - dummy_physical_memory_init();
> > + test_print("Running %s range tests...\n",
> > + get_memblock_alloc_try_nid_name(alloc_nid_test_flags));
> >
> > alloc_try_nid_simple_check();
> > alloc_try_nid_misaligned_check();
> > @@ -1253,6 +1246,693 @@ static int memblock_alloc_nid_checks_internal(int flags)
> > alloc_try_nid_reserved_all_check();
> > alloc_try_nid_low_max_check();
> >
> > + return 0;
> > +}
> > +
> > +/*
> > + * A test that tries to allocate a memory region in a specific NUMA node that
> > + * has enough memory to allocate a region of the requested size.
> > + * Expect to allocate an aligned region at the end of the requested node.
> > + */
> > +static int alloc_try_nid_top_down_numa_simple_check(void)
> > +{
> > + int nid_req = 3;
> > + struct memblock_region *new_rgn = &memblock.reserved.regions[0];
> > + struct memblock_region *req_node = &memblock.memory.regions[nid_req];
> > + void *allocated_ptr = NULL;
> > +
> > + PREFIX_PUSH();
> > +
> > + phys_addr_t size;
> > + phys_addr_t min_addr;
> > + phys_addr_t max_addr;
> > +
> > + setup_numa_memblock();
> > +
> > + ASSERT_LE(SZ_4, req_node->size);
> > + size = req_node->size / SZ_4;
> > + min_addr = memblock_start_of_DRAM();
> > + max_addr = memblock_end_of_DRAM();
> > +
> > + allocated_ptr = run_memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
> > + min_addr, max_addr, nid_req);
> > +
> > + ASSERT_NE(allocated_ptr, NULL);
> > + assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
> > +
> > + ASSERT_EQ(new_rgn->size, size);
> > + ASSERT_EQ(new_rgn->base, region_end(req_node) - size);
> > + ASSERT_LE(req_node->base, new_rgn->base);
> > +
> > + ASSERT_EQ(memblock.reserved.cnt, 1);
> > + ASSERT_EQ(memblock.reserved.total_size, size);
> > +
> > + test_pass_pop();
> > +
> > + return 0;
> > +}
> > +
> > +/*
> > + * A test that tries to allocate a memory region in a specific NUMA node that
> > + * does not have enough memory to allocate a region of the requested size:
> > + *
> > + * | +-----+ +------------------+ |
> > + * | | req | | expected | |
> > + * +---+-----+----------+------------------+-----+
> > + *
> > + * | +---------+ |
> > + * | | rgn | |
> > + * +-----------------------------+---------+-----+
> > + *
> > + * Expect to allocate an aligned region at the end of the last node that has
> > + * enough memory (in this case, nid = 6) after falling back to NUMA_NO_NODE.
> > + */
> > +static int alloc_try_nid_top_down_numa_small_node_check(void)
> > +{
> > + int nid_req = 1;
> > + int nid_exp = 6;
> > + struct memblock_region *new_rgn = &memblock.reserved.regions[0];
> > + struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
>
> AFAIU, having required and expected nodes here means very tight relation
> between the NUMA layout used by setup_numa_memblock() and the test cases.
>
> I believe it would be clearer and less error prone if the relation were
> more explicit.
>
I agree.
> Can't say I have a great ideas how to achieve this, but maybe its worth
> passing NUMA layout to setup_numa_memblock() every time, or setting the
> requested and expected nid based on the NUMA layout, or maybe something
> smarted than either of these.
>
I like the first option. I'll pass the NUMA layout if I can't think of a
better idea.
> > + void *allocated_ptr = NULL;
> > +
> > + PREFIX_PUSH();
> > +
> > + phys_addr_t size;
> > + phys_addr_t min_addr;
> > + phys_addr_t max_addr;
> > +
> > + setup_numa_memblock();
> > +
> > + size = SZ_2K * MEM_FACTOR;
> > + min_addr = memblock_start_of_DRAM();
> > + max_addr = memblock_end_of_DRAM();
> > +
> > + allocated_ptr = run_memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
> > + min_addr, max_addr, nid_req);
> > +
> > + ASSERT_NE(allocated_ptr, NULL);
> > + assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
> > +
> > + ASSERT_EQ(new_rgn->size, size);
> > + ASSERT_EQ(new_rgn->base, region_end(exp_node) - size);
> > + ASSERT_LE(exp_node->base, new_rgn->base);
> > +
> > + ASSERT_EQ(memblock.reserved.cnt, 1);
> > + ASSERT_EQ(memblock.reserved.total_size, size);
> > +
> > + test_pass_pop();
> > +
> > + return 0;
> > +}
> > +
>
> --
> Sincerely yours,
> Mike.
Thanks,
Rebecca
next prev parent reply other threads:[~2022-09-02 0:51 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-27 5:52 [PATCH v3 0/4] memblock tests: add NUMA tests for memblock_alloc_try_nid* Rebecca Mckeever
2022-08-27 5:52 ` [PATCH v3 1/4] memblock tests: add simulation of physical memory with multiple NUMA nodes Rebecca Mckeever
2022-08-27 5:53 ` [PATCH v3 2/4] memblock tests: add top-down NUMA tests for memblock_alloc_try_nid* Rebecca Mckeever
2022-09-01 8:59 ` Mike Rapoport
2022-09-02 0:51 ` Rebecca Mckeever [this message]
2022-08-27 5:53 ` [PATCH v3 3/4] memblock tests: add bottom-up " Rebecca Mckeever
2022-08-27 5:53 ` [PATCH v3 4/4] memblock tests: add generic " Rebecca Mckeever
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=20220902005121.GC18733@sophie \
--to=remckee0@gmail.com \
--cc=david@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=rppt@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.