Port-mips archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: NFS weirdness on EdgeRouter Lite (aka ERLite3)



On Thu, Sep 03, 2026 at 01:47:50PM +0200, Alexander Schreiber wrote:
> Hi,
> 
> I noticed that the Ubiquiti EdgeRouter Lite appears to be supported by
> NetBSD, so I grabbed the minimal system image from
>  https://cdn.netbsd.org/pub/NetBSD/NetBSD-11.0/evbmips-mips64eb/binary/gzimg/octeon.img.gz
> wrote to a suitable USB stick and started testing.
> 
> It booted nicely, found both CPUs but disabled cpu1 due to UP kernel, ok.
> So I installed comp.tgz, grabbed 11.0 RELEASE sources to build me
> variant of OCTEON with MULTIPROCESSOR. Note: ./build.sh tools on this
> machine should only be attempted with a fast USB drive (e.g. fast SSD),
> because the genautomata step of the gcc build eats ~1.2G of RAM which
> translates into heavy flash use - a fast USB SSD gets the build time for
> tools down ~30h, vs several days with a slow one.
> 
> Booted the new MP kernel and it came up fine:
>   https://dmesgd.nycbug.org/dmesgd?do=view&id=9124
> 
> Time to stress test it. I decided to do a ./build.sh distribution for
> starters, with /usr/src and /usr/obj on NFS (USB not being the fastest).
> 
> Unpacked sources on NFS server, mounted NFS filesystems, started build.sh,
> which eventually failed with: compiler cannot create executables .. what?
> 
> Wrote the canonical short hello.c to /usr/obj, ran gcc and it failed ...
> because the just written hello.c (via vi) was 0 bytes long. WAT?
> 
> A whole series of tests ensued:
> 
> First, I rebooted into the mkrepo kernel to exclude any nonsense during
> the local build process (unlikely, but just in case), uname -a:
>  NetBSD octeon 11.0 NetBSD 11.0 (OCTEON) #0: Thu Jul 30 15:23:12 UTC 2026  mkrepro%mkrepro.NetBSD.org@localhost:/usr/src/sys/arch/evbmips/compile/OCTEON evbmips
> 
> Copying a short file to NFS (/etc/fstab being my canocical example for this)
> resulted in a 0 byte file. Copying a larger file (/boot/netbsd) resulted
> in a file of correct size and content (md5 check on both client and NFS
> server agreed). Running ktrace on the small file cp command showed the
> write being handed to the kernel and succeeding.
> 
> Ok, small test programm:
> 
> ---------------------- snip ----------------------
> #include <stdio.h>
> #include <unistd.h>
> #include <string.h>
> #include <fcntl.h>
> 
> int main (void) {
>   char message[] =  "This is a short text.\n";
>   int fd;
>   int result;
>   size_t msg_len;
>   ssize_t written;
> 
>   msg_len = strlen(message);
> 
>   printf("starting ...\n");
>   fd = open("writer.output", O_CREAT|O_WRONLY, 0644);
> 
>   if (fd == -1) {
>     printf("file creation failed, aborting");
>     return 1;
>   }
> 
>   printf("writing message ...\n");
>   written = write(fd, message, msg_len);
>   if (written == msg_len) {
>     printf("message written ...\n");
>   } else {
>     printf("tried to write %d bytes, wrote %d bytes\n", msg_len, written);
>     perror("write");
>   }
> 
>   result = 0;
> 
>   printf("syncing ..\n");
>   result = fsync(fd);
>   if (result == 0) {
>     printf("synced ...\n");
>   } else {
>     printf("sync failed ...\n");
>   }
> 
>   result = close(fd);
> 
>   return(0);
> }
> ---------------------- snip ----------------------
> 
> results:
>  - NFS server NetBSD amd64 backed by ZFS, client erlite3 NetBSD:
>    - 0 byte file
>  - NFS server Linux amd64 backed by ext4, client erlite3 NetBSD:
>    - 0 byte file
>  - NFS server Linix amd64 backed by ext4, client erlite3 NetBSD:
>    - 22 bytes file (as expected)

Oops, that should have been:
  - NFS server Linux amd64 backed by ext4, client sparc64 NetBSD:
    - 22 bytes file (as expected)

(sparc64 NetBSD, running 11.0 because that's what I had to hand)

>  - erlite3 NetBSD on local disk (both msdos and ffs on USB stick):
>    - 22 bytes file (as expected)
> 
> Zero errors reported in all three cases.
> 
> So I tested blocksizes with dd if=/dev/zero count=X blocksize=Y of=X_Y
>  - up to a blocksize of 8191 bytes: all writes eaten by the kernel,
>    zero byte files created
>  - blocksize of 8192 and up: files of expected size are created
>  - writing 131088 blocks of size 8191 (so, ~1GB file on a 512M machine,
>    to try to force a buffer cache spill): 0 byte file created
> 
> Any blocksize < 8192 on NFS writes: empty file, blocksize > 8192: file
> of expected size.
> 
> I also tcpdumped the network traffic between the client and the NFS server.
> NFS server was NetBSD/amd64.
> 
> NFS client erlite3, small file:
>      - V3 LOOKUP -> NFS3ERR_NOENT (expected)
>      - V3 ACCESS -> Allowed
>      - V3 CREATE -> OK
>      - the end
> NFS client NetBSD sparc64, small file:
>      - V3 LOOKUP -> NFS3ERR_NOENT (expected)
>      - V3 ACCESS -> Allowed
>      - V3 CREATE -> OK
>      - V3 WRITE -> OK, all bytes written
>      - the end
> 
> The erlite3 kernel just ... eats and discards the write?
> 
> By default, NetBSD mounts the NFS filesystems (I mounted in TCP mode) with
> rsize=wsize=8192, umounting and mounting again with rsize=wsize=1024 had
> no effect.
> 
> The only _correlation_ I found is the page size of the machine, which
> happens to match the "magic" 8192 byte boundary (hw.pagesize = 8192).
> 
> Does anybody have any ideas what might be going on here? Am I just holding
> it wrong in a particularly weird way?
> 
> Kind regards,
>            Alex.
> -- 
> "Opportunity is missed by most people because it is dressed in overalls and
>  looks like work."                                      -- Thomas A. Edison

-- 
"Opportunity is missed by most people because it is dressed in overalls and
 looks like work."                                      -- Thomas A. Edison


Home | Main Index | Thread Index | Old Index