X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_rbtree.h;h=1597c0a768edb3e4c6066c57e1d468d61cf5cfa1;hb=1aca7149486edc3fc72bb0dcf39b18fb12eb23a8;hp=44131fce4570bb07b3b95f7260318ee6348f4a21;hpb=da0f0deecf22754656bad2a95640461ec3ac4f1d;p=palacios.git diff --git a/palacios/include/palacios/vmm_rbtree.h b/palacios/include/palacios/vmm_rbtree.h index 44131fc..1597c0a 100644 --- a/palacios/include/palacios/vmm_rbtree.h +++ b/palacios/include/palacios/vmm_rbtree.h @@ -96,26 +96,31 @@ static inline struct page * rb_insert_page_cache(struct inode * inode, #ifdef __V3VEE__ +#include -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) + +#undef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) struct rb_node { - unsigned long rb_parent_color; + unsigned long rb_parent_color; #define RB_RED 0 #define RB_BLACK 1 - struct rb_node *rb_right; - struct rb_node *rb_left; + struct rb_node *rb_right; + struct rb_node *rb_left; } __attribute__((aligned(sizeof(long)))); - /* The alignment might seem pointless, but allegedly CRIS needs it */ +/* The alignment might seem pointless, but allegedly CRIS needs it */ struct rb_root { - struct rb_node *rb_node; + struct rb_node *rb_node; }; @@ -128,11 +133,11 @@ struct rb_root static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p) { - rb->rb_parent_color = (rb->rb_parent_color & 3) | (unsigned long)p; + rb->rb_parent_color = (rb->rb_parent_color & 3) | (unsigned long)p; } static inline void rb_set_color(struct rb_node *rb, int color) { - rb->rb_parent_color = (rb->rb_parent_color & ~1) | color; + rb->rb_parent_color = (rb->rb_parent_color & ~1) | color; } #define RB_ROOT (struct rb_root) { NULL, } @@ -158,12 +163,17 @@ extern void v3_rb_replace_node(struct rb_node *victim, struct rb_node *new, static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, struct rb_node ** rb_link) { - node->rb_parent_color = (unsigned long )parent; - node->rb_left = node->rb_right = NULL; + node->rb_parent_color = (unsigned long )parent; + node->rb_left = node->rb_right = NULL; - *rb_link = node; + *rb_link = node; } +#define v3_rb_for_each_entry(pos, root, member) \ + for (pos = rb_entry(v3_rb_first(root), typeof(*pos), member); \ + &pos->member != v3_rb_last(root); \ + pos = rb_entry(v3_rb_next(&(pos->member)), typeof(*pos), member)) + #endif