From b82d33e84c5780e3dcc23a778dec8219a7d7c5f2 Mon Sep 17 00:00:00 2001 From: christos Date: Thu, 16 Oct 1997 23:29:26 +0000 Subject: [PATCH] PR/4269: Chris Demetriou: msync is missing the MS_* flags. Also change caddr_t syscall arguments to void * --- sys/vm/vm_map.c | 9 +++++-- sys/vm/vm_mmap.c | 65 +++++++++++++++++++++++++++++------------------ sys/vm/vm_param.h | 3 ++- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 85719c8c00d9..00d96b34a9ee 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -1,4 +1,4 @@ -/* $NetBSD: vm_map.c,v 1.28 1997/07/06 12:38:27 fvdl Exp $ */ +/* $NetBSD: vm_map.c,v 1.29 1997/10/16 23:29:26 christos Exp $ */ /* * Copyright (c) 1991, 1993 @@ -1403,7 +1403,8 @@ vm_map_clean(map, start, end, syncio, invalidate) } /* - * Make a first pass to check for holes. + * Make a first pass to check for holes and (if invalidating) + * wired pages. */ for (current = entry; current->start < end; current = current->next) { if (current->is_sub_map) { @@ -1416,6 +1417,10 @@ vm_map_clean(map, start, end, syncio, invalidate) vm_map_unlock_read(map); return(KERN_INVALID_ADDRESS); } + if (current->wired_count) { + vm_map_unlock_read(map); + return(KERN_PAGES_LOCKED); + } } /* diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 5096d79c5d3a..2a5af5d1f7f3 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -1,4 +1,4 @@ -/* $NetBSD: vm_mmap.c,v 1.51 1997/09/08 18:19:45 chuck Exp $ */ +/* $NetBSD: vm_mmap.c,v 1.52 1997/10/16 23:29:29 christos Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -122,7 +122,7 @@ sys_mmap(p, v, retval) register_t *retval; { register struct sys_mmap_args /* { - syscallarg(caddr_t) addr; + syscallarg(void *) addr; syscallarg(size_t) len; syscallarg(int) prot; syscallarg(int) flags; @@ -279,23 +279,33 @@ sys_msync(p, v, retval) register_t *retval; { struct sys_msync_args /* { - syscallarg(caddr_t) addr; + syscallarg(void *) addr; syscallarg(size_t) len; + syscallarg(int) flags; } */ *uap = v; vm_offset_t addr; vm_size_t size, pageoff; vm_map_t map; - int rv; + int rv, flags; boolean_t syncio, invalidate; addr = (vm_offset_t)SCARG(uap, addr); size = (vm_size_t)SCARG(uap, len); + flags = SCARG(uap, flags); #ifdef DEBUG if (mmapdebug & (MDB_FOLLOW|MDB_SYNC)) - printf("msync(%d): addr %lx len %lx\n", - p->p_pid, addr, size); + printf("msync(%d): addr %lx len %lx flags %x\n", + p->p_pid, addr, size, flags); #endif + /* sanity check flags */ + if ((flags & ~(MS_ASYNC | MS_SYNC | MS_INVALIDATE)) != 0 || + (flags & (MS_ASYNC | MS_SYNC | MS_INVALIDATE)) == 0 || + (flags & (MS_ASYNC | MS_SYNC)) == (MS_ASYNC | MS_SYNC)) + return (EINVAL); + if ((flags & (MS_ASYNC | MS_SYNC)) == 0) + flags |= MS_SYNC; + /* * Align the address to a page boundary, * and adjust the size accordingly. @@ -306,8 +316,8 @@ sys_msync(p, v, retval) size = (vm_size_t) round_page(size); /* Disallow wrap-around. */ - if (addr + (int)size < addr) - return (EINVAL); + if (addr + size < addr) + return (ENOMEM); map = &p->p_vmspace->vm_map; /* @@ -325,7 +335,7 @@ sys_msync(p, v, retval) rv = vm_map_lookup_entry(map, addr, &entry); vm_map_unlock_read(map); if (rv == FALSE) - return (EINVAL); + return (ENOMEM); addr = entry->start; size = entry->end - entry->start; } @@ -334,17 +344,20 @@ sys_msync(p, v, retval) printf("msync: cleaning/flushing address range [%lx-%lx)\n", addr, addr+size); #endif + +#if 0 /* - * Could pass this in as a third flag argument to implement - * Sun's MS_ASYNC. + * XXX Asynchronous msync() causes: + * . the process to hang on wchan "vospgw", and + * . a "vm_object_page_clean: pager_put error" message to + * be printed by the kernel. */ + syncio = (flags & MS_SYNC) ? TRUE : FALSE; +#else syncio = TRUE; - /* - * XXX bummer, gotta flush all cached pages to ensure - * consistency with the file system cache. Otherwise, we could - * pass this in to implement Sun's MS_INVALIDATE. - */ - invalidate = TRUE; +#endif + invalidate = (flags & MS_INVALIDATE) ? TRUE : FALSE; + /* * Clean the pages and interpret the return value. */ @@ -353,9 +366,11 @@ sys_msync(p, v, retval) case KERN_SUCCESS: break; case KERN_INVALID_ADDRESS: - return (EINVAL); /* Sun returns ENOMEM? */ + return (ENOMEM); case KERN_FAILURE: return (EIO); + case KERN_PAGES_LOCKED: + return (EBUSY); default: return (EINVAL); } @@ -369,7 +384,7 @@ sys_munmap(p, v, retval) register_t *retval; { register struct sys_munmap_args /* { - syscallarg(caddr_t) addr; + syscallarg(void *) addr; syscallarg(size_t) len; } */ *uap = v; vm_offset_t addr; @@ -442,7 +457,7 @@ sys_mprotect(p, v, retval) register_t *retval; { struct sys_mprotect_args /* { - syscallarg(caddr_t) addr; + syscallarg(void *) addr; syscallarg(int) len; syscallarg(int) prot; } */ *uap = v; @@ -487,7 +502,7 @@ sys_minherit(p, v, retval) register_t *retval; { struct sys_minherit_args /* { - syscallarg(caddr_t) addr; + syscallarg(void *) addr; syscallarg(int) len; syscallarg(int) inherit; } */ *uap = v; @@ -533,7 +548,7 @@ sys_madvise(p, v, retval) { #if 0 struct sys_madvise_args /* { - syscallarg(caddr_t) addr; + syscallarg(void *) addr; syscallarg(size_t) len; syscallarg(int) behav; } */ *uap = v; @@ -552,7 +567,7 @@ sys_mincore(p, v, retval) { #if 0 struct sys_mincore_args /* { - syscallarg(caddr_t) addr; + syscallarg(void *) addr; syscallarg(size_t) len; syscallarg(char *) vec; } */ *uap = v; @@ -569,7 +584,7 @@ sys_mlock(p, v, retval) register_t *retval; { struct sys_mlock_args /* { - syscallarg(caddr_t) addr; + syscallarg(void *) addr; syscallarg(size_t) len; } */ *uap = v; vm_offset_t addr; @@ -619,7 +634,7 @@ sys_munlock(p, v, retval) register_t *retval; { struct sys_munlock_args /* { - syscallarg(caddr_t) addr; + syscallarg(void *) addr; syscallarg(size_t) len; } */ *uap = v; vm_offset_t addr; diff --git a/sys/vm/vm_param.h b/sys/vm/vm_param.h index 4f63abc747a0..4d8d293bb5c0 100644 --- a/sys/vm/vm_param.h +++ b/sys/vm/vm_param.h @@ -1,4 +1,4 @@ -/* $NetBSD: vm_param.h,v 1.12 1995/03/26 20:39:16 jtc Exp $ */ +/* $NetBSD: vm_param.h,v 1.13 1997/10/16 23:29:31 christos Exp $ */ /* * Copyright (c) 1991, 1993 @@ -124,6 +124,7 @@ extern int page_shift; #define KERN_RESOURCE_SHORTAGE 6 #define KERN_NOT_RECEIVER 7 #define KERN_NO_ACCESS 8 +#define KERN_PAGES_LOCKED 9 #ifndef ASSEMBLER /*