Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Jan 2003 18:23:07 -0500 (EST)
From:      Garrett Wollman <wollman@lcs.mit.edu>
To:        Matthew Dillon <dillon@apollo.backplane.com>
Cc:        <arch@FreeBSD.ORG>
Subject:   Re: getsysfd() patch #1 (Re: Virtual memory question) 
Message-ID:  <200301222323.h0MNN7co043532@khavrinen.lcs.mit.edu>
In-Reply-To: <200301222249.h0MMn9e5016697@apollo.backplane.com>
References:  <20030122173229.D46974-100000@mail.chesapeake.net> <200301222249.h0MMn9e5016697@apollo.backplane.com>

next in thread | previous in thread | raw e-mail | index | archive | help
<<On Wed, 22 Jan 2003 14:49:09 -0800 (PST), Matthew Dillon <dillon@apollo.backplane.com> said:

>     Moving shm_open() to kernel space?  That's a pretty tall order.  I
>     don't think anyone has proposed that until now.

It was always my expectation that this would happen at some point.

>     shm_open() in its full glory must manage both namespace private
>     and namespace-filespace operations.

Huh?  This doesn't make any sense.

>     I would argue that namespace private operations are far better handled
>     in userspace then kernelspace (why waste kernel memory managing
>     private namespaces?).

Private namespaces are bad and unnecessary.  We already have anonymous
shared memory; I don't see any need for ``semi-anonymous'' shared
memory.  The garbage-collection problem is already bad enough.

>     I would say that we would almost certainly want
>     to keep shm_open() in userspace and add a system call (aka getmemfd())
>     that can eventually be used to support shm_open() behind the scenes.

You haven't provided any justification that I've seen for introducing
a new interface when the one we've got can already do that.

>     Additionally, namespace-filespace operations are far better handled with

Undefined external reference.  I've never heard the term
``namespace-filespace'' before and do not understand the distinction
you are trying to make.

>     To do that requires a two-stage process of which my current proposed
>     patch is only stage-1, since we have no current ability to call 
>     ftruncate() on a descriptor, only a vnode.

Trivial under my proposal... here's the conceptual patch:

Index: vfs_syscalls.c
===================================================================
RCS file: /home/cvs/src/sys/kern/vfs_syscalls.c,v
retrieving revision 1.297
diff -u -r1.297 vfs_syscalls.c
--- vfs_syscalls.c      27 Oct 2002 23:23:51 -0000      1.297
+++ vfs_syscalls.c      22 Jan 2003 23:19:31 -0000
@@ -2598,6 +2598,16 @@
                fdrop(fp, td);
                return (EINVAL);
        }
+       if (fp->f_type == DTYPE_SHM) {
+               /*
+                * Don't touch the rendezvous file when changing the size
+                * on an SHM descriptor.  There may be a need for a MAC
+                * check here or in shm_setsize().
+                */
+               error = shm_setsize(fp->f_ipcobj, uap->length);
+               goto out;
+       }
+
        vp = (struct vnode *)fp->f_data;
        if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) {
                fdrop(fp, td);
@@ -2619,6 +2629,7 @@
        }
        VOP_UNLOCK(vp, 0, td);
        vn_finished_write(mp);
+out:
        fdrop(fp, td);
        return (error);
 }
@@ -3414,7 +3425,9 @@
                if ((u_int)fd >= fdp->fd_nfiles ||
                    (fp = fdp->fd_ofiles[fd]) == NULL)
                        error = EBADF;
-               else if (fp->f_type != DTYPE_VNODE && fp->f_type != DTYPE_FIFO) {
+               else if (fp->f_type != DTYPE_VNODE &&
+                        fp->f_type != DTYPE_FIFO && 
+                        fp->f_type != DTYPE_SHM) {
                        fp = NULL;
                        error = EINVAL;
                } else {

This is one way to do it, assuming that we want the vnode layer to be
completely oblivious to the shared-memory implementation (which I
think is your intent and an approach I agree with).

-GAWollman


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200301222323.h0MNN7co043532>