NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-vax/41139: pipe(2) seems broken on VAX
The following reply was made to PR port-vax/41139; it has been noted by GNATS.
From: christos%zoulas.com@localhost (Christos Zoulas)
To: gnats-bugs%NetBSD.org@localhost, port-vax-maintainer%netbsd.org@localhost,
gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost,
tsutsui%ceres.dti.ne.jp@localhost
Cc:
Subject: Re: port-vax/41139: pipe(2) seems broken on VAX
Date: Tue, 7 Apr 2009 17:41:00 -0400
On Apr 7, 9:25pm, mhitch%lightning.msu.montana.edu@localhost ("Michael L.
Hitch") wrote:
-- Subject: Re: port-vax/41139: pipe(2) seems broken on VAX
| The following reply was made to PR port-vax/41139; it has been noted by
GNATS.
|
| From: "Michael L. Hitch" <mhitch%lightning.msu.montana.edu@localhost>
| To: gnats-bugs%NetBSD.org@localhost
| Cc:
| Subject: Re: port-vax/41139: pipe(2) seems broken on VAX
| Date: Tue, 7 Apr 2009 14:48:39 -0600 (MDT)
|
| The problem appears to only occur when the requested transfer size is >
| PIPE_SIZE, and an additional buffer of BIG_PIPE_SIZE is allocated and
| used. The defaults are 16KB and 64KB respectively. Setting BIG_PIPE_SIZE
| to a smaller value (I've tested 63KB) seems to cure the problem. The real
| root of the problem is that sys_pipe.c uses uiomove() to transfer the
| data, which uses copyin()/copyout(). On the vax, this is done with the
| movc3 instruction, which uses a 16-bit length, and will not transfer
| anything when the length is 0 (which it will be with a 64KB size).
|
| The simplest fix would be to set BIG_PIPE_SIZE in
| sys/arch/vax/include/param.h. There does appear to be an improvment
| between using 32KB and 63KB in the one test I did.
|
| A better fix would be to make copyin()/copyout() work with 64KB or
| larger sizes. I'm not sure what performance impact that might have
| though. The quick test I just did shows that just fixing copyin/copyout
| to check for 64KB and transfer one byte with movb before doing the movc3
| seems to show that it was slightly slower than when I was using a 63KB
| BIG_PIPE_SIZE.
|
| One other note - this also appears to have been the problem with using
| scp on the vax to transfer files. My scp copies no longer get corrupted
| data. [Since scp does a pipe to run the remote ssh command and copies the
| data from the pipe, this makes sense.]
Can't we do?
while (len >= 64K) {
movc3 64K-1, ...
len -= 64K-1;
}
movc3 len, ...
In kcopy, copyin and copyout?
christos
Home |
Main Index |
Thread Index |
Old Index