18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <linux/compiler.h> 38c2ecf20Sopenharmony_ci#include <linux/bitmap.h> 48c2ecf20Sopenharmony_ci#include <linux/kernel.h> 58c2ecf20Sopenharmony_ci#include <linux/zalloc.h> 68c2ecf20Sopenharmony_ci#include <perf/cpumap.h> 78c2ecf20Sopenharmony_ci#include <internal/cpumap.h> 88c2ecf20Sopenharmony_ci#include "debug.h" 98c2ecf20Sopenharmony_ci#include "env.h" 108c2ecf20Sopenharmony_ci#include "mem2node.h" 118c2ecf20Sopenharmony_ci#include "tests.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistatic struct node { 148c2ecf20Sopenharmony_ci int node; 158c2ecf20Sopenharmony_ci const char *map; 168c2ecf20Sopenharmony_ci} test_nodes[] = { 178c2ecf20Sopenharmony_ci { .node = 0, .map = "0" }, 188c2ecf20Sopenharmony_ci { .node = 1, .map = "1-2" }, 198c2ecf20Sopenharmony_ci { .node = 3, .map = "5-7,9" }, 208c2ecf20Sopenharmony_ci}; 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define T TEST_ASSERT_VAL 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic unsigned long *get_bitmap(const char *str, int nbits) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci struct perf_cpu_map *map = perf_cpu_map__new(str); 278c2ecf20Sopenharmony_ci unsigned long *bm = NULL; 288c2ecf20Sopenharmony_ci int i; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci bm = bitmap_alloc(nbits); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci if (map && bm) { 338c2ecf20Sopenharmony_ci for (i = 0; i < map->nr; i++) { 348c2ecf20Sopenharmony_ci set_bit(map->map[i], bm); 358c2ecf20Sopenharmony_ci } 368c2ecf20Sopenharmony_ci } 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci if (map) 398c2ecf20Sopenharmony_ci perf_cpu_map__put(map); 408c2ecf20Sopenharmony_ci else 418c2ecf20Sopenharmony_ci free(bm); 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci return bm && map ? bm : NULL; 448c2ecf20Sopenharmony_ci} 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ciint test__mem2node(struct test *t __maybe_unused, int subtest __maybe_unused) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci struct mem2node map; 498c2ecf20Sopenharmony_ci struct memory_node nodes[3]; 508c2ecf20Sopenharmony_ci struct perf_env env = { 518c2ecf20Sopenharmony_ci .memory_nodes = (struct memory_node *) &nodes[0], 528c2ecf20Sopenharmony_ci .nr_memory_nodes = ARRAY_SIZE(nodes), 538c2ecf20Sopenharmony_ci .memory_bsize = 0x100, 548c2ecf20Sopenharmony_ci }; 558c2ecf20Sopenharmony_ci unsigned int i; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(nodes); i++) { 588c2ecf20Sopenharmony_ci nodes[i].node = test_nodes[i].node; 598c2ecf20Sopenharmony_ci nodes[i].size = 10; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci T("failed: alloc bitmap", 628c2ecf20Sopenharmony_ci (nodes[i].set = get_bitmap(test_nodes[i].map, 10))); 638c2ecf20Sopenharmony_ci } 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci T("failed: mem2node__init", !mem2node__init(&map, &env)); 668c2ecf20Sopenharmony_ci T("failed: mem2node__node", 0 == mem2node__node(&map, 0x50)); 678c2ecf20Sopenharmony_ci T("failed: mem2node__node", 1 == mem2node__node(&map, 0x100)); 688c2ecf20Sopenharmony_ci T("failed: mem2node__node", 1 == mem2node__node(&map, 0x250)); 698c2ecf20Sopenharmony_ci T("failed: mem2node__node", 3 == mem2node__node(&map, 0x500)); 708c2ecf20Sopenharmony_ci T("failed: mem2node__node", 3 == mem2node__node(&map, 0x650)); 718c2ecf20Sopenharmony_ci T("failed: mem2node__node", -1 == mem2node__node(&map, 0x450)); 728c2ecf20Sopenharmony_ci T("failed: mem2node__node", -1 == mem2node__node(&map, 0x1050)); 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(nodes); i++) 758c2ecf20Sopenharmony_ci zfree(&nodes[i].set); 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci mem2node__exit(&map); 788c2ecf20Sopenharmony_ci return 0; 798c2ecf20Sopenharmony_ci} 80