mirror of https://gitee.com/openkylin/linux.git
61 lines
1.8 KiB
C
61 lines
1.8 KiB
C
|
/*
|
||
|
* 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 */
|