add_process_memory_range: Change order of update page and insert range.

Unintended update page was occurred, when inserting range failed.

Change-Id: I3d117b8613c5fbb64463c759b5fcc81db22bd624
refs: #1512
This commit is contained in:
Ken Sato
2021-01-07 16:19:57 +09:00
committed by Masamichi Takagi
parent 93dafc5f79
commit 6dce9a2bf9
8 changed files with 219 additions and 9 deletions

View File

@ -1498,6 +1498,14 @@ int add_process_memory_range(struct process_vm *vm,
INIT_LIST_HEAD(&range->tofu_stag_list);
#endif
rc = vm_range_insert(vm, range);
if (rc) {
kprintf("%s: ERROR: could not insert range: %d\n",
__func__, rc);
kfree(range);
return rc;
}
rc = 0;
if (phys == NOPHYS) {
/* Nothing to map */
@ -1523,17 +1531,12 @@ int add_process_memory_range(struct process_vm *vm,
if (rc != 0) {
kprintf("%s: ERROR: preparing page tables\n", __FUNCTION__);
remove_process_memory_range(vm,
range->start, range->end, NULL);
kfree(range);
return rc;
}
rc = vm_range_insert(vm, range);
if (rc) {
kprintf("%s: ERROR: could not insert range: %d\n",
__FUNCTION__, rc);
return rc;
}
/* Clear content! */
if (phys != NOPHYS && !(flag & (VR_REMOTE | VR_DEMAND_PAGING))
&& ((flag & VR_PROT_MASK) != VR_PROT_NONE)) {
@ -2739,6 +2742,7 @@ unsigned long extend_process_region(struct process_vm *vm,
int rc;
size_t len;
int npages;
struct vm_range *range;
size_t align_size = vm->proc->heap_extension > PAGE_SIZE ?
LARGE_PAGE_SIZE : PAGE_SIZE;
@ -2755,6 +2759,15 @@ unsigned long extend_process_region(struct process_vm *vm,
(align_size - 1)) & align_mask;
}
/* Check if the range to be extended already exists */
range = lookup_process_memory_range(vm,
end_allocated, new_end_allocated);
if (range) {
dkprintf("%s: warning: vm_range for extension already exists\n",
__func__);
return end_allocated;
}
len = new_end_allocated - end_allocated;
npages = len >> PAGE_SHIFT;
@ -2782,7 +2795,7 @@ unsigned long extend_process_region(struct process_vm *vm,
if ((rc = add_process_memory_range(vm, end_allocated, new_end_allocated,
(p == 0 ? 0 : virt_to_phys(p)), flag, NULL, 0,
align_shift, NULL)) != 0) {
ihk_mc_free_pages_user(p, (new_end_allocated - end_allocated) >> PAGE_SHIFT);
ihk_mc_free_pages_user(p, npages);
return end_allocated;
}
// memory_stat_rss_add() is called in add_process_memory_range()