Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 6 Apr 2000 22:10:32 -0700 (PDT)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        Jonathan Lemon <jlemon@flugsvamp.com>
Cc:        Jonathan Lemon <jlemon@flugsvamp.com>, Archie Cobbs <archie@whistle.com>, freebsd-arch@freebsd.org
Subject:   Re: RFC: kqueue API and rough code
Message-ID:  <200004070510.WAA93968@apollo.backplane.com>
References:  <200004070107.SAA97591@bubba.whistle.com> <200004070220.TAA92896@apollo.backplane.com> <20000406220454.J80578@prism.flugsvamp.com> <200004070401.VAA93492@apollo.backplane.com> <20000406234905.K80578@prism.flugsvamp.com>

next in thread | previous in thread | raw e-mail | index | archive | help

:Exactly.  Now, this is just what the code does at the moment, only
:slightly differently.  In the scheme above, every "registration", 
:via kqueuectl, copies in (filter, fd, ev), and then the kernel
:additionally copies in (data, flags), as those are also input parameters.
:So far, this turns out to be one more element than the current structure.
:
:When returning data, the kernel does a copyout of (data, flags) to
:the saved event structure, and then copies out the pointer to the
:structure.  This saves one copy over what I have now.
:
:In total, this comes out equal to just copying (data,flags,ident,filter).
:
:The only difference that I can see is that with the scheme above,
:the user-level code must keep the data in the same location, which
:may not be ideal for some applications.  It also binds the implementation
:between user and kernel a little tighter than I would like.

    No, you're missing the point... where did the 'user data' go in my
    second scheme?  There's no field for it anymore, and that's because
    the user data structure pointer you pass to the kernel is the SAME
    one that is returned.

    In the first scheme you are copying data to an arbitrary user structure,
    the user structure itself cannot represent any user-data because there
    is no relationship between the address of the structure that was passed
    and the address of the structure the copyout occured to.

    The whole point of this is to be able to associate arbitrary data
    with the event.  In your scheme there is no way to do that (and using
    the descriptor is not a good idea for all the reasons I outlined before).

    In this scheme you can associate as much data as you want with the event.

    I don't understand your comment about 'binding the implementation'.  
    No such thing is occuring.  Sure, the user structure has to stay around..
    that's not a big deal, it's how aio works.  It certainly does not 
    restrict your options at all, since you need meta-data to control handling
    of the event anyway.  The meta-data might as well be integrated into
    the structure because if it isn't you have to implement it separately
    anyway, and you gain absolutely no advantage whatsoever doing that.

:Looking at it another way, I use (event/filter) as a capability
:descriptor to user space rather than a pointer.  It seems that if
:you simply had (void *udata) field to the kevent structure,
:then it would be easy for you to implement your method above.  Then
:specific filters (which understand the layout of the structure
:that *uevent points to) could be written access to extended data:

    Yes and no.  The problem is that there is no room for extension to
    (for example), handle a direct threads, signal, or function dispatch
    when you do things that way.

    By creating a base user structure which is not copied to the kernel
    and contains sufficient reserved fields to extend the kernel 
    functionality, you wind up keeping the syscall API compatible with
    future additions.

:
:	struct user_event {
:		int 	priority;
: 	    	void	(*dispatch)(struct event *ev);
:		int 	thread;
:		struct kevent {
:	 	    int		fd;
: 		    short	filter;
: 		    short	flags;
:	 	    long	data;
:		    void	*uevent;
:		}
:	}
:
:How about that?  The kernel only cares about `struct kevent'.  
:It won't touch the 'uevent' pointer at all.   In theory, you
:could use the `data' field as a pointer, but for uniformity
:I'd rather just add one more field.
:--
:Jonathan

    I'm not sure what you are getting at here... you are trying to maintain
    the copyin/copyout semantics just so the user program doesn't have to
    keep the original event structure around after queueing the event?  That
    doesn't make much sense, the user program has to keep some state around
    anyway, making that state the original event structure makes things
    a whole lot easier then forcing the user program to come up with its
    own scheme to store the state separately.  All you are doing with the
    copyin/copyout scheme is forcing the user program to become unnecessarily
    complex.

					-Matt
					Matthew Dillon 
					<dillon@backplane.com>




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?200004070510.WAA93968>