All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rebecca Mckeever <remckee0@gmail.com>
To: David Hildenbrand <david@redhat.com>
Cc: Mike Rapoport <rppt@kernel.org>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/4] memblock tests: add top-down NUMA tests for memblock_alloc_try_nid*
Date: Thu, 1 Sep 2022 19:37:03 -0500	[thread overview]
Message-ID: <20220902003703.GB18733@sophie> (raw)
In-Reply-To: <6f61b669-e89f-6615-6b80-088940221858@redhat.com>

On Tue, Aug 30, 2022 at 01:56:00PM +0200, David Hildenbrand wrote:
> On 19.08.22 11:05, 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 2c1d5035e057..a410f1318402 100644
> > --- a/tools/testing/memblock/tests/alloc_nid_api.c
> > +++ b/tools/testing/memblock/tests/alloc_nid_api.c
> > @@ -1102,7 +1102,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__);
> > @@ -1234,17 +1234,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_func_testing(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_func_testing(alloc_nid_test_flags));
> >  
> >  	alloc_try_nid_simple_check();
> >  	alloc_try_nid_misaligned_check();
> > @@ -1261,6 +1254,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;
> 
> Usually we define variables in a single block. So, before the
> PREFIX_PUSH(). Same applies to the other functions.
> 
Got it.

> > +
> > +	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);
> > +	verify_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 that spans over the min_addr
> > + * and max_addr range and overlaps with two different nodes, where the first
> > + * node is the requested node:
> > + *
> > + *                                min_addr
> > + *                                |           max_addr
> > + *                                |           |
> > + *                                v           v
> > + *  |           +-----------------------+-----------+              |
> > + *  |           |       requested       |   node3   |              |
> > + *  +-----------+-----------------------+-----------+--------------+
> > + *                                +           +
> > + *  |                       +-----------+                          |
> > + *  |                       |    rgn    |                          |
> > + *  +-----------------------+-----------+--------------------------+
> > + *
> > + * Expect to drop the lower limit and allocate a cleared memory region that
> > + * ends at the end of the requested node.
> 
> Interesting, allocating out-of-range is expected behavior? At least to
> me that wasn't immediately clear :)
> 
Yeah, it seems that memblock avoids allocations that would overlap with
more than one node. Do you think I should explain that in the comment?

> [...]
> 
> > +
> > +/*
> > + * A test that tries to allocate a memory region that spans over the min_addr
> > + * and max_addr range and overlaps with two different nodes, where the second
> > + * node is the requested node:
> > + *
> > + *                               min_addr
> > + *                               |         max_addr
> > + *                               |         |
> > + *                               v         v
> > + *  |      +--------------------------+---------+                |
> > + *  |      |         expected         |requested|                |
> > + *  +------+--------------------------+---------+----------------+
> > + *                               +         +
> > + *  |                       +---------+                          |
> > + *  |                       |   rgn   |                          |
> > + *  +-----------------------+---------+--------------------------+
> > + *
> > + * Expect to drop the lower limit and allocate a cleared memory region that
> 
> Does the "cleared memory region" part still apply? Or would we also end
> up calling the raw variant from run_memblock_alloc_try_nid() ?
> 
No, it doesn't apply. Thanks for catching this. I should probably add
another patch to update the wording in the pre-existing tests too.

> > + * ends at the end of the first node that overlaps with the range.
> > + */
> > +static int alloc_try_nid_top_down_numa_split_range_high_check(void)
> > +{
> > +	int nid_req = 3;
> > +	int nid_exp = nid_req - 1;
> > +	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
> > +	struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
> > +	void *allocated_ptr = NULL;
> > +
> > +	PREFIX_PUSH();
> > +
> > +	phys_addr_t size = SZ_512;
> > +	phys_addr_t min_addr;
> > +	phys_addr_t max_addr;
> > +	phys_addr_t exp_node_end;
> > +
> > +	setup_numa_memblock();
> > +
> > +	exp_node_end = region_end(exp_node);
> > +	min_addr = exp_node_end - SZ_256;
> > +	max_addr = min_addr + size;
> > +
> > +	allocated_ptr = run_memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
> > +						   min_addr, max_addr, nid_req);
> > +
> > +	ASSERT_NE(allocated_ptr, NULL);
> > +	verify_mem_content(allocated_ptr, size, alloc_nid_test_flags);
> > +
> > +	ASSERT_EQ(new_rgn->size, size);
> > +	ASSERT_EQ(new_rgn->base, exp_node_end - 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;
> > +}
> 
> 
> [...]
> 
> > +int __memblock_alloc_nid_numa_checks(void)
> > +{
> > +	test_print("Running %s NUMA tests...\n",
> > +		   get_func_testing(alloc_nid_test_flags));
> > +
> > +	alloc_try_nid_numa_simple_check();
> > +	alloc_try_nid_numa_small_node_check();
> > +	alloc_try_nid_numa_node_reserved_check();
> > +	alloc_try_nid_numa_part_reserved_check();
> > +	alloc_try_nid_numa_part_reserved_fallback_check();
> > +	alloc_try_nid_numa_split_range_low_check();
> > +	alloc_try_nid_numa_split_range_high_check();
> > +
> > +	alloc_try_nid_numa_no_overlap_split_check();
> > +	alloc_try_nid_numa_no_overlap_low_check();
> > +	alloc_try_nid_numa_no_overlap_high_check();
> > +
> > +	return 0;
> > +}
> > +
> > +static int memblock_alloc_nid_checks_internal(int flags)
> > +{
> > +	alloc_nid_test_flags = flags;
> 
> Empty line missing
> 
Got it.

> > +	prefix_reset();
> > +	prefix_push(get_func_testing(flags));
> > +
> > +	reset_memblock_attributes();
> > +	dummy_physical_memory_init();
> > +
> > +	memblock_alloc_nid_range_checks();
> > +	memblock_alloc_nid_numa_checks();
> > +
> >  	dummy_physical_memory_cleanup();
> >  
> >  	prefix_pop();
> 
> 
> -- 
> Thanks,
> 
> David / dhildenb
> 
>
Thanks,
Rebecca


  reply	other threads:[~2022-09-02  0:37 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-19  9:05 [PATCH v2 0/4] memblock tests: add NUMA tests for memblock_alloc_try_nid* Rebecca Mckeever
2022-08-19  9:05 ` [PATCH v2 1/4] memblock tests: add simulation of physical memory with multiple NUMA nodes Rebecca Mckeever
2022-08-30 11:17   ` David Hildenbrand
2022-08-31  3:49     ` Rebecca Mckeever
2022-08-31 15:12       ` Mike Rapoport
2022-09-01 22:53         ` Rebecca Mckeever
2022-09-01  8:06       ` David Hildenbrand
2022-09-02  0:08         ` Rebecca Mckeever
2022-08-31 15:15   ` Mike Rapoport
2022-09-02  0:14     ` Rebecca Mckeever
2022-08-19  9:05 ` [PATCH v2 2/4] memblock tests: add top-down NUMA tests for memblock_alloc_try_nid* Rebecca Mckeever
2022-08-30 11:56   ` David Hildenbrand
2022-09-02  0:37     ` Rebecca Mckeever [this message]
2022-08-19  9:05 ` [PATCH v2 3/4] memblock tests: add bottom-up " Rebecca Mckeever
2022-08-19  9:05 ` [PATCH v2 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=20220902003703.GB18733@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.