From 9635a628a986cf471e75e9ad804364683611bb62 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Mon, 19 Dec 2016 12:55:12 +0900 Subject: [PATCH] fileobj/shmobj/devobj: add file size to memobj --- executer/kernel/mcctrl/syscall.c | 2 ++ kernel/devobj.c | 1 + kernel/fileobj.c | 1 + kernel/include/memobj.h | 1 + kernel/include/pager.h | 1 + kernel/process.c | 7 ++++--- kernel/shmobj.c | 1 + kernel/syscall.c | 5 +++-- kernel/zeroobj.c | 1 + 9 files changed, 15 insertions(+), 5 deletions(-) diff --git a/executer/kernel/mcctrl/syscall.c b/executer/kernel/mcctrl/syscall.c index e7924c3c..9ededb7a 100644 --- a/executer/kernel/mcctrl/syscall.c +++ b/executer/kernel/mcctrl/syscall.c @@ -747,6 +747,7 @@ struct pager_create_result { uintptr_t handle; int maxprot; uint32_t flags; + size_t size; }; enum { @@ -895,6 +896,7 @@ found: resp->handle = (uintptr_t)pager; resp->maxprot = maxprot; resp->flags = mf_flags; + resp->size = st.size; ihk_device_unmap_virtual(dev, resp, sizeof(*resp)); ihk_device_unmap_memory(dev, phys, sizeof(*resp)); diff --git a/kernel/devobj.c b/kernel/devobj.c index 737d42f7..b7cb33e8 100644 --- a/kernel/devobj.c +++ b/kernel/devobj.c @@ -127,6 +127,7 @@ int devobj_create(int fd, size_t len, off_t off, struct memobj **objp, int *maxp obj->memobj.ops = &devobj_ops; obj->memobj.flags = MF_HAS_PAGER; + obj->memobj.size = len; obj->handle = result.handle; obj->ref = 1; obj->pfn_pgoff = off / PAGE_SIZE; diff --git a/kernel/fileobj.c b/kernel/fileobj.c index 79f38fb3..80808dd0 100644 --- a/kernel/fileobj.c +++ b/kernel/fileobj.c @@ -225,6 +225,7 @@ int fileobj_create(int fd, struct memobj **objp, int *maxprotp) if (!obj) { obj_list_insert(newobj); obj = newobj; + to_memobj(obj)->size = result.size; to_memobj(obj)->flags |= result.flags; to_memobj(obj)->status = MEMOBJ_READY; if (to_memobj(obj)->flags & MF_PREFETCH) { diff --git a/kernel/include/memobj.h b/kernel/include/memobj.h index 965fd9b4..4cee1fc1 100644 --- a/kernel/include/memobj.h +++ b/kernel/include/memobj.h @@ -44,6 +44,7 @@ struct memobj { struct memobj_ops *ops; uint32_t flags; uint32_t status; + size_t size; ihk_spinlock_t lock; }; diff --git a/kernel/include/pager.h b/kernel/include/pager.h index 95f6d38a..0e5efde2 100644 --- a/kernel/include/pager.h +++ b/kernel/include/pager.h @@ -31,6 +31,7 @@ struct pager_create_result { uintptr_t handle; int maxprot; uint32_t flags; + size_t size; }; /* diff --git a/kernel/process.c b/kernel/process.c index 413aab4f..c7973fc6 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -2160,9 +2160,10 @@ int populate_process_memory(struct process_vm *vm, void *start, size_t len) for (addr = (uintptr_t)start; addr < end; addr += PAGE_SIZE) { error = page_fault_process_vm(vm, (void *)addr, reason); if (error) { - ekprintf("populate_process_range:page_fault_process_vm" - "(%p,%lx,%lx) failed %d\n", - vm, addr, reason, error); + ekprintf("%s: WARNING: page_fault_process_vm(): vm: %p, " + "addr: %lx, reason: %lx, off: %lu, len: %lu returns %d\n", + __FUNCTION__, vm, addr, reason, + ((void *)addr - start), len, error); goto out; } } diff --git a/kernel/shmobj.c b/kernel/shmobj.c index fc9b2cef..f453f436 100644 --- a/kernel/shmobj.c +++ b/kernel/shmobj.c @@ -179,6 +179,7 @@ int shmobj_create(struct shmid_ds *ds, struct memobj **objp) memset(obj, 0, sizeof(*obj)); obj->memobj.ops = &shmobj_ops; + obj->memobj.size = ds->shm_segsz; obj->ds = *ds; obj->ds.shm_perm.seq = the_seq++; obj->ds.shm_nattch = 1; diff --git a/kernel/syscall.c b/kernel/syscall.c index 64336386..50c46bf9 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -1384,8 +1384,9 @@ out: if (!error && populated_mapping && !((vrflags & VR_PROT_MASK) == VR_PROT_NONE)) { error = populate_process_memory(thread->vm, (void *)addr, len); if (error) { - ekprintf("%s: error :populate_process_memory" - "vm: %p, addr: %p, len: %d (flags: %s%s) failed %d\n", __FUNCTION__, + ekprintf("%s: WARNING: populate_process_memory(): " + "vm: %p, addr: %p, len: %d (flags: %s%s) failed %d\n", + __FUNCTION__, thread->vm, (void *)addr, len, (flags & MAP_POPULATE) ? "MAP_POPULATE " : "", (flags & MAP_LOCKED) ? "MAP_LOCKED ": "", diff --git a/kernel/zeroobj.c b/kernel/zeroobj.c index 04f1b8e6..d914462c 100644 --- a/kernel/zeroobj.c +++ b/kernel/zeroobj.c @@ -102,6 +102,7 @@ static int alloc_zeroobj(void) memset(obj, 0, sizeof(*obj)); obj->memobj.ops = &zeroobj_ops; + obj->memobj.size = 0; page_list_init(obj); ihk_mc_spinlock_init(&obj->memobj.lock);