Messages in this thread Patch in this message | | | Date | Tue, 30 May 2017 08:44:10 -0700 | From | Davidlohr Bueso <> | Subject | Re: [PATCH 5/5] lib/interval_tree: Fast overlap detection |
| |
On Tue, 30 May 2017, kbuild test robot wrote:
>Hi Davidlohr, > >[auto build test ERROR on next-20170529] > >url: https://github.com/0day-ci/linux/commits/Davidlohr-Bueso/rbtree-Cache-leftmost-node-internally/20170530-101713 >config: x86_64-allmodconfig (attached as .config) >compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901 >reproduce: > # save the attached .config to linux build tree > make ARCH=x86_64 > >All errors (new ones prefixed by >>): > > include/linux/compiler.h:260:8: sparse: attribute 'no_sanitize_address': unknown attribute > drivers/infiniband/hw/hfi1/mmu_rb.c: In function 'hfi1_mmu_rb_insert': >>> drivers/infiniband/hw/hfi1/mmu_rb.c:183:29: error: passing argument 2 of '__mmu_int_rb_insert' from incompatible pointer type [-Werror=incompatible-pointer-types] > __mmu_int_rb_insert(mnode, &handler->root);
Ah, I missed that interval tree user. The following fixes it along with a bogus semicolon for rb_cached_first(). I can add this in v2 if we get there.
Thanks, Davidlohr
diff --git a/drivers/infiniband/hw/hfi1/mmu_rb.c b/drivers/infiniband/hw/hfi1/mmu_rb.c index ccbf52c8ff6f..1835447dcd73 100644 --- a/drivers/infiniband/hw/hfi1/mmu_rb.c +++ b/drivers/infiniband/hw/hfi1/mmu_rb.c @@ -54,7 +54,7 @@ struct mmu_rb_handler { struct mmu_notifier mn; - struct rb_root root; + struct rb_root_cached root; void *ops_arg; spinlock_t lock; /* protect the RB tree */ struct mmu_rb_ops *ops; @@ -111,7 +111,7 @@ int hfi1_mmu_rb_register(void *ops_arg, struct mm_struct *mm, if (!handlr) return -ENOMEM; - handlr->root = RB_ROOT; + handlr->root = RB_ROOT_CACHED; handlr->ops = ops; handlr->ops_arg = ops_arg; INIT_HLIST_NODE(&handlr->mn.hlist); @@ -152,9 +152,9 @@ void hfi1_mmu_rb_unregister(struct mmu_rb_handler *handler) INIT_LIST_HEAD(&del_list); spin_lock_irqsave(&handler->lock, flags); - while ((node = rb_first(&handler->root))) { + while ((node = rb_first_cached(&handler->root))) { rbnode = rb_entry(node, struct mmu_rb_node, node); - rb_erase(node, &handler->root); + rb_erase_cached(node, &handler->root); /* move from LRU list to delete list */ list_move(&rbnode->list, &del_list); } @@ -305,7 +305,7 @@ static void mmu_notifier_mem_invalidate(struct mmu_notifier *mn, { struct mmu_rb_handler *handler = container_of(mn, struct mmu_rb_handler, mn); - struct rb_root *root = &handler->root; + struct rb_root_cached *root = &handler->root; struct mmu_rb_node *node, *ptr = NULL; unsigned long flags; bool added = false; diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h index eb4544811cfd..71c9ee585454 100644 --- a/include/linux/rbtree.h +++ b/include/linux/rbtree.h @@ -78,7 +78,7 @@ extern void rb_insert_color_cached(struct rb_node *, struct rb_root_cached *, bool); extern void rb_erase_cached(struct rb_node *node, struct rb_root_cached *); /* Same as rb_first(), but O(1) */ -#define rb_first_cached(root) (root)->rb_leftmost; +#define rb_first_cached(root) (root)->rb_leftmost /* Postorder iteration - always visit the parent after its children */ extern struct rb_node *rb_first_postorder(const struct rb_root *);
| |