hc
2023-11-23 7d07b3ae8ddad407913c5301877e694430a3263f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * NUMA support for s390
 *
 * A tree structure used for machine topology mangling
 *
 * Copyright IBM Corp. 2015
 */
#ifndef S390_TOPTREE_H
#define S390_TOPTREE_H
 
#include <linux/cpumask.h>
#include <linux/list.h>
 
struct toptree {
   int level;
   int id;
   cpumask_t mask;
   struct toptree *parent;
   struct list_head sibling;
   struct list_head children;
};
 
struct toptree *toptree_alloc(int level, int id);
void toptree_free(struct toptree *cand);
void toptree_update_mask(struct toptree *cand);
void toptree_unify(struct toptree *cand);
struct toptree *toptree_get_child(struct toptree *cand, int id);
void toptree_move(struct toptree *cand, struct toptree *target);
int toptree_count(struct toptree *context, int level);
 
struct toptree *toptree_first(struct toptree *context, int level);
struct toptree *toptree_next(struct toptree *cur, struct toptree *context,
                int level);
 
#define toptree_for_each_child(child, ptree)                \
   list_for_each_entry(child,  &ptree->children, sibling)
 
#define toptree_for_each_child_safe(child, ptmp, ptree)            \
   list_for_each_entry_safe(child, ptmp, &ptree->children, sibling)
 
#define toptree_is_last(ptree)                    \
   ((ptree->parent == NULL) ||                \
    (ptree->parent->children.prev == &ptree->sibling))
 
#define toptree_for_each(ptree, cont, ttype)        \
   for (ptree = toptree_first(cont, ttype);    \
        ptree != NULL;                \
        ptree = toptree_next(ptree, cont, ttype))
 
#define toptree_for_each_safe(ptree, tmp, cont, ttype)        \
   for (ptree = toptree_first(cont, ttype),        \
            tmp = toptree_next(ptree, cont, ttype);    \
        ptree != NULL;                    \
        ptree = tmp,                    \
            tmp = toptree_next(ptree, cont, ttype))
 
#define toptree_for_each_sibling(ptree, start)            \
   toptree_for_each(ptree, start->parent, start->level)
 
#endif /* S390_TOPTREE_H */