Module Name: src Committed By: pooka Date: Sun Apr 28 10:43:46 UTC 2013
Modified Files: src/lib/librumpuser: rumpuser.c src/sys/rump/include/rump: rumpuser.h src/sys/rump/net/lib/libshmif: Makefile if_shmem.c Added Files: src/sys/rump/net/lib/libshmif: rumpcomp_user.c rumpcomp_user.h Log Message: make the file monitoring hypercalls private to shmif To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/lib/librumpuser/rumpuser.c cvs rdiff -u -r1.86 -r1.87 src/sys/rump/include/rump/rumpuser.h cvs rdiff -u -r1.3 -r1.4 src/sys/rump/net/lib/libshmif/Makefile cvs rdiff -u -r1.47 -r1.48 src/sys/rump/net/lib/libshmif/if_shmem.c cvs rdiff -u -r0 -r1.1 src/sys/rump/net/lib/libshmif/rumpcomp_user.c \ src/sys/rump/net/lib/libshmif/rumpcomp_user.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/librumpuser/rumpuser.c diff -u src/lib/librumpuser/rumpuser.c:1.34 src/lib/librumpuser/rumpuser.c:1.35 --- src/lib/librumpuser/rumpuser.c:1.34 Sun Apr 28 09:58:11 2013 +++ src/lib/librumpuser/rumpuser.c Sun Apr 28 10:43:45 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser.c,v 1.34 2013/04/28 09:58:11 pooka Exp $ */ +/* $NetBSD: rumpuser.c,v 1.35 2013/04/28 10:43:45 pooka Exp $ */ /* * Copyright (c) 2007-2010 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ #include "rumpuser_port.h" #if !defined(lint) -__RCSID("$NetBSD: rumpuser.c,v 1.34 2013/04/28 09:58:11 pooka Exp $"); +__RCSID("$NetBSD: rumpuser.c,v 1.35 2013/04/28 10:43:45 pooka Exp $"); #endif /* !lint */ #include <sys/ioctl.h> @@ -601,139 +601,6 @@ rumpuser_seterrno(int error) } /* - * On NetBSD we use kqueue, on Linux we use inotify. The underlying - * interface requirements aren't quite the same, but we have a very - * good chance of doing the fd->path mapping on Linux thanks to dcache, - * so just keep the existing interfaces for now. - */ -#if defined(__NetBSD__) -int -rumpuser_writewatchfile_setup(int kq, int fd, intptr_t opaque, int *error) -{ - struct kevent kev; - - if (kq == -1) { - kq = kqueue(); - if (kq == -1) { - seterror(errno); - return -1; - } - } - - EV_SET(&kev, fd, EVFILT_VNODE, EV_ADD|EV_ENABLE|EV_CLEAR, - NOTE_WRITE, 0, opaque); - if (kevent(kq, &kev, 1, NULL, 0, NULL) == -1) { - seterror(errno); - return -1; - } - - return kq; -} - -int -rumpuser_writewatchfile_wait(int kq, intptr_t *opaque, int *error) -{ - struct kevent kev; - int rv; - - again: - KLOCK_WRAP(rv = kevent(kq, NULL, 0, &kev, 1, NULL)); - if (rv == -1) { - if (errno == EINTR) - goto again; - seterror(errno); - return -1; - } - - if (opaque) - *opaque = kev.udata; - return rv; -} - -#elif defined(__linux__) -#include <sys/inotify.h> - -int -rumpuser_writewatchfile_setup(int inotify, int fd, intptr_t notused, int *error) -{ - char procbuf[PATH_MAX], linkbuf[PATH_MAX]; - ssize_t nn; - - if (inotify == -1) { - inotify = inotify_init(); - if (inotify == -1) { - seterror(errno); - return -1; - } - } - - /* ok, need to map fd into path for inotify */ - snprintf(procbuf, sizeof(procbuf), "/proc/self/fd/%d", fd); - nn = readlink(procbuf, linkbuf, sizeof(linkbuf)-1); - if (nn >= (ssize_t)sizeof(linkbuf)-1) { - nn = -1; - errno = E2BIG; /* pick something */ - } - if (nn == -1) { - seterror(errno); - close(inotify); - return -1; - } - - linkbuf[nn] = '\0'; - if (inotify_add_watch(inotify, linkbuf, IN_MODIFY) == -1) { - seterror(errno); - close(inotify); - return -1; - } - - return inotify; -} - -int -rumpuser_writewatchfile_wait(int kq, intptr_t *opaque, int *error) -{ - struct inotify_event iev; - ssize_t nn; - - do { - KLOCK_WRAP(nn = read(kq, &iev, sizeof(iev))); - } while (errno == EINTR); - - if (nn == -1) { - seterror(errno); - return -1; - } - return (nn/sizeof(iev)); -} - -#else - -/* a polling default implementation */ -int -rumpuser_writewatchfile_setup(int inotify, int fd, intptr_t notused, int *error) -{ - static int warned = 0; - - if (!warned) { - fprintf(stderr, "WARNING: rumpuser writewatchfile routines are " - "polling-only on this platform\n"); - warned = 1; - } - - return 0; -} - -int -rumpuser_writewatchfile_wait(int kq, intptr_t *opaque, int *error) -{ - - KLOCK_WRAP(usleep(10000)); - return 0; -} -#endif - -/* * This is meant for safe debugging prints from the kernel. */ int Index: src/sys/rump/include/rump/rumpuser.h diff -u src/sys/rump/include/rump/rumpuser.h:1.86 src/sys/rump/include/rump/rumpuser.h:1.87 --- src/sys/rump/include/rump/rumpuser.h:1.86 Sun Apr 28 09:58:11 2013 +++ src/sys/rump/include/rump/rumpuser.h Sun Apr 28 10:43:45 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser.h,v 1.86 2013/04/28 09:58:11 pooka Exp $ */ +/* $NetBSD: rumpuser.h,v 1.87 2013/04/28 10:43:45 pooka Exp $ */ /* * Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved. @@ -113,9 +113,6 @@ int rumpuser_kill(int64_t, int, int *); void rumpuser_exit(int) __dead; void rumpuser_seterrno(int); -int rumpuser_writewatchfile_setup(int, int, intptr_t, int *); -int rumpuser_writewatchfile_wait(int, intptr_t *, int *); - int rumpuser_dprintf(const char *, ...) __printflike(1, 2); int rumpuser_getnhostcpu(void); Index: src/sys/rump/net/lib/libshmif/Makefile diff -u src/sys/rump/net/lib/libshmif/Makefile:1.3 src/sys/rump/net/lib/libshmif/Makefile:1.4 --- src/sys/rump/net/lib/libshmif/Makefile:1.3 Mon Nov 15 22:48:06 2010 +++ src/sys/rump/net/lib/libshmif/Makefile Sun Apr 28 10:43:45 2013 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.3 2010/11/15 22:48:06 pooka Exp $ +# $NetBSD: Makefile,v 1.4 2013/04/28 10:43:45 pooka Exp $ # LIB= rumpnet_shmif @@ -8,5 +8,7 @@ SRCS+= component.c CPPFLAGS+= -I${.CURDIR}/../../../librump/rumpkern +RUMPCOMP_USER= # filewatch + .include <bsd.lib.mk> .include <bsd.klinks.mk> Index: src/sys/rump/net/lib/libshmif/if_shmem.c diff -u src/sys/rump/net/lib/libshmif/if_shmem.c:1.47 src/sys/rump/net/lib/libshmif/if_shmem.c:1.48 --- src/sys/rump/net/lib/libshmif/if_shmem.c:1.47 Mon Jan 14 20:21:32 2013 +++ src/sys/rump/net/lib/libshmif/if_shmem.c Sun Apr 28 10:43:45 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: if_shmem.c,v 1.47 2013/01/14 20:21:32 pooka Exp $ */ +/* $NetBSD: if_shmem.c,v 1.48 2013/04/28 10:43:45 pooka Exp $ */ /* * Copyright (c) 2009, 2010 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.47 2013/01/14 20:21:32 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.48 2013/04/28 10:43:45 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -52,6 +52,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v #include "rump_private.h" #include "rump_net_private.h" +#include "rumpcomp_user.h" static int shmif_clone(struct if_clone *, int); static int shmif_unclone(struct ifnet *); @@ -250,7 +251,7 @@ initbackend(struct shmif_sc *sc, int mem #endif shmif_unlockbus(sc->sc_busmem); - sc->sc_kq = rumpuser_writewatchfile_setup(-1, memfd, 0, &error); + sc->sc_kq = rumpcomp_shmif_watchsetup(-1, memfd, 0, &error); if (sc->sc_kq == -1) { rumpuser_unmap(sc->sc_busmem, BUSMEM_SIZE); return error; @@ -668,7 +669,7 @@ shmif_rcv(void *arg) == sc->sc_nextpacket) { shmif_unlockbus(busmem); error = 0; - rumpuser_writewatchfile_wait(sc->sc_kq, NULL, &error); + rumpcomp_shmif_watchwait(sc->sc_kq, NULL, &error); if (__predict_false(error)) printf("shmif_rcv: wait failed %d\n", error); membar_consumer(); Added files: Index: src/sys/rump/net/lib/libshmif/rumpcomp_user.c diff -u /dev/null src/sys/rump/net/lib/libshmif/rumpcomp_user.c:1.1 --- /dev/null Sun Apr 28 10:43:46 2013 +++ src/sys/rump/net/lib/libshmif/rumpcomp_user.c Sun Apr 28 10:43:45 2013 @@ -0,0 +1,172 @@ +/* $NetBSD: rumpcomp_user.c,v 1.1 2013/04/28 10:43:45 pooka Exp $ */ + +/*- + * Copyright (c) 2009, 2010 Antti Kantee. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <sys/event.h> + +#include <errno.h> + +#include <rump/rumpuser_component.h> + +#include "rumpcomp_user.h" + +/* + * On NetBSD we use kqueue, on Linux we use inotify. The underlying + * interface requirements aren't quite the same, but we have a very + * good chance of doing the fd->path mapping on Linux thanks to dcache, + * so just keep the existing interfaces for now. + */ +#if defined(__NetBSD__) +int +rumpcomp_shmif_watchsetup(int kq, int fd, intptr_t opaque, int *error) +{ + struct kevent kev; + int rv; + + if (kq == -1) { + kq = kqueue(); + if (kq == -1) { + *error = errno; + return -1; + } + } + + EV_SET(&kev, fd, EVFILT_VNODE, EV_ADD|EV_ENABLE|EV_CLEAR, + NOTE_WRITE, 0, opaque); + rv = kevent(kq, &kev, 1, NULL, 0, NULL); + *error = errno; + return rv; +} + +int +rumpcomp_shmif_watchwait(int kq, intptr_t *opaque, int *error) +{ + void *cookie; + struct kevent kev; + int rv; + + cookie = rumpuser_component_unschedule(); + do { + rv = kevent(kq, NULL, 0, &kev, 1, NULL); + } while (rv == -1 && errno == EINTR); + + *error = errno; + if (rv != -1 && opaque) + *opaque = kev.udata; + rumpuser_component_schedule(cookie); + return rv; +} + +#elif defined(__linux__) +#include <sys/inotify.h> + +int +rumpcomp_shmif_watchsetup(int inotify, int fd, intptr_t notused, int *error) +{ + char procbuf[PATH_MAX], linkbuf[PATH_MAX]; + ssize_t nn; + + if (inotify == -1) { + inotify = inotify_init(); + if (inotify == -1) { + *error = errno; + return -1; + } + } + + /* ok, need to map fd into path for inotify */ + snprintf(procbuf, sizeof(procbuf), "/proc/self/fd/%d", fd); + nn = readlink(procbuf, linkbuf, sizeof(linkbuf)-1); + if (nn >= (ssize_t)sizeof(linkbuf)-1) { + nn = -1; + errno = E2BIG; /* pick something */ + } + if (nn == -1) { + *error = errno; + close(inotify); + return -1; + } + + linkbuf[nn] = '\0'; + if (inotify_add_watch(inotify, linkbuf, IN_MODIFY) == -1) { + *error = errno; + close(inotify); + return -1; + } + + return inotify; +} + +int +rumpcomp_shmif_watchwait(int kq, intptr_t *opaque, int *error) +{ + struct inotify_event iev; + void *cookie; + ssize_t nn; + + cookie = rumpuser_component_unschedule(); + do { + nn = read(kq, &iev, sizeof(iev)); + } while (errno == EINTR); + *error = errno; + rumpuser_component_schedule(cookie); + + if (nn == -1) { + return -1; + } + return (nn/sizeof(iev)); +} + +#else + +/* a polling default implementation */ +int +rumpcomp_shmif_watchsetup(int inotify, int fd, intptr_t notused, int *error) +{ + static int warned = 0; + + if (!warned) { + fprintf(stderr, "WARNING: rumpuser writewatchfile routines are " + "polling-only on this platform\n"); + warned = 1; + } + + return 0; +} + +int +rumpcomp_shmif_watchwait(int kq, intptr_t *opaque, int *error) +{ + void *cookie; + + cookie = rumpuser_component_unschedule(); + usleep(10000); + rumpuser_component_schedule(cookie); + + return 0; +} +#endif Index: src/sys/rump/net/lib/libshmif/rumpcomp_user.h diff -u /dev/null src/sys/rump/net/lib/libshmif/rumpcomp_user.h:1.1 --- /dev/null Sun Apr 28 10:43:46 2013 +++ src/sys/rump/net/lib/libshmif/rumpcomp_user.h Sun Apr 28 10:43:45 2013 @@ -0,0 +1,29 @@ +/* $NetBSD: rumpcomp_user.h,v 1.1 2013/04/28 10:43:45 pooka Exp $ */ + +/* + * Copyright (c) 2013 Antti Kantee. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +int rumpcomp_shmif_watchsetup(int, int, intptr_t, int *); +int rumpcomp_shmif_watchwait(int, intptr_t *, int *);