]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/libbenchmark/src/libbenchmark_topology/libbenchmark_topology_numa.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / libbenchmark / src / libbenchmark_topology / libbenchmark_topology_numa.c
1 /***** includes *****/
2 #include "libbenchmark_topology_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void libbenchmark_topology_generate_numa_modes_list( struct libbenchmark_topology_state *ts, enum libbenchmark_topology_numa_mode numa_mode, struct libshared_memory_state *ms, struct lfds710_list_asu_state *numa_modes_list )
10 {
11   lfds710_pal_uint_t
12     numa_node_count;
13
14   struct libbenchmark_topology_numa_node
15     *tnn;
16
17   LFDS710_PAL_ASSERT( ts != NULL );
18   LFDS710_PAL_ASSERT( numa_mode == LIBBENCHMARK_TOPOLOGY_NUMA_MODE_SMP or numa_mode == LIBBENCHMARK_TOPOLOGY_NUMA_MODE_NUMA );
19   LFDS710_PAL_ASSERT( ms != NULL );
20   LFDS710_PAL_ASSERT( numa_modes_list != NULL );
21
22   lfds710_list_asu_init_valid_on_current_logical_core( numa_modes_list, NULL );
23
24   switch( numa_mode )
25   {
26     case LIBBENCHMARK_TOPOLOGY_NUMA_MODE_SMP:
27       tnn = libshared_memory_alloc_from_most_free_space_node( ms, sizeof(struct libbenchmark_topology_numa_node), LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
28       tnn->mode = LIBBENCHMARK_TOPOLOGY_NUMA_MODE_SMP;
29       LFDS710_LIST_ASU_SET_VALUE_IN_ELEMENT( tnn->lasue, tnn );
30       lfds710_list_asu_insert_at_start( numa_modes_list, &tnn->lasue );
31     break;
32
33     case LIBBENCHMARK_TOPOLOGY_NUMA_MODE_NUMA:
34       libbenchmark_topology_query( ts, LIBBENCHMARK_TOPOLOGY_QUERY_GET_NUMBER_OF_NODE_TYPE, (void *) (lfds710_pal_uint_t) LIBBENCHMARK_TOPOLOGY_NODE_TYPE_NUMA, &numa_node_count );
35
36       if( numa_node_count == 1 )
37       {
38         tnn = libshared_memory_alloc_from_most_free_space_node( ms, sizeof(struct libbenchmark_topology_numa_node), LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
39         tnn->mode = LIBBENCHMARK_TOPOLOGY_NUMA_MODE_NUMA;
40         LFDS710_LIST_ASU_SET_VALUE_IN_ELEMENT( tnn->lasue, tnn );
41         lfds710_list_asu_insert_at_start( numa_modes_list, &tnn->lasue );
42       }
43
44       if( numa_node_count >= 2 )
45       {
46         tnn = libshared_memory_alloc_from_most_free_space_node( ms, sizeof(struct libbenchmark_topology_numa_node), LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
47         tnn->mode = LIBBENCHMARK_TOPOLOGY_NUMA_MODE_NUMA;
48         LFDS710_LIST_ASU_SET_VALUE_IN_ELEMENT( tnn->lasue, tnn );
49         lfds710_list_asu_insert_at_start( numa_modes_list, &tnn->lasue );
50
51         tnn = libshared_memory_alloc_from_most_free_space_node( ms, sizeof(struct libbenchmark_topology_numa_node), LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
52         tnn->mode = LIBBENCHMARK_TOPOLOGY_NUMA_MODE_NUMA_BUT_NOT_USED;
53         LFDS710_LIST_ASU_SET_VALUE_IN_ELEMENT( tnn->lasue, tnn );
54         lfds710_list_asu_insert_at_start( numa_modes_list, &tnn->lasue );
55       }
56     break;
57
58     case LIBBENCHMARK_TOPOLOGY_NUMA_MODE_NUMA_BUT_NOT_USED:
59       // TRD : not used
60     break;
61   }
62
63   return;
64 }
65