From 5c11ff0950b9e96b40d18af58529c5ac88de7ee0 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Thu, 14 Sep 2017 12:04:20 +0900 Subject: [PATCH] process/vm: fix lookup_process_memory_range with small start address Cherry-picked from 6370520e Conflicts: kernel/process.c --- kernel/process.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kernel/process.c b/kernel/process.c index 7c9afaf4..c26dc638 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -1293,7 +1293,7 @@ struct vm_range *lookup_process_memory_range( int i; struct vm_range *range = NULL, *match = NULL; struct rb_root *root = &vm->vm_range_tree; - struct rb_node *node = root->rb_node; + struct rb_node *node = root->rb_node, *prev = NULL; dkprintf("lookup_process_memory_range(%p,%lx,%lx)\n", vm, start, end); @@ -1312,6 +1312,7 @@ struct vm_range *lookup_process_memory_range( } while (node) { + prev = node; range = rb_entry(node, struct vm_range, vm_rb_node); if (end <= range->start) { node = node->rb_left; @@ -1328,6 +1329,10 @@ struct vm_range *lookup_process_memory_range( } } + /* We optimistically try to go left, go back if we went too far */ + if (!node && range && start < range->end) + node = prev; + if (match && end > match->start) { vm->range_cache_ind = (vm->range_cache_ind - 1 + VM_RANGE_CACHE_SIZE) % VM_RANGE_CACHE_SIZE;