MM: straight mapping

Change-Id: I70871f8c382fb00aa719ed501cc5de436d916d7f
This commit is contained in:
Balazs Gerofi
2020-05-27 13:54:04 +09:00
committed by Masamichi Takagi
parent 100bbe6231
commit 201f5ce500
13 changed files with 385 additions and 21 deletions

View File

@@ -945,6 +945,11 @@ int split_process_memory_range(struct process_vm *vm, struct vm_range *range,
}
newrange->start = addr;
newrange->straight_start = 0;
if (range->straight_start) {
newrange->straight_start =
range->straight_start + (addr - range->start);
}
newrange->end = range->end;
newrange->flag = range->flag;
newrange->pgshift = range->pgshift;
@@ -1045,6 +1050,11 @@ static int free_process_memory_range(struct process_vm *vm,
start = range->start;
end = range->end;
/* No regular page table manipulation for straight mappings */
if (range->straight_start || ((void *)start == vm->proc->straight_va))
goto straight_out;
if (!(range->flag & (VR_REMOTE | VR_IO_NOCACHE | VR_RESERVED))) {
neighbor = previous_process_memory_range(vm, range);
pgsize = -1;
@@ -1126,11 +1136,37 @@ static int free_process_memory_range(struct process_vm *vm,
memobj_unref(range->memobj);
}
straight_out:
rb_erase(&range->vm_rb_node, &vm->vm_range_tree);
for (i = 0; i < VM_RANGE_CACHE_SIZE; ++i) {
if (vm->range_cache[i] == range)
vm->range_cache[i] = NULL;
}
/* For straight ranges just free physical memory */
if (range->straight_start) {
ihk_mc_free_pages(phys_to_virt(vm->proc->straight_pa +
(range->straight_start - (unsigned long)vm->proc->straight_va)),
(range->end - range->start) >> PAGE_SHIFT);
dkprintf("%s: straight range 0x%lx @ straight 0x%lx physical memory freed\n",
__FUNCTION__, range->start, range->straight_start);
}
/* For the main straight mapping, free page tables */
else if (range->start == (unsigned long)vm->proc->straight_va &&
range->end == ((unsigned long)vm->proc->straight_va +
vm->proc->straight_len)) {
ihk_mc_spinlock_lock_noirq(&vm->page_table_lock);
error = ihk_mc_pt_clear_range(vm->address_space->page_table, vm,
(void *)start, (void *)end);
ihk_mc_spinlock_unlock_noirq(&vm->page_table_lock);
dkprintf("%s: straight mapping 0x%lx unmapped\n",
__FUNCTION__, vm->proc->straight_va);
vm->proc->straight_va = 0;
vm->proc->straight_len = 0;
}
kfree(range);
dkprintf("free_process_memory_range(%p,%lx-%lx): 0\n",
@@ -1148,6 +1184,50 @@ int remove_process_memory_range(struct process_vm *vm,
dkprintf("remove_process_memory_range(%p,%lx,%lx)\n",
vm, start, end);
/*
* Convert to real virtual address for straight ranges,
* but not for the main straight mapping
*/
if (vm->proc->straight_va &&
start >= (unsigned long)vm->proc->straight_va &&
end <= ((unsigned long)vm->proc->straight_va +
vm->proc->straight_len) &&
!(start == (unsigned long)vm->proc->straight_va &&
end == ((unsigned long)vm->proc->straight_va +
vm->proc->straight_len))) {
struct vm_range *range_iter;
struct vm_range *range = NULL;
unsigned long len = end - start;
range_iter = lookup_process_memory_range(vm, 0, -1);
while (range_iter) {
if (range_iter->straight_start &&
start >= range_iter->straight_start &&
start < (range_iter->straight_start +
(range_iter->end - range_iter->start))) {
range = range_iter;
break;
}
range_iter = next_process_memory_range(vm, range_iter);
}
if (!range) {
kprintf("%s: WARNING: no straight mapping range found for 0x%lx\n",
__FUNCTION__, start);
return 0;
}
dkprintf("%s: straight range converted from 0x%lx:%lu -> 0x%lx:%lu\n",
__FUNCTION__,
start, len,
range->start + (start - range->straight_start), len);
start = range->start + (start - range->straight_start);
end = start + len;
}
next = lookup_process_memory_range(vm, start, end);
while ((range = next) && range->start < end) {
next = next_process_memory_range(vm, range);
@@ -1345,6 +1425,7 @@ int add_process_memory_range(struct process_vm *vm,
range->objoff = offset;
range->pgshift = pgshift;
range->private_data = NULL;
range->straight_start = 0;
rc = 0;
if (phys == NOPHYS) {