Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+14 −5
Original line number Diff line number Diff line
@@ -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;
}

+1 −0
Original line number Diff line number Diff line
@@ -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 *);