support madvise(MADV_REMOVE) partially

This MADV_REMOVE works with a mapping which is
- created with shmat() and
- not sharing memobj with other mappings.
This commit is contained in:
NAKAMURA Gou
2015-10-28 18:40:18 +09:00
parent c25f8c7a39
commit 0b07dd1b79
3 changed files with 71 additions and 5 deletions

View File

@@ -2691,6 +2691,8 @@ SYSCALL_DECLARE(madvise)
uintptr_t addr;
struct vm_range *range;
int error;
uintptr_t s;
uintptr_t e;
dkprintf("[%d]sys_madvise(%lx,%lx,%x)\n",
ihk_mc_get_processor_id(), start, len0, advice);
@@ -2732,10 +2734,7 @@ SYSCALL_DECLARE(madvise)
case MADV_DONTNEED:
case MADV_DONTFORK:
case MADV_DOFORK:
break;
case MADV_REMOVE:
error = -EACCES;
break;
case MADV_HWPOISON:
@@ -2777,7 +2776,17 @@ SYSCALL_DECLARE(madvise)
goto out;
}
if (!range->memobj || !memobj_has_pager(range->memobj)) {
if (advice == MADV_REMOVE) {
if (!range->memobj || !memobj_is_removable(range->memobj)) {
dkprintf("sys_madvise(%lx,%lx,%x):"
"not removable [%lx-%lx)\n",
start, len0, advice,
range->start, range->end);
error = -EACCES;
goto out;
}
}
else if (!range->memobj || !memobj_has_pager(range->memobj)) {
dkprintf("[%d]sys_madvise(%lx,%lx,%x):has not pager"
"[%lx-%lx) %lx\n",
ihk_mc_get_processor_id(), start,
@@ -2797,6 +2806,28 @@ SYSCALL_DECLARE(madvise)
error = -EINVAL;
goto out;
}
s = start;
if (s < range->start) {
s = range->start;
}
e = end;
if (range->end < e) {
e = range->end;
}
if (advice == MADV_REMOVE) {
error = invalidate_process_memory_range(
thread->vm, range, s, e);
if (error) {
kprintf("sys_madvise(%lx,%lx,%x):[%lx-%lx):"
"invalidate failed. %d\n",
start, len0, advice,
range->start, range->end,
error);
goto out;
}
}
}
error = 0;