Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 5 May 1999 11:32:08 -0400 (EDT)
From:      Christopher Sedore <cmsedore@mailbox.syr.edu>
To:        current@freebsd.org
Subject:   questions on modifications to the aio code
Message-ID:  <Pine.SOL.3.95.990505102555.4721E-100000@rodan.syr.edu>

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

I'm trying to finish my modifications to the aio code, and have a few
questions I'm hoping someone would be willing to take time to answer.

First, I have modified the code to queue aio requests for sockets
differently.  If the socket is soreadable/writeable, the operation happens
as before.  If not, the aio op is queued seperately.  This is where the
complexity begins.  When sowakeup is called, it checks to see if the
socket is waiting on async operations and upcalls into a new routine to
move the queued operations back to the main job queue.  This means that
all the manipulations of that queue (a TAILQ) must be protected at by
splnet()/splx() blocks.  There are some number of these manipulations.  My
question is: should I create an alternate queue to hold aio operations for
now-ready sockets, so that I don't have to splnet()/splx() every
manipulation of the main queue?  How expensive is splnet?  Note that
there's already a separate queue for block io routines, but that makes
more sense because they're handled in a completely different way.

Second, I ended up having to back out some code written to do reads in the
upcall because I was generating a panic every time that an upcall happened
when my process wasn't curproc (uio_move was generating a trap because
curpcb? wasn't pointing where/describing what it thought it should). I'm
wondering if I can do i/o on a socket descriptor (using a struct uio) 
during an upcall for a socket that I know to be readable when I don't
know that that process is curproc.  Doing the read in the upcall offers a
significant increase in performance, so its a nontrivial win. 

Finally, a stylistic question.  I'm unsure what accepted/able practice for
including headers across kernel source files.  I modified the socket
structure (socketvar.h) to include a TAILQ_HEAD for aio operations
waiting on that socket.  This TAILQ_HEAD points to struct aiocblist.  I
moved that structure from vfs_aio.c to sys/aio.h and then included
sys/aio.h in uipc_socket.c.  Is this the correct thing to do?

Sorry for the basic questions, but I'd like to see this work get
committed, and I understand that means that it needs to be done "right"
for that to happen.

-Chris 



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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SOL.3.95.990505102555.4721E-100000>