1 // SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause
3 * Copyright(c) 2020 Cornelis Networks, Inc.
4 * Copyright(c) 2016 - 2017 Intel Corporation.
7 #include <linux/list.h>
8 #include <linux/rculist.h>
9 #include <linux/mmu_notifier.h>
10 #include <linux/interval_tree_generic.h>
11 #include <linux/sched/mm.h>
16 static unsigned long mmu_node_start(struct mmu_rb_node *);
17 static unsigned long mmu_node_last(struct mmu_rb_node *);
18 static int mmu_notifier_range_start(struct mmu_notifier *,
19 const struct mmu_notifier_range *);
20 static struct mmu_rb_node *__mmu_rb_search(struct mmu_rb_handler *,
21 unsigned long, unsigned long);
22 static void do_remove(struct mmu_rb_handler *handler,
23 struct list_head *del_list);
24 static void handle_remove(struct work_struct *work);
26 static const struct mmu_notifier_ops mn_opts = {
27 .invalidate_range_start = mmu_notifier_range_start,
30 INTERVAL_TREE_DEFINE(struct mmu_rb_node, node, unsigned long, __last,
31 mmu_node_start, mmu_node_last, static, __mmu_int_rb);
33 static unsigned long mmu_node_start(struct mmu_rb_node *node)
35 return node->addr & PAGE_MASK;
38 static unsigned long mmu_node_last(struct mmu_rb_node *node)
40 return PAGE_ALIGN(node->addr + node->len) - 1;
43 int hfi1_mmu_rb_register(void *ops_arg,
44 struct mmu_rb_ops *ops,
45 struct workqueue_struct *wq,
46 struct mmu_rb_handler **handler)
48 struct mmu_rb_handler *h;
52 free_ptr = kzalloc(sizeof(*h) + cache_line_size() - 1, GFP_KERNEL);
56 h = PTR_ALIGN(free_ptr, cache_line_size());
57 h->root = RB_ROOT_CACHED;
60 INIT_HLIST_NODE(&h->mn.hlist);
61 spin_lock_init(&h->lock);
63 INIT_WORK(&h->del_work, handle_remove);
64 INIT_LIST_HEAD(&h->del_list);
65 INIT_LIST_HEAD(&h->lru_list);
67 h->free_ptr = free_ptr;
69 ret = mmu_notifier_register(&h->mn, current->mm);
79 void hfi1_mmu_rb_unregister(struct mmu_rb_handler *handler)
81 struct mmu_rb_node *rbnode;
84 struct list_head del_list;
86 /* Prevent freeing of mm until we are completely finished. */
87 mmgrab(handler->mn.mm);
89 /* Unregister first so we don't get any more notifications. */
90 mmu_notifier_unregister(&handler->mn, handler->mn.mm);
93 * Make sure the wq delete handler is finished running. It will not
94 * be triggered once the mmu notifiers are unregistered above.
96 flush_work(&handler->del_work);
98 INIT_LIST_HEAD(&del_list);
100 spin_lock_irqsave(&handler->lock, flags);
101 while ((node = rb_first_cached(&handler->root))) {
102 rbnode = rb_entry(node, struct mmu_rb_node, node);
103 rb_erase_cached(node, &handler->root);
104 /* move from LRU list to delete list */
105 list_move(&rbnode->list, &del_list);
107 spin_unlock_irqrestore(&handler->lock, flags);
109 do_remove(handler, &del_list);
111 /* Now the mm may be freed. */
112 mmdrop(handler->mn.mm);
114 kfree(handler->free_ptr);
117 int hfi1_mmu_rb_insert(struct mmu_rb_handler *handler,
118 struct mmu_rb_node *mnode)
120 struct mmu_rb_node *node;
124 trace_hfi1_mmu_rb_insert(mnode->addr, mnode->len);
126 if (current->mm != handler->mn.mm)
129 spin_lock_irqsave(&handler->lock, flags);
130 node = __mmu_rb_search(handler, mnode->addr, mnode->len);
135 __mmu_int_rb_insert(mnode, &handler->root);
136 list_add_tail(&mnode->list, &handler->lru_list);
138 ret = handler->ops->insert(handler->ops_arg, mnode);
140 __mmu_int_rb_remove(mnode, &handler->root);
141 list_del(&mnode->list); /* remove from LRU list */
143 mnode->handler = handler;
145 spin_unlock_irqrestore(&handler->lock, flags);
149 /* Caller must hold handler lock */
150 struct mmu_rb_node *hfi1_mmu_rb_get_first(struct mmu_rb_handler *handler,
151 unsigned long addr, unsigned long len)
153 struct mmu_rb_node *node;
155 trace_hfi1_mmu_rb_search(addr, len);
156 node = __mmu_int_rb_iter_first(&handler->root, addr, (addr + len) - 1);
158 list_move_tail(&node->list, &handler->lru_list);
162 /* Caller must hold handler lock */
163 static struct mmu_rb_node *__mmu_rb_search(struct mmu_rb_handler *handler,
167 struct mmu_rb_node *node = NULL;
169 trace_hfi1_mmu_rb_search(addr, len);
170 if (!handler->ops->filter) {
171 node = __mmu_int_rb_iter_first(&handler->root, addr,
174 for (node = __mmu_int_rb_iter_first(&handler->root, addr,
177 node = __mmu_int_rb_iter_next(node, addr,
179 if (handler->ops->filter(node, addr, len))
186 void hfi1_mmu_rb_evict(struct mmu_rb_handler *handler, void *evict_arg)
188 struct mmu_rb_node *rbnode, *ptr;
189 struct list_head del_list;
193 if (current->mm != handler->mn.mm)
196 INIT_LIST_HEAD(&del_list);
198 spin_lock_irqsave(&handler->lock, flags);
199 list_for_each_entry_safe(rbnode, ptr, &handler->lru_list, list) {
200 if (handler->ops->evict(handler->ops_arg, rbnode, evict_arg,
202 __mmu_int_rb_remove(rbnode, &handler->root);
203 /* move from LRU list to delete list */
204 list_move(&rbnode->list, &del_list);
209 spin_unlock_irqrestore(&handler->lock, flags);
211 list_for_each_entry_safe(rbnode, ptr, &del_list, list) {
212 handler->ops->remove(handler->ops_arg, rbnode);
216 static int mmu_notifier_range_start(struct mmu_notifier *mn,
217 const struct mmu_notifier_range *range)
219 struct mmu_rb_handler *handler =
220 container_of(mn, struct mmu_rb_handler, mn);
221 struct rb_root_cached *root = &handler->root;
222 struct mmu_rb_node *node, *ptr = NULL;
226 spin_lock_irqsave(&handler->lock, flags);
227 for (node = __mmu_int_rb_iter_first(root, range->start, range->end-1);
229 /* Guard against node removal. */
230 ptr = __mmu_int_rb_iter_next(node, range->start,
232 trace_hfi1_mmu_mem_invalidate(node->addr, node->len);
233 if (handler->ops->invalidate(handler->ops_arg, node)) {
234 __mmu_int_rb_remove(node, root);
235 /* move from LRU list to delete list */
236 list_move(&node->list, &handler->del_list);
240 spin_unlock_irqrestore(&handler->lock, flags);
243 queue_work(handler->wq, &handler->del_work);
249 * Call the remove function for the given handler and the list. This
250 * is expected to be called with a delete list extracted from handler.
251 * The caller should not be holding the handler lock.
253 static void do_remove(struct mmu_rb_handler *handler,
254 struct list_head *del_list)
256 struct mmu_rb_node *node;
258 while (!list_empty(del_list)) {
259 node = list_first_entry(del_list, struct mmu_rb_node, list);
260 list_del(&node->list);
261 handler->ops->remove(handler->ops_arg, node);
266 * Work queue function to remove all nodes that have been queued up to
267 * be removed. The key feature is that mm->mmap_lock is not being held
268 * and the remove callback can sleep while taking it, if needed.
270 static void handle_remove(struct work_struct *work)
272 struct mmu_rb_handler *handler = container_of(work,
273 struct mmu_rb_handler,
275 struct list_head del_list;
278 /* remove anything that is queued to get removed */
279 spin_lock_irqsave(&handler->lock, flags);
280 list_replace_init(&handler->del_list, &del_list);
281 spin_unlock_irqrestore(&handler->lock, flags);
283 do_remove(handler, &del_list);