Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Reduce hypercalls related to reading to essentially an amalg...



details:   https://anonhg.NetBSD.org/src/rev/01413679afc0
branches:  trunk
changeset: 786491:01413679afc0
user:      pooka <pooka%NetBSD.org@localhost>
date:      Mon Apr 29 20:08:48 2013 +0000

description:
Reduce hypercalls related to reading to essentially an amalgamation
of readv and preadv.  ditto for writing.  Hypercalls are so seldomly
used that it doesn't justify 3x the calls for syntactic sugar.

diffstat:

 lib/librumpuser/rumpuser.c                   |  103 +++++---------------------
 sys/rump/dev/lib/libugenhc/ugenhc.c          |   20 +++-
 sys/rump/fs/lib/libsyspuffs/puffs_rumpglue.c |   19 +++-
 sys/rump/include/rump/rumpuser.h             |   19 ++--
 sys/rump/librump/rumpvfs/rumpfs.c            |   14 ++-
 sys/rump/net/lib/libshmif/if_shmem.c         |   29 +++++--
 6 files changed, 91 insertions(+), 113 deletions(-)

diffs (truncated from 403 to 300 lines):

diff -r 4682d7d39830 -r 01413679afc0 lib/librumpuser/rumpuser.c
--- a/lib/librumpuser/rumpuser.c        Mon Apr 29 19:52:35 2013 +0000
+++ b/lib/librumpuser/rumpuser.c        Mon Apr 29 20:08:48 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rumpuser.c,v 1.43 2013/04/29 17:31:05 pooka Exp $      */
+/*     $NetBSD: rumpuser.c,v 1.44 2013/04/29 20:08:48 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.43 2013/04/29 17:31:05 pooka Exp $");
+__RCSID("$NetBSD: rumpuser.c,v 1.44 2013/04/29 20:08:48 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/ioctl.h>
@@ -319,48 +319,23 @@
        return 0;
 }
 
+/*
+ * Assume "struct rumpuser_iovec" and "struct iovec" are the same.
+ * If you encounter POSIX platforms where they aren't, add some
+ * translation for iovlen > 1.
+ */
 ssize_t
-rumpuser_read(int fd, void *data, size_t size, int *error)
+rumpuser_iovread(int fd, struct rumpuser_iovec *ruiov, size_t iovlen,
+       off_t off, int *error)
 {
-       ssize_t rv;
-
-       KLOCK_WRAP(rv = read(fd, data, size));
-       if (rv == -1)
-               seterror(errno);
-
-       return rv;
-}
-
-ssize_t
-rumpuser_pread(int fd, void *data, size_t size, off_t offset, int *error)
-{
+       struct iovec *iov = (struct iovec *)ruiov;
        ssize_t rv;
 
-       KLOCK_WRAP(rv = pread(fd, data, size, offset));
-       if (rv == -1)
-               seterror(errno);
-
-       return rv;
-}
-
-ssize_t
-rumpuser_write(int fd, const void *data, size_t size, int *error)
-{
-       ssize_t rv;
+       if (off == RUMPUSER_IOV_NOSEEK)
+               KLOCK_WRAP(rv = readv(fd, iov, iovlen));
+       else
+               KLOCK_WRAP(rv = preadv(fd, iov, iovlen, off));
 
-       KLOCK_WRAP(rv = write(fd, data, size));
-       if (rv == -1)
-               seterror(errno);
-
-       return rv;
-}
-
-ssize_t
-rumpuser_pwrite(int fd, const void *data, size_t size, off_t offset, int *error)
-{
-       ssize_t rv;
-
-       KLOCK_WRAP(rv = pwrite(fd, data, size, offset));
        if (rv == -1)
                seterror(errno);
 
@@ -368,55 +343,19 @@
 }
 
 ssize_t
-rumpuser_readv(int fd, const struct rumpuser_iovec *riov, int iovcnt,
-       int *error)
+rumpuser_iovwrite(int fd, const struct rumpuser_iovec *ruiov, size_t iovlen,
+       off_t off, int *error)
 {
-       struct iovec *iovp;
+       const struct iovec *iov = (const struct iovec *)ruiov;
        ssize_t rv;
-       int i;
 
-       iovp = malloc(iovcnt * sizeof(struct iovec));
-       if (iovp == NULL) {
-               seterror(ENOMEM);
-               return -1;
-       }
-       for (i = 0; i < iovcnt; i++) {
-               iovp[i].iov_base = riov[i].iov_base;
-               /*LINTED*/
-               iovp[i].iov_len = riov[i].iov_len;
-       }
+       if (off == RUMPUSER_IOV_NOSEEK)
+               KLOCK_WRAP(rv = writev(fd, iov, iovlen));
+       else 
+               KLOCK_WRAP(rv = pwritev(fd, iov, iovlen, off));
 
-       KLOCK_WRAP(rv = readv(fd, iovp, iovcnt));
        if (rv == -1)
                seterror(errno);
-       free(iovp);
-
-       return rv;
-}
-
-ssize_t
-rumpuser_writev(int fd, const struct rumpuser_iovec *riov, int iovcnt,
-       int *error)
-{
-       struct iovec *iovp;
-       ssize_t rv;
-       int i;
-
-       iovp = malloc(iovcnt * sizeof(struct iovec));
-       if (iovp == NULL) {
-               seterror(ENOMEM);
-               return -1;
-       }
-       for (i = 0; i < iovcnt; i++) {
-               iovp[i].iov_base = riov[i].iov_base;
-               /*LINTED*/
-               iovp[i].iov_len = riov[i].iov_len;
-       }
-
-       KLOCK_WRAP(rv = writev(fd, iovp, iovcnt));
-       if (rv == -1)
-               seterror(errno);
-       free(iovp);
 
        return rv;
 }
diff -r 4682d7d39830 -r 01413679afc0 sys/rump/dev/lib/libugenhc/ugenhc.c
--- a/sys/rump/dev/lib/libugenhc/ugenhc.c       Mon Apr 29 19:52:35 2013 +0000
+++ b/sys/rump/dev/lib/libugenhc/ugenhc.c       Mon Apr 29 20:08:48 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ugenhc.c,v 1.13 2013/04/28 09:58:11 pooka Exp $        */
+/*     $NetBSD: ugenhc.c,v 1.14 2013/04/29 20:08:48 pooka Exp $        */
 
 /*
  * Copyright (c) 2009, 2010 Antti Kantee.  All Rights Reserved.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ugenhc.c,v 1.13 2013/04/28 09:58:11 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ugenhc.c,v 1.14 2013/04/29 20:08:48 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -750,10 +750,14 @@
 
        while (RUSB(xfer)->rusb_status == 0) {
                if (isread) {
+                       struct rumpuser_iovec iov;
+
                        rumpcomp_ugenhc_ioctl(sc->sc_ugenfd[endpt],
                            USB_SET_SHORT_XFER, &shortval, &error);
-                       n = rumpuser_read(sc->sc_ugenfd[endpt],
-                           buf+done, len-done, &error);
+                       iov.iov_base = buf+done;
+                       iov.iov_len = len-done;
+                       n = rumpuser_iovread(sc->sc_ugenfd[endpt], &iov, 1,
+                           RUMPUSER_IOV_NOSEEK, &error);
                        if (n == -1) {
                                n = 0;
                                if (done == 0) {
@@ -767,8 +771,12 @@
                        if (done == len)
                                break;
                } else {
-                       n = rumpuser_write(sc->sc_ugenfd[endpt],
-                           buf, len, &error);
+                       struct rumpuser_iovec iov;
+
+                       iov.iov_base = buf;
+                       iov.iov_len = len;
+                       n = rumpuser_iovwrite(sc->sc_ugenfd[endpt], &iov, 1,
+                           RUMPUSER_IOV_NOSEEK, &error);
                        done = n;
                        if (done == len)
                                break;
diff -r 4682d7d39830 -r 01413679afc0 sys/rump/fs/lib/libsyspuffs/puffs_rumpglue.c
--- a/sys/rump/fs/lib/libsyspuffs/puffs_rumpglue.c      Mon Apr 29 19:52:35 2013 +0000
+++ b/sys/rump/fs/lib/libsyspuffs/puffs_rumpglue.c      Mon Apr 29 20:08:48 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: puffs_rumpglue.c,v 1.11 2009/10/14 18:18:53 pooka Exp $        */
+/*     $NetBSD: puffs_rumpglue.c,v 1.12 2013/04/29 20:08:48 pooka Exp $        */
 
 /*
  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: puffs_rumpglue.c,v 1.11 2009/10/14 18:18:53 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_rumpglue.c,v 1.12 2013/04/29 20:08:48 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -97,7 +97,13 @@
                inited = 1;
 
                while (rv) {
-                       n = rumpuser_write(pap->comfd, buf, rv, &error);
+                       struct rumpuser_iovec iov;
+
+                       iov.iov_base = buf;
+                       iov.iov_len = rv;
+
+                       n = rumpuser_iovwrite(pap->comfd, &iov, 1,
+                           RUMPUSER_IOV_NOSEEK, &error);
                        if (n == -1)
                                panic("fileread failed: %d", error);
                        if (n == 0)
@@ -135,7 +141,12 @@
                off = 0;
                toread = sizeof(struct putter_hdr);
                do {
-                       n = rumpuser_read(pap->comfd, buf+off, toread, &error);
+                       struct rumpuser_iovec iov;
+
+                       iov.iov_base = buf+off;
+                       iov.iov_len = toread;
+                       n = rumpuser_iovread(pap->comfd, &iov, 1,
+                           RUMPUSER_IOV_NOSEEK, &error);
                        if (n <= 0) {
                                if (n == 0)
                                        goto out;
diff -r 4682d7d39830 -r 01413679afc0 sys/rump/include/rump/rumpuser.h
--- a/sys/rump/include/rump/rumpuser.h  Mon Apr 29 19:52:35 2013 +0000
+++ b/sys/rump/include/rump/rumpuser.h  Mon Apr 29 20:08:48 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rumpuser.h,v 1.96 2013/04/29 17:35:04 pooka Exp $      */
+/*     $NetBSD: rumpuser.h,v 1.97 2013/04/29 20:08:48 pooka Exp $      */
 
 /*
  * Copyright (c) 2007-2013 Antti Kantee.  All Rights Reserved.
@@ -99,17 +99,20 @@
 typedef void (*rump_biodone_fn)(void *, size_t, int);
 void rumpuser_bio(int, int, void *, size_t, off_t, rump_biodone_fn, void *);
 
-ssize_t rumpuser_read(int, void *, size_t, int *);
-ssize_t rumpuser_pread(int, void *, size_t, off_t, int *);
-ssize_t rumpuser_write(int, const void *, size_t, int *);
-ssize_t rumpuser_pwrite(int, const void *, size_t, off_t, int *);
+/*
+ * Reading and writing.  Since hypercalls are relatively uncommon, we don't
+ * need tons of syntactic sugar; fold everything into two.
+ */
 
+/* this one "accidentally" matches the NetBSD kernel ... */
 struct rumpuser_iovec {
        void *iov_base;
-       uint64_t iov_len;
+       size_t iov_len;
 };
-ssize_t rumpuser_readv(int, const struct rumpuser_iovec *, int, int *);
-ssize_t rumpuser_writev(int, const struct rumpuser_iovec *, int, int *);
+#define RUMPUSER_IOV_NOSEEK -1
+ssize_t rumpuser_iovread(int, struct rumpuser_iovec *, size_t, off_t, int *);
+ssize_t rumpuser_iovwrite(int, const struct rumpuser_iovec *, size_t,
+                         off_t, int *);
 
 /*
  * clock and zzz
diff -r 4682d7d39830 -r 01413679afc0 sys/rump/librump/rumpvfs/rumpfs.c
--- a/sys/rump/librump/rumpvfs/rumpfs.c Mon Apr 29 19:52:35 2013 +0000
+++ b/sys/rump/librump/rumpvfs/rumpfs.c Mon Apr 29 20:08:48 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rumpfs.c,v 1.112 2013/04/07 18:42:49 stacktic Exp $    */
+/*     $NetBSD: rumpfs.c,v 1.113 2013/04/29 20:08:49 pooka Exp $       */
 
 /*
  * Copyright (c) 2009, 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.112 2013/04/07 18:42:49 stacktic Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.113 2013/04/29 20:08:49 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -1338,6 +1338,7 @@
 static int
 etread(struct rumpfs_node *rn, struct uio *uio)
 {
+       struct rumpuser_iovec iov;
        uint8_t *buf;



Home | Main Index | Thread Index | Old Index