Communications kernel -> userland

Terry Lambert tlambert2 at mindspring.com
Fri Jul 18 22:01:50 PDT 2003


Marc Ramirez wrote:
> I asked this in -questions, but got no response; sorry for the repost.
> 
> I have a device driver that needs to make requests for data from a
> userland daemon.  What's the preferred method for doing this in 4.8R and
> 5.1R?  I'm assuming the answer is Unix-domain sockets...

It depends on the application.  In most cases these are set up
as request/response protocols.

In that case, the best method is to ise an ioctl() or fcntl()
(which you use depends on what in the kernel is talking to
userland), and then "returning" to user space with the request.
The userland then makes another call back down with the response,
and the next wait-for-request.  This saves you fully 50% of the
protection domain crossing system calls from an ordinary callback,
and it saves you 300% of the protection domain crossings of what
you would need for a pipe/FIFO/unix-domain-socket.

E.g.:

	user				kernel
	----				------
REQ1					make_req()
					sleep_waiting_for_available()
	ioctl(fd, MY_GETREQ, &req)
	sleep_waiting_for_req()
					copyout()
					sleep_waiting_for_rsp()
	ioctl(fd, MY_RSPREQ, &req)
	sleep_waiting_for_req()
					copyin()
					...
REQ2					make_req()
					copyout()
					sleep_waiting_for_rsp()
	ioctl(fd, MY_RSPREQ, &req)
	sleep_waiting_for_req()
					copyin()
					...
...

-- Terry


More information about the freebsd-hackers mailing list