From 64607152ee217c814e601c6a961950e82aa98872 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Wed, 23 Nov 2016 08:48:44 +0900 Subject: [PATCH] VM: introduction of range lookup cache --- kernel/include/process.h | 4 ++++ kernel/process.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/kernel/include/process.h b/kernel/include/process.h index 7e96f978..503e27ba 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -643,6 +643,8 @@ struct thread { struct waitq scd_wq; }; +#define VM_RANGE_CACHE_SIZE 4 + struct process_vm { struct address_space *address_space; struct list_head vm_range_list; @@ -669,6 +671,8 @@ struct process_vm { int numa_mem_policy; /* Protected by memory_range_lock */ struct list_head vm_range_numa_policy_list; + struct vm_range *range_cache[VM_RANGE_CACHE_SIZE]; + int range_cache_ind; }; static inline int has_cap_ipc_lock(struct thread *th) diff --git a/kernel/process.c b/kernel/process.c index 90821717..e7f4f751 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -226,6 +226,11 @@ init_process_vm(struct process *owner, struct address_space *asp, struct process } vm->numa_mem_policy = MPOL_DEFAULT; + for (i = 0; i < VM_RANGE_CACHE_SIZE; ++i) { + vm->range_cache[i] = NULL; + } + vm->range_cache_ind = 0; + return 0; } @@ -734,6 +739,7 @@ int join_process_memory_range(struct process_vm *vm, struct vm_range *surviving, struct vm_range *merging) { int error; + int i; dkprintf("join_process_memory_range(%p,%lx-%lx,%lx-%lx)\n", vm, surviving->start, surviving->end, @@ -762,6 +768,10 @@ int join_process_memory_range(struct process_vm *vm, memobj_release(merging->memobj); } list_del(&merging->list); + for (i = 0; i < VM_RANGE_CACHE_SIZE; ++i) { + if (vm->range_cache[i] == merging) + vm->range_cache[i] = surviving; + } kfree(merging); error = 0; @@ -775,7 +785,7 @@ int free_process_memory_range(struct process_vm *vm, struct vm_range *range) { const intptr_t start0 = range->start; const intptr_t end0 = range->end; - int error; + int error, i; intptr_t start; intptr_t end; struct vm_range *neighbor; @@ -860,6 +870,10 @@ int free_process_memory_range(struct process_vm *vm, struct vm_range *range) } list_del(&range->list); + for (i = 0; i < VM_RANGE_CACHE_SIZE; ++i) { + if (vm->range_cache[i] == range) + vm->range_cache[i] = NULL; + } kfree(range); dkprintf("free_process_memory_range(%p,%lx-%lx): 0\n", @@ -1076,6 +1090,7 @@ int add_process_memory_range(struct process_vm *vm, struct vm_range *lookup_process_memory_range( struct process_vm *vm, uintptr_t start, uintptr_t end) { + int i; struct vm_range *range = NULL; dkprintf("lookup_process_memory_range(%p,%lx,%lx)\n", vm, start, end); @@ -1084,6 +1099,16 @@ struct vm_range *lookup_process_memory_range( goto out; } + for (i = 0; i < VM_RANGE_CACHE_SIZE; ++i) { + int c_i = (i + vm->range_cache_ind) % VM_RANGE_CACHE_SIZE; + if (!vm->range_cache[c_i]) + continue; + + if (vm->range_cache[c_i]->start <= start && + vm->range_cache[c_i]->end >= end) + return vm->range_cache[c_i]; + } + list_for_each_entry(range, &vm->vm_range_list, list) { if (end <= range->start) { break; @@ -1095,6 +1120,12 @@ struct vm_range *lookup_process_memory_range( range = NULL; out: + if (range) { + vm->range_cache_ind = (vm->range_cache_ind - 1 + VM_RANGE_CACHE_SIZE) + % VM_RANGE_CACHE_SIZE; + vm->range_cache[vm->range_cache_ind] = range; + } + dkprintf("lookup_process_memory_range(%p,%lx,%lx): %p %lx-%lx\n", vm, start, end, range, range? range->start: 0, range? range->end: 0);