libthr and 1:1 threading.

Igor Sysoev is at rambler-co.ru
Thu Apr 3 05:32:11 PST 2003


On Thu, 3 Apr 2003, Terry Lambert wrote:

> Igor Sysoev wrote:
> > If a process caused a page fault or memory mapping fault at user level
> > where do you suppose to return in user space after a fault was just queued ?
> > To the same instruction that caused this fault ?
> 
> Yes.  And then return as if the fault had failed.
> 
> Only it's not fatal, because you only return out of the code if
> the fd was marked async; otherwise you go to sleep on the buffer
> getting filled in by an I/O initiated by the fault.  If you do
> return, you don't crash the process, you return with EAGAIN.

I did not say about read() operation. I said about some user land CPU
instruction that accessed a page that is not in a memory. This instruction
causes page fault.

> > BTW what do you mean by 'async fd' in Solaris ?
> > O_ASYNC ? I do not see it in Solaris 8.
> > O_NONBLOCK ? It does not matter for disk files.
> 
> O_NONBLOCK.
> 
> Examining the Solaris 8 sources, it seems to have been removed from
> the disk I/O modules, and applies only to socktpi.c, ptm.c, audio_mc.c,
> ecpp.c, and envctrl.c.  Apparently, it's also missing from the tty
> code, which goes against what Matt claimed, actually.

If Solaris 8's stdin handled by tty code then tty supports O_NONBLOCK:

-----
>uname -imprsv
SunOS 5.8 Generic_108529-17 i86pc i386 i86pc
>cat t1.c

#include <unistd.h>
#include <errno.h>
#include <fcntl.h>

main()
{
   int  rc;
   char buf[1024];

   if ((rc = fcntl(0, F_GETFL)) == -1) {
       printf("fcntl(F_GETFL) failed: %d: %s\n", errno, strerror(errno));
       exit(1);
   }

   if ((rc = fcntl(0, F_SETFL, rc | O_NONBLOCK)) == -1) {
       printf("fcntl(F_SETFL) failed: %d: %s\n", errno, strerror(errno));
       exit(1);
   }

   if ((rc = read(0, buf, 1024)) == -1) {
       printf("read() failed: %d: %s\n", errno, strerror(errno));
   }
}
>gcc -o t1 t1.c 
>./t1 
read() failed: 11: Resource temporarily unavailable
-----

> This is unfortunate, in that it leaves me without an easily
> accessible example, unless you have a USL UNIX source license?
>
> Is there any chance you have legal access to the Solaris 2.2 or
> even the 2.4 source code, which is immediately following the project
> for integration between USL and SunSoft?

This Solaris 2.4's readv() man
http://www.doc.ic.ac.uk/~mac/manuals/solaris-manual-pages/solaris/usr/man/man2/read.2.html 
states that O_NONBLOCKed regular disk file can return EAGAIN only
if there is a mandatory file/record lock. Solaris 8's man states the same.

> Or the USL SVR4.0.2 or SVR4.2 source code?

No, I have not an access to this source code.
But if you have an access to these systems it's easy to check whethear
these systems supports O_NONBLOCK on disk files or not.

> > >> Certainly, you can argue that the application should be structured
> > >> to make all I/O explicit and asynchronous, but for various reasons,
> > >> that's not the case :-).
> > > 
> > >The mmap'ed file case is obviously not something that can be
> > >handled without an explicit contract between user and kernel
> > >for notification of the pagein temporary failure (I would use
> > >a signal for that, probably, as a gross first approximation,
> > >but per-process signal handling is currently not happy...).
> > 
> > And what do you suppose to do in a signal handler ?
> > Using some non-reenterant library functions ?
> 
> No.  Call the user thread scheduler as a result of a fault that
> is normally not trappable because it resulted from a memory access
> to an mmap()'ed region of the address space, rather than resulting
> from an explicit system call.  There is no system call context when
> a trap like that occurs, there is only a trap context.

This is the same thing that KSE M:N model does with page faults.
It upcalls UTS when a thread blocked on a pagein operation.


Igor Sysoev
http://sysoev.ru/en/



More information about the freebsd-arch mailing list