Refactor "do write back only MAP_SHARED pages"

* free_process_memory_range() always passes memobj to
  ihk_mc_pt_free_range()
* clear_range_*() don't flush page in fileobj with MF_PRIVATE flag

Fujitsu: POSTK_DEBUG_TEMP_FIX_87
Change-Id: I8d46d029b3fc51ca6f0e59d748a2fe93e324a374
This commit is contained in:
Masamichi Takagi
2018-10-12 13:37:50 +09:00
committed by Dominique Martinet
parent fb24dcea2e
commit 9cfc373538
7 changed files with 28 additions and 15 deletions

View File

@@ -28,6 +28,7 @@
#include <syscall.h>
#include <rusage_private.h>
#include <debug.h>
#include <mman.h>
//#define DEBUG_PRINT_FILEOBJ
@@ -186,7 +187,8 @@ static struct fileobj *obj_list_lookup(uintptr_t handle)
/***********************************************************************
* fileobj
*/
int fileobj_create(int fd, struct memobj **objp, int *maxprotp, uintptr_t virt_addr)
int fileobj_create(int fd, struct memobj **objp, int *maxprotp, int flags,
uintptr_t virt_addr)
{
ihk_mc_user_context_t ctx;
struct pager_create_result result __attribute__((aligned(64)));
@@ -234,7 +236,8 @@ int fileobj_create(int fd, struct memobj **objp, int *maxprotp, uintptr_t virt_a
}
memset(newobj, 0, sizeof(*newobj));
newobj->memobj.ops = &fileobj_ops;
newobj->memobj.flags = MF_HAS_PAGER | MF_REG_FILE;
newobj->memobj.flags = MF_HAS_PAGER | MF_REG_FILE |
((flags & MAP_PRIVATE) ? MF_PRIVATE : 0);
newobj->handle = result.handle;
fileobj_page_hash_init(newobj);

View File

@@ -35,6 +35,7 @@ enum {
MF_ZEROOBJ = 0x20000, /* To identify pages of anonymous, on-demand paging ranges for rusage accounting */
MF_SHM = 0x40000,
MF_HUGETLBFS = 0x100000,
MF_PRIVATE = 0x200000, /* To prevent flush in clear_range_* */
};
#define MEMOBJ_READY 0
@@ -139,7 +140,8 @@ static inline int memobj_is_removable(struct memobj *obj)
return !!(obj->flags & MF_IS_REMOVABLE);
}
int fileobj_create(int fd, struct memobj **objp, int *maxprotp, uintptr_t virt_addr);
int fileobj_create(int fd, struct memobj **objp, int *maxprotp, int flags,
uintptr_t virt_addr);
struct shmid_ds;
int shmobj_create(struct shmid_ds *ds, struct memobj **objp);
int zeroobj_create(struct memobj **objp);

View File

@@ -1005,9 +1005,7 @@ int free_process_memory_range(struct process_vm *vm, struct vm_range *range)
vm, (void *)start, (void *)end);
} else {
error = ihk_mc_pt_free_range(vm->address_space->page_table,
vm, (void *)start, (void *)end,
(range->flag & VR_PRIVATE) ? NULL :
range->memobj);
vm, (void *)start, (void *)end, range->memobj);
}
if (range->memobj) {
memobj_unref(range->memobj);

View File

@@ -1746,7 +1746,8 @@ do_mmap(const uintptr_t addr0, const size_t len0, const int prot,
maxprot = PROT_READ | PROT_WRITE | PROT_EXEC;
if (!(flags & MAP_ANONYMOUS)) {
off = off0;
error = fileobj_create(fd, &memobj, &maxprot, addr0);
error = fileobj_create(fd, &memobj, &maxprot,
flags, addr0);
#ifdef ATTACHED_MIC
/*
* XXX: refuse device mapping in attached-mic now: