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: Dennis Dalessandro <dennis.dalessandro@intel.com> Reviewed-by: Dean Luick <dean.luick@intel.com> Signed-off-by: Mitko Haralanov <mitko.haralanov@intel.com> Signed-off-by: Jubin John <jubin.john@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
b8718e2e2e
commit
0f310a00e0
|
@ -181,13 +181,22 @@ static struct mmu_rb_node *__mmu_rb_search(struct mmu_rb_handler *handler,
|
|||
unsigned long addr,
|
||||
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);
|
||||
node = __mmu_int_rb_iter_first(handler->root, addr, len);
|
||||
if (node)
|
||||
hfi1_cdbg(MMU, "Found node addr 0x%llx, len %u", node->addr,
|
||||
node->len);
|
||||
if (!handler->ops->filter) {
|
||||
node = __mmu_int_rb_iter_first(handler->root, addr,
|
||||
(addr + len) - 1);
|
||||
} 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@ struct mmu_rb_node {
|
|||
};
|
||||
|
||||
struct mmu_rb_ops {
|
||||
bool (*filter)(struct mmu_rb_node *, unsigned long, unsigned long);
|
||||
int (*insert)(struct rb_root *, struct mmu_rb_node *);
|
||||
void (*remove)(struct rb_root *, struct mmu_rb_node *, bool);
|
||||
int (*invalidate)(struct rb_root *, struct mmu_rb_node *);
|
||||
|
|
Loading…
Reference in New Issue