Re: Communications kernel -> userland

[ Available lists | Index of freebsd-hackers | Month of Jul 2003 | Week of 18 Jul 2003 | Raw email | View thread | Wrap long lines | Reply | Tag ]
From
Terry Lambert <tlambert2@mindspring.com>
Date
18 Jul 2003 22:01:50
Subject
Re: Communications kernel -> userland
Message-ID
3F18D07F.BEE28FF9@mindspring.com

References to
Replies
Referenced by

[ Hide this part ]
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


Elapsed time: 0.060 seconds