Commit 0f310a00 authored by Mitko Haralanov's avatar Mitko Haralanov Committed by Doug Ledford

IB/hfi1: Add filter callback

This commit adds a filter callback, which can be used to filter
out interval RB nodes matching a certain interval down to a
single one.

This is needed for the upcoming SDMA-side caching where buffers
will need to be filtered by their virtual address.
Reviewed-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Reviewed-by: default avatarDean Luick <dean.luick@intel.com>
Signed-off-by: default avatarMitko Haralanov <mitko.haralanov@intel.com>
Signed-off-by: default avatarJubin John <jubin.john@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent b8718e2e
...@@ -181,13 +181,22 @@ static struct mmu_rb_node *__mmu_rb_search(struct mmu_rb_handler *handler, ...@@ -181,13 +181,22 @@ static struct mmu_rb_node *__mmu_rb_search(struct mmu_rb_handler *handler,
unsigned long addr, unsigned long addr,
unsigned long len) unsigned long len)
{ {
struct mmu_rb_node *node; struct mmu_rb_node *node = NULL;
hfi1_cdbg(MMU, "Searching for addr 0x%llx, len %u", addr, len); hfi1_cdbg(MMU, "Searching for addr 0x%llx, len %u", addr, len);
node = __mmu_int_rb_iter_first(handler->root, addr, len); if (!handler->ops->filter) {
if (node) node = __mmu_int_rb_iter_first(handler->root, addr,
hfi1_cdbg(MMU, "Found node addr 0x%llx, len %u", node->addr, (addr + len) - 1);
node->len); } else {
for (node = __mmu_int_rb_iter_first(handler->root, addr,
(addr + len) - 1);
node;
node = __mmu_int_rb_iter_next(node, addr,
(addr + len) - 1)) {
if (handler->ops->filter(node, addr, len))
return node;
}
}
return node; return node;
} }
......
...@@ -57,6 +57,7 @@ struct mmu_rb_node { ...@@ -57,6 +57,7 @@ struct mmu_rb_node {
}; };
struct mmu_rb_ops { struct mmu_rb_ops {
bool (*filter)(struct mmu_rb_node *, unsigned long, unsigned long);
int (*insert)(struct rb_root *, struct mmu_rb_node *); int (*insert)(struct rb_root *, struct mmu_rb_node *);
void (*remove)(struct rb_root *, struct mmu_rb_node *, bool); void (*remove)(struct rb_root *, struct mmu_rb_node *, bool);
int (*invalidate)(struct rb_root *, struct mmu_rb_node *); int (*invalidate)(struct rb_root *, struct mmu_rb_node *);
......
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