VM: introduction of range lookup cache
This commit is contained in:
@ -643,6 +643,8 @@ struct thread {
|
|||||||
struct waitq scd_wq;
|
struct waitq scd_wq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define VM_RANGE_CACHE_SIZE 4
|
||||||
|
|
||||||
struct process_vm {
|
struct process_vm {
|
||||||
struct address_space *address_space;
|
struct address_space *address_space;
|
||||||
struct list_head vm_range_list;
|
struct list_head vm_range_list;
|
||||||
@ -669,6 +671,8 @@ struct process_vm {
|
|||||||
int numa_mem_policy;
|
int numa_mem_policy;
|
||||||
/* Protected by memory_range_lock */
|
/* Protected by memory_range_lock */
|
||||||
struct list_head vm_range_numa_policy_list;
|
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)
|
static inline int has_cap_ipc_lock(struct thread *th)
|
||||||
|
|||||||
@ -226,6 +226,11 @@ init_process_vm(struct process *owner, struct address_space *asp, struct process
|
|||||||
}
|
}
|
||||||
vm->numa_mem_policy = MPOL_DEFAULT;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -734,6 +739,7 @@ int join_process_memory_range(struct process_vm *vm,
|
|||||||
struct vm_range *surviving, struct vm_range *merging)
|
struct vm_range *surviving, struct vm_range *merging)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
int i;
|
||||||
|
|
||||||
dkprintf("join_process_memory_range(%p,%lx-%lx,%lx-%lx)\n",
|
dkprintf("join_process_memory_range(%p,%lx-%lx,%lx-%lx)\n",
|
||||||
vm, surviving->start, surviving->end,
|
vm, surviving->start, surviving->end,
|
||||||
@ -762,6 +768,10 @@ int join_process_memory_range(struct process_vm *vm,
|
|||||||
memobj_release(merging->memobj);
|
memobj_release(merging->memobj);
|
||||||
}
|
}
|
||||||
list_del(&merging->list);
|
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);
|
kfree(merging);
|
||||||
|
|
||||||
error = 0;
|
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 start0 = range->start;
|
||||||
const intptr_t end0 = range->end;
|
const intptr_t end0 = range->end;
|
||||||
int error;
|
int error, i;
|
||||||
intptr_t start;
|
intptr_t start;
|
||||||
intptr_t end;
|
intptr_t end;
|
||||||
struct vm_range *neighbor;
|
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);
|
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);
|
kfree(range);
|
||||||
|
|
||||||
dkprintf("free_process_memory_range(%p,%lx-%lx): 0\n",
|
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 vm_range *lookup_process_memory_range(
|
||||||
struct process_vm *vm, uintptr_t start, uintptr_t end)
|
struct process_vm *vm, uintptr_t start, uintptr_t end)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
struct vm_range *range = NULL;
|
struct vm_range *range = NULL;
|
||||||
|
|
||||||
dkprintf("lookup_process_memory_range(%p,%lx,%lx)\n", vm, start, end);
|
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;
|
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) {
|
list_for_each_entry(range, &vm->vm_range_list, list) {
|
||||||
if (end <= range->start) {
|
if (end <= range->start) {
|
||||||
break;
|
break;
|
||||||
@ -1095,6 +1120,12 @@ struct vm_range *lookup_process_memory_range(
|
|||||||
|
|
||||||
range = NULL;
|
range = NULL;
|
||||||
out:
|
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",
|
dkprintf("lookup_process_memory_range(%p,%lx,%lx): %p %lx-%lx\n",
|
||||||
vm, start, end, range,
|
vm, start, end, range,
|
||||||
range? range->start: 0, range? range->end: 0);
|
range? range->start: 0, range? range->end: 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user