Commit f23e59fb authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller

fib_trie: Move parent from key_vector to tnode

This change pulls the parent pointer from the key_vector and places it in
the tnode structure.
Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6e22d174
...@@ -93,8 +93,6 @@ typedef unsigned int t_key; ...@@ -93,8 +93,6 @@ typedef unsigned int t_key;
#define IS_LEAF(n) (!(n)->bits) #define IS_LEAF(n) (!(n)->bits)
struct key_vector { struct key_vector {
struct key_vector __rcu *parent;
t_key key; t_key key;
unsigned char pos; /* 2log(KEYLENGTH) bits needed */ unsigned char pos; /* 2log(KEYLENGTH) bits needed */
unsigned char bits; /* 2log(KEYLENGTH) bits needed */ unsigned char bits; /* 2log(KEYLENGTH) bits needed */
...@@ -111,6 +109,7 @@ struct tnode { ...@@ -111,6 +109,7 @@ struct tnode {
struct rcu_head rcu; struct rcu_head rcu;
t_key empty_children; /* KEYLENGTH bits needed */ t_key empty_children; /* KEYLENGTH bits needed */
t_key full_children; /* KEYLENGTH bits needed */ t_key full_children; /* KEYLENGTH bits needed */
struct key_vector __rcu *parent;
struct key_vector kv[1]; struct key_vector kv[1];
#define tn_bits kv[0].bits #define tn_bits kv[0].bits
}; };
...@@ -165,21 +164,21 @@ static inline struct tnode *tn_info(struct key_vector *kv) ...@@ -165,21 +164,21 @@ static inline struct tnode *tn_info(struct key_vector *kv)
} }
/* caller must hold RTNL */ /* caller must hold RTNL */
#define node_parent(n) rtnl_dereference((n)->parent) #define node_parent(tn) rtnl_dereference(tn_info(tn)->parent)
#define get_child(tn, i) rtnl_dereference((tn)->tnode[i]) #define get_child(tn, i) rtnl_dereference((tn)->tnode[i])
/* caller must hold RCU read lock or RTNL */ /* caller must hold RCU read lock or RTNL */
#define node_parent_rcu(n) rcu_dereference_rtnl((n)->parent) #define node_parent_rcu(tn) rcu_dereference_rtnl(tn_info(tn)->parent)
#define get_child_rcu(tn, i) rcu_dereference_rtnl((tn)->tnode[i]) #define get_child_rcu(tn, i) rcu_dereference_rtnl((tn)->tnode[i])
/* wrapper for rcu_assign_pointer */ /* wrapper for rcu_assign_pointer */
static inline void node_set_parent(struct key_vector *n, struct key_vector *tp) static inline void node_set_parent(struct key_vector *n, struct key_vector *tp)
{ {
if (n) if (n)
rcu_assign_pointer(n->parent, tp); rcu_assign_pointer(tn_info(n)->parent, tp);
} }
#define NODE_INIT_PARENT(n, p) RCU_INIT_POINTER((n)->parent, p) #define NODE_INIT_PARENT(n, p) RCU_INIT_POINTER(tn_info(n)->parent, p)
/* This provides us with the number of children in this node, in the case of a /* This provides us with the number of children in this node, in the case of a
* leaf this will return 0 meaning none of the children are accessible. * leaf this will return 0 meaning none of the children are accessible.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment