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