@@ -2434,6 +2434,107 @@ static int memblock_overlaps_region_checks(void)
2434
2434
return 0 ;
2435
2435
}
2436
2436
2437
+ #ifdef CONFIG_NUMA
2438
+ static int memblock_set_node_check (void )
2439
+ {
2440
+ unsigned long i , max_reserved ;
2441
+ struct memblock_region * rgn ;
2442
+ void * orig_region ;
2443
+
2444
+ PREFIX_PUSH ();
2445
+
2446
+ reset_memblock_regions ();
2447
+ memblock_allow_resize ();
2448
+
2449
+ dummy_physical_memory_init ();
2450
+ memblock_add (dummy_physical_memory_base (), MEM_SIZE );
2451
+ orig_region = memblock .reserved .regions ;
2452
+
2453
+ /* Equally Split range to node 0 and 1*/
2454
+ memblock_set_node (memblock_start_of_DRAM (),
2455
+ memblock_phys_mem_size () / 2 , & memblock .memory , 0 );
2456
+ memblock_set_node (memblock_start_of_DRAM () + memblock_phys_mem_size () / 2 ,
2457
+ memblock_phys_mem_size () / 2 , & memblock .memory , 1 );
2458
+
2459
+ ASSERT_EQ (memblock .memory .cnt , 2 );
2460
+ rgn = & memblock .memory .regions [0 ];
2461
+ ASSERT_EQ (rgn -> base , memblock_start_of_DRAM ());
2462
+ ASSERT_EQ (rgn -> size , memblock_phys_mem_size () / 2 );
2463
+ ASSERT_EQ (memblock_get_region_node (rgn ), 0 );
2464
+ rgn = & memblock .memory .regions [1 ];
2465
+ ASSERT_EQ (rgn -> base , memblock_start_of_DRAM () + memblock_phys_mem_size () / 2 );
2466
+ ASSERT_EQ (rgn -> size , memblock_phys_mem_size () / 2 );
2467
+ ASSERT_EQ (memblock_get_region_node (rgn ), 1 );
2468
+
2469
+ /* Reserve 126 regions with the last one across node boundary */
2470
+ for (i = 0 ; i < 125 ; i ++ )
2471
+ memblock_reserve (memblock_start_of_DRAM () + SZ_16 * i , SZ_8 );
2472
+
2473
+ memblock_reserve (memblock_start_of_DRAM () + memblock_phys_mem_size () / 2 - SZ_8 ,
2474
+ SZ_16 );
2475
+
2476
+ /*
2477
+ * Commit 61167ad5fecd ("mm: pass nid to reserve_bootmem_region()")
2478
+ * do following process to set nid to each memblock.reserved region.
2479
+ * But it may miss some region if memblock_set_node() double the
2480
+ * array.
2481
+ *
2482
+ * By checking 'max', we make sure all region nid is set properly.
2483
+ */
2484
+ repeat :
2485
+ max_reserved = memblock .reserved .max ;
2486
+ for_each_mem_region (rgn ) {
2487
+ int nid = memblock_get_region_node (rgn );
2488
+
2489
+ memblock_set_node (rgn -> base , rgn -> size , & memblock .reserved , nid );
2490
+ }
2491
+ if (max_reserved != memblock .reserved .max )
2492
+ goto repeat ;
2493
+
2494
+ /* Confirm each region has valid node set */
2495
+ for_each_reserved_mem_region (rgn ) {
2496
+ ASSERT_TRUE (numa_valid_node (memblock_get_region_node (rgn )));
2497
+ if (rgn == (memblock .reserved .regions + memblock .reserved .cnt - 1 ))
2498
+ ASSERT_EQ (1 , memblock_get_region_node (rgn ));
2499
+ else
2500
+ ASSERT_EQ (0 , memblock_get_region_node (rgn ));
2501
+ }
2502
+
2503
+ dummy_physical_memory_cleanup ();
2504
+
2505
+ /*
2506
+ * The current reserved.regions is occupying a range of memory that
2507
+ * allocated from dummy_physical_memory_init(). After free the memory,
2508
+ * we must not use it. So restore the origin memory region to make sure
2509
+ * the tests can run as normal and not affected by the double array.
2510
+ */
2511
+ memblock .reserved .regions = orig_region ;
2512
+ memblock .reserved .cnt = INIT_MEMBLOCK_RESERVED_REGIONS ;
2513
+
2514
+ test_pass_pop ();
2515
+
2516
+ return 0 ;
2517
+ }
2518
+
2519
+ static int memblock_set_node_checks (void )
2520
+ {
2521
+ prefix_reset ();
2522
+ prefix_push ("memblock_set_node" );
2523
+ test_print ("Running memblock_set_node tests...\n" );
2524
+
2525
+ memblock_set_node_check ();
2526
+
2527
+ prefix_pop ();
2528
+
2529
+ return 0 ;
2530
+ }
2531
+ #else
2532
+ static int memblock_set_node_checks (void )
2533
+ {
2534
+ return 0 ;
2535
+ }
2536
+ #endif
2537
+
2437
2538
int memblock_basic_checks (void )
2438
2539
{
2439
2540
memblock_initialization_check ();
@@ -2444,6 +2545,7 @@ int memblock_basic_checks(void)
2444
2545
memblock_bottom_up_checks ();
2445
2546
memblock_trim_memory_checks ();
2446
2547
memblock_overlaps_region_checks ();
2548
+ memblock_set_node_checks ();
2447
2549
2448
2550
return 0 ;
2449
2551
}
0 commit comments