Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Oct 2001 18:39:38 +0300
From:      Peter Pentchev <roam@ringlet.net>
To:        Maxim Sobolev <sobomax@FreeBSD.org>
Cc:        Ian Dowse <iedowse@maths.tcd.ie>, hackers@FreeBSD.org
Subject:   Re: cvs commit: ports/devel/ORBit Makefile ports/devel/ORBit/files patch-src::IIOP::giop-msg-buffer.c
Message-ID:  <20011026183938.I33751@straylight.oblivion.bg>
In-Reply-To: <3BD981EC.25F6DE24@FreeBSD.org>; from sobomax@FreeBSD.org on Fri, Oct 26, 2001 at 06:31:56PM %2B0300
References:  <200110261421.aa89321@salmon.maths.tcd.ie> <3BD977E4.DA2F224B@FreeBSD.org> <20011026175819.G33751@straylight.oblivion.bg> <3BD97C13.81DF3E6F@FreeBSD.org> <20011026181805.H33751@straylight.oblivion.bg> <3BD981EC.25F6DE24@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Oct 26, 2001 at 06:31:56PM +0300, Maxim Sobolev wrote:
> Peter Pentchev wrote:
> > 
> > On Fri, Oct 26, 2001 at 06:06:59PM +0300, Maxim Sobolev wrote:
> > > Peter Pentchev wrote:
> > > >
> > > > On Fri, Oct 26, 2001 at 05:49:08PM +0300, Maxim Sobolev wrote:
> > [snip]
> > > > >
> > > > > On the step 3, when marshalling results of the call, daemon
> > > > > creates a large collection of small buffers (usually 5-10
> > > > > bytes long each) arranged as array of struct iovec and then
> > > > > sends this whole buffer to the client using writev(2) call.
> > > > > In my particular case there were some 2,800 entries in the
> > > > > buffer and when the daemon tried to send it to the client
> > > > > writev(2) was returning -1 and setting errno to be EINVAL,
> > > > > which confused the server and the client causing RPC to
> > > > > fail.
> > > >
> > > > 2800 entries?  Well, from the writev(2) manual page:
> > > >
> > > >      In addition, writev() may return one of the following errors:
> > > >
> > > >      ...
> > > >
> > > >      [EINVAL]           Iovcnt was less than or equal to 0, or greater than
> > > >                         UIO_MAXIOV.
> > > >
> > > > And at least on -stable, UIO_MAXIOV is defined as 1024..
> > >
> > > Ah, ok. I've overlooked it somehow.
> > 
> > So basically, you still want a loop, but it could be a writev(2) loop,
> > not a write(2) loop, to keep some of the writev(2) performance benefit.
> 
> Yes, I've figured it already, because doing 2,800 syscalls
> when you can do a 3 instead is a bad idea. :)

Oh, and BTW - writev(2) can also return EINVAL if the total size
exceeds some maximum value (the manual page mentions a 32-bit integer).

G'luck,
Peter

-- 
I am not the subject of this sentence.

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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20011026183938.I33751>