MM: facility for deferred munmap()
Conflicts: kernel/process.c
This commit is contained in:
@@ -712,9 +712,35 @@ struct thread {
|
|||||||
|
|
||||||
#define VM_RANGE_CACHE_SIZE 4
|
#define VM_RANGE_CACHE_SIZE 4
|
||||||
|
|
||||||
|
struct deferred_unmap_range {
|
||||||
|
struct process_vm *vm;
|
||||||
|
void *addr;
|
||||||
|
size_t len;
|
||||||
|
struct list_head list;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* List operations as well as the refcnt are protected
|
||||||
|
* by vm->vm_deferred_unmap_lock.
|
||||||
|
*/
|
||||||
|
int refcnt;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void init_deferred_unmap_range(
|
||||||
|
struct deferred_unmap_range *range,
|
||||||
|
struct process_vm *vm,
|
||||||
|
void *addr, size_t len)
|
||||||
|
{
|
||||||
|
range->vm = vm;
|
||||||
|
range->addr = addr;
|
||||||
|
range->len = len;
|
||||||
|
INIT_LIST_HEAD(&range->list);
|
||||||
|
range->refcnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct process_vm {
|
struct process_vm {
|
||||||
struct address_space *address_space;
|
struct address_space *address_space;
|
||||||
struct rb_root vm_range_tree;
|
struct rb_root vm_range_tree;
|
||||||
|
struct list_head vm_deferred_unmap_range_list;
|
||||||
struct vm_regions region;
|
struct vm_regions region;
|
||||||
struct process *proc; /* process that reside on the same page */
|
struct process *proc; /* process that reside on the same page */
|
||||||
void *opt;
|
void *opt;
|
||||||
@@ -724,6 +750,7 @@ struct process_vm {
|
|||||||
|
|
||||||
ihk_spinlock_t page_table_lock;
|
ihk_spinlock_t page_table_lock;
|
||||||
ihk_spinlock_t memory_range_lock;
|
ihk_spinlock_t memory_range_lock;
|
||||||
|
ihk_spinlock_t vm_deferred_unmap_lock;
|
||||||
// to protect the followings:
|
// to protect the followings:
|
||||||
// 1. addition of process "memory range" (extend_process_region, add_process_memory_range)
|
// 1. addition of process "memory range" (extend_process_region, add_process_memory_range)
|
||||||
// 2. addition of process page table (allocate_pages, update_process_page_table)
|
// 2. addition of process page table (allocate_pages, update_process_page_table)
|
||||||
|
|||||||
@@ -261,10 +261,13 @@ init_process_vm(struct process *owner, struct address_space *asp, struct process
|
|||||||
int i;
|
int i;
|
||||||
ihk_mc_spinlock_init(&vm->memory_range_lock);
|
ihk_mc_spinlock_init(&vm->memory_range_lock);
|
||||||
ihk_mc_spinlock_init(&vm->page_table_lock);
|
ihk_mc_spinlock_init(&vm->page_table_lock);
|
||||||
|
ihk_mc_spinlock_init(&vm->vm_deferred_unmap_lock);
|
||||||
|
|
||||||
ihk_atomic_set(&vm->refcount, 1);
|
ihk_atomic_set(&vm->refcount, 1);
|
||||||
vm->vm_range_tree = RB_ROOT;
|
vm->vm_range_tree = RB_ROOT;
|
||||||
vm->vm_range_numa_policy_tree = RB_ROOT;
|
vm->vm_range_numa_policy_tree = RB_ROOT;
|
||||||
|
INIT_LIST_HEAD(&vm->vm_deferred_unmap_range_list);
|
||||||
|
INIT_LIST_HEAD(&vm->vm_range_numa_policy_list);
|
||||||
vm->address_space = asp;
|
vm->address_space = asp;
|
||||||
vm->proc = owner;
|
vm->proc = owner;
|
||||||
vm->exiting = 0;
|
vm->exiting = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user