6 years agoTypo in variable name.
Kevin Klues [Thu, 14 Aug 2014 01:16:38 +0000 (18:16 -0700)]
Typo in variable name.

I tested before pushing, so I'm not sure why it compiled and ran for me,
but this was clearly a typo and should have been oflag from the

6 years agoAdd more restrictive oflag checks to sys_open
Kevin Klues [Thu, 14 Aug 2014 00:56:22 +0000 (17:56 -0700)]
Add more restrictive oflag checks to sys_open

Also make sure and error out with EISDIR if the named file is a
directory and oflag includes O_WRONLY or O_RDWR. This has only been
added to the vfs.

6 years agofchdir() (XCC)
Barret Rhoden [Wed, 13 Aug 2014 20:26:29 +0000 (13:26 -0700)]
fchdir() (XCC)

Implements sys_fchdir, and touches up the raciness on pwd.  The 9ns side does a
better job, IIRC, of dealing with races on lookups (any of which can start at
pwd (DOT)).  Right now, a VFS lookup from pwd concurrent with a chdir could
fail to grab a ref.

Rebuild glibc.

6 years agoRevert "Add /etc/ld.so.conf so the dynamic loader has a path even if LD_LIBRARY_PATH...
Ronald G. Minnich [Tue, 12 Aug 2014 23:55:03 +0000 (23:55 +0000)]
Revert "Add /etc/ld.so.conf so the dynamic loader has a path even if LD_LIBRARY_PATH is not set"

This reverts commit dca513882cec49ae570605f3eace49fc63dfc357.

Because that did not do it either. We have to fix ld-linux

6 years agoAdd /etc/ld.so.conf so the dynamic loader has a path even if LD_LIBRARY_PATH is not set
Ronald G. Minnich [Tue, 12 Aug 2014 23:50:09 +0000 (23:50 +0000)]
Add /etc/ld.so.conf so the dynamic loader has a path even if LD_LIBRARY_PATH is not set

In Akaros, if LD_LIBRARY_PATH is not set, then no .so's will be found. This breaks
a Go test which resets the environment.

Or if you
you can never run another dynamically linked command.

So put /lib into /etc/ld.so.conf; this gets us past one part of the
os/exec benchmark.

This is ugly but workable. It's disappointing to bring this kind of ugliness into
Akaros but so it goes.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
6 years agoRevert "CS multi-threaded and locking."
Ronald G. Minnich [Mon, 11 Aug 2014 22:45:43 +0000 (22:45 +0000)]
Revert "CS multi-threaded and locking."

This reverts commit 9f77d75980ef4ab3a7e5bf516c383c916beed877.

THis borked it big time.

6 years agoMake etherread4() safe for LRO.
Andrew Gallatin [Mon, 11 Aug 2014 14:30:19 +0000 (07:30 -0700)]
Make etherread4() safe for LRO.

This patch allows etherread4() read up to 128K, rather than just an MTU
size.  This is required because qbread() is used to read, and
the semantics of qbread() are to give you one block of at most len bytes.
If a block is > len (which will be the case for LRO, when len == MTU), then
it will split the block.   When the block is split  when feeding packets from
dev/ether to ethermedium, you wind up looking in the middle of the
payload for headers, and it is a total mess.  Ideally, there would
be some sort of qbreadall() that would not take a length argument
that would just return the next block on the queue (eg, a blocking

128K was chosen because it is roughly 2x the size of the largest
imaginable MTU and/or LRO packet size (due to both IPv4 and
IPv6 being limited to roughly 64K + headers per packet).

Discussed with: Barret Rhoden, Ronald Minnich

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoprintfmt: print cur_errbuf as part of %e
Ronald G. Minnich [Sat, 9 Aug 2014 03:27:57 +0000 (03:27 +0000)]
printfmt: print cur_errbuf as part of %e

Of course, now we should start initializing first element to 0 when we
do a system call, I guess, as it's printing garbage sometimes.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
6 years agoqio.c: don't just warn when we have problems, panic.
Ronald G. Minnich [Sat, 9 Aug 2014 03:25:33 +0000 (03:25 +0000)]
qio.c: don't just warn when we have problems, panic.

You're going to hate me for this one. But I'm seeing real problems
from the extra stuff that I think is breaking some Go tests.

I think we need to fix it, not just warn, so I've made it a panic for

I'm willing to be convinced this is a mistake, but it just seems very bad

In one case, packblock, I just return the bp if there is extra data, which
should at least preserve correctness.

I am hoping this forces us to get this right. It seems really hokey
as is. But maybe I'm just wrong.

6 years agoFixes TCP drops due to ARP timeouts
Barret Rhoden [Wed, 6 Aug 2014 02:00:32 +0000 (19:00 -0700)]
Fixes TCP drops due to ARP timeouts

The root of the problem is that arpents were using u32s to store the
msec since boot.  Machines that run for over 50 days will wrap around.

Since NOW was a u64, the arpent ctimes were getting set to weird
numbers, and ultimately the arpents all appeared to be stale.

Stale arps get their blocklists pruned to one block (which is a
questionable bit of code).  These blocks were TCP packets.

So if a machine was running for more than 50 days, and if multiple TCP
packets were sent to the same arpent quickly, one of them could be
dropped, which throws off the entire TCP stream.

c89 happens to be a machine with a TSC that doesn't reset when
soft-rebooting (via our reboot()), so it acted like a machine that had
been up for about 3 months.

Arguably, we could have NOW (and the others, like seconds() and
milliseconds()) be cast to a u32, so that at least both NOW and ctime
are the same width, but that seems really shoddy.

6 years agoCS multi-threaded and locking.
David Zhu [Tue, 29 Jul 2014 05:12:42 +0000 (22:12 -0700)]
CS multi-threaded and locking.

Note this is a basic version. Locking is not optimal and uses large
locks over large areas. Fine grained locking should improve the
performance of the CS server significantly. Holding off further
optimization if we are going to write it in GO.

6 years agoFix simple warnings that did not include the right files.
David Zhu [Mon, 28 Jul 2014 23:14:08 +0000 (16:14 -0700)]
Fix simple warnings that did not include the right files.

6 years agoAdd uthread_usleep which sleeps in microseconds.
David Zhu [Mon, 28 Jul 2014 06:38:16 +0000 (23:38 -0700)]
Add uthread_usleep which sleeps in microseconds.

Fixing a previous bug where rounding was causing inaccurate waiting.

6 years agokern: mmap: make the lowest mmap address MiB; mmap ld.so at MiB
Ronald G. Minnich [Wed, 30 Jul 2014 19:37:38 +0000 (19:37 +0000)]
kern: mmap: make the lowest mmap address MiB; mmap ld.so at MiB

We spent a day debugging a bad pointer that was the wrong bad pointer;
it was actually a data corruption of a null pointer that changed it to
ff00, which was valid memory since we load ld.so at 4k. As it turns out,
it's easier nowadays to get a deref via a NULL pointer struct to not take a fault
if you have anything mapped at anything less than 1M; structs are big.

Map ld.so at MiB; don't allow mappings lower than MiB. This doesn't fix
the go runtime problem, but it would have let us find the issue
several days earlier. And, since this is a common issue, might as well
avoid it in this instance.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agotests: peek.c
Ronald G. Minnich [Wed, 30 Jul 2014 00:43:36 +0000 (00:43 +0000)]
tests: peek.c

peek will peek at bytes, as many as you specify in the command line, e.g.
peek 0xff00 0x400000
will peek at those addresses as a byte pointer.

It succeeds on 0xff00 and it should not.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoPrinting chan's also prints the #device
Barret Rhoden [Tue, 29 Jul 2014 23:39:43 +0000 (16:39 -0700)]
Printing chan's also prints the #device

The chan->type number is arbitrary and determined by the link order.

6 years agoMinor debugging fixes
Barret Rhoden [Tue, 29 Jul 2014 01:26:10 +0000 (18:26 -0700)]
Minor debugging fixes

pip for a DYING process would panic the kernel since the file's in the
file table were garbage.  At a minimum, we should be checking the bit
before checking the pointer.

6 years agochan: init mountpoint to NULL
Ronald G. Minnich [Sun, 27 Jul 2014 20:39:10 +0000 (20:39 +0000)]
chan: init mountpoint to NULL

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agosys_rename: allow arbitrary rename
Ronald G. Minnich [Sat, 26 Jul 2014 18:00:18 +0000 (18:00 +0000)]
sys_rename: allow arbitrary rename

This got a little tricky as we have to strip the mountpoint
base of the target file, and it was essentially impossible
to find the mountpoint after the fact. Don't know if this is the prettiest
way to do it but it works.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agorename: fix a stupid typo, so frees work. Rename still doesn't work however.
Ronald G. Minnich [Fri, 25 Jul 2014 21:10:41 +0000 (21:10 +0000)]
rename: fix a stupid typo, so frees work. Rename still doesn't work however.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agosysrename: fix to take full paths. Currently not quite there
Ronald G. Minnich [Fri, 25 Jul 2014 19:50:47 +0000 (19:50 +0000)]
sysrename: fix to take full paths. Currently not quite there

This includes the changes to make sys_rename work for arbitrary paths.
There's also a bit of prototype cleanup.

Doesn't quite work yet but that may be a go9p bug. The wstat is correct
when sent now.

I'm fairly sure the chan tests are right, I talked to the guys at BL
about them.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoconvM2S: bring in the init_empty_dir function.
Ronald G. Minnich [Fri, 25 Jul 2014 19:19:38 +0000 (19:19 +0000)]
convM2S: bring in the init_empty_dir function.

Some ops will have to create functions for wstat, so bring this in.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoPrint. Add printing for qids, cnams, and chans
Ronald G. Minnich [Fri, 25 Jul 2014 19:17:35 +0000 (19:17 +0000)]
Print. Add printing for qids, cnams, and chans

We don't have standard formatted prints for qids, chans, and cnames.
Add printqid, printcname, and printchan.
Set up such that %C will print a chan and %Q will print a qid.
What happens when we run out? We shift to utf-8 of course.
I can't wait to use the infinity symbol format!
You only think I'm joking.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoAdd a test for the rename system call.
Ronald G. Minnich [Fri, 25 Jul 2014 18:40:17 +0000 (18:40 +0000)]
Add a test for the rename system call.

Maybe we can fix it to use the constant. The build system keeps defeating me.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoMake pullblock() and trimblock() aware of extra data
Andrew Gallatin [Thu, 24 Jul 2014 13:50:57 +0000 (06:50 -0700)]
Make pullblock() and trimblock() aware of extra data

Note that there is an odd semantic used by TCP, where it
expects to be able to call trimblock() on a pure ack (thus
leaving 0 valid bytes in the block), and yet not have the
block freed.  That meant that it wasn't as simple as just
using pullblock() to prune the leading space & is the
reason for the _pullblock() helper which retains an empty
block when free != 0.

Thanks to Barret for catching some bugs in the first version
of the patch.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agohydra vm network configuration
David Zhu [Wed, 23 Jul 2014 22:22:26 +0000 (15:22 -0700)]
hydra vm network configuration

Tired of this not being in the master branch. Although perhaps this
should be ifconfig.local

6 years agoAdds touch to busybox
Barret Rhoden [Wed, 23 Jul 2014 01:31:55 +0000 (18:31 -0700)]
Adds touch to busybox

Feel free to touch your files!

Rebuild busybox with the new config, etc.

6 years agoKernel support for WSTAT_{ATIME,MTIME} for the VFS
Barret Rhoden [Wed, 23 Jul 2014 01:15:12 +0000 (18:15 -0700)]
Kernel support for WSTAT_{ATIME,MTIME} for the VFS

9ns devices need to handle this on their own, directly dealing with
wstat.  It works over devmnt for instance, though none of our other
devices support it (#r, #I, #s were tested briefly).

6 years agoNew VFS files have the 'correct' ctime
Barret Rhoden [Wed, 23 Jul 2014 01:08:05 +0000 (18:08 -0700)]
New VFS files have the 'correct' ctime

The kernel doesn't know what the real time is, so it always thinks it
booted at May 12, 2009 (Nanwan's birthday, though it's actually the day
we found the picture of him (or her)).

I had to change the order of some initialization, since the VFS now
wants the TSC timing to be set up for epoch_seconds() to work.

6 years agoStubs and parsing for rename and timestamps (XCC)
Barret Rhoden [Tue, 22 Jul 2014 23:45:21 +0000 (16:45 -0700)]
Stubs and parsing for rename and timestamps (XCC)

Glibc calls for utime, utimes, futimens, and whatever all call wstat
underneath.  The kernel just prints out the request and fails.

Any of the "at" calls will error out if you give them a directory fd.
We'll eventually support those.

We don't support the symlink flags for utimensat either.  Those are just
ignored, since wstat doesn't follow links (at least not explicitly, and
it might for the VFS).  Will probably need to handle that for all wstat
too (either a flag or lwstat).  Can address that when we sort out the

6 years agoAdd divby0 fault handler and abstract things better
Kevin Klues [Tue, 22 Jul 2014 23:43:13 +0000 (16:43 -0700)]
Add divby0 fault handler and abstract things better

We will eventually want an architecture dependant way of switching on
our fault numbers instead of the highly x86 specific way we are doing it
now.  That said, the way in which faults are handled should be the same
across architectures for a given scheduler and a given 'type' of trap.
I started abstracting things a little bit, with this in mind, but there
is still a long way to go. We can cross that bridge when necessary.

6 years agoTracks process's program name
Barret Rhoden [Tue, 22 Jul 2014 19:09:13 +0000 (12:09 -0700)]
Tracks process's program name

Useful for debugging with ps.  I don't track arguments yet, so scripts
all show up as busybox.

Also fixes a leak in an error case of sys_fork().

6 years agoDecreases harm from races on VFS file offsets
Barret Rhoden [Tue, 22 Jul 2014 05:55:09 +0000 (22:55 -0700)]
Decreases harm from races on VFS file offsets

Two syscalls could read, write, seek, or whatever on the same struct
file at a time.  In doing so, they race on the state of the file pointer
(offset).  The kernel could get confused slightly when figuring out
things like the page indices or the offsets.

Other parts of the kernel might catch the problem, like the page cache
or the memcpy, but better safe than sorry.

6 years agoFixes init script loading
Barret Rhoden [Tue, 22 Jul 2014 05:32:35 +0000 (22:32 -0700)]
Fixes init script loading

We were starting with the script string, which is a kernel address, and
then running off the end of it, replaces spaces with \0s for a while.
With crazy results.  The monitor prompt was missing some letters,
probably because we clobbered them, etc.  Also, if you return -1 before
calling mon_bin_run, the kernel would just PF, and then GPF on its BT.
yikes!  We might have been clobbering more stuff too, like running off
the end of largv.

This newer version still works, and doesn't have those bugs.  But it
might have more.  We should consider rewriting it with parsecmd() or
something.  That'd also get rid of the need for the two loops of

6 years agoFixes excessive closes in accept()
Barret Rhoden [Tue, 22 Jul 2014 04:55:21 +0000 (21:55 -0700)]
Fixes excessive closes in accept()

The extra close brought in at 1a7a2a40, when fixing up the sockets code.
_sock_data() closes whatever ctlfd it is passed.

Incidentally, that was closing it too many times, though that bug wasn't
the one causing all of our problems.

The kernel now spits out a warning if close fails, since nobody checks
its retval.  If you see that somewhere, it's time to start asserting
your closes succeed.

6 years agoAllows concurrent dcache_put() calls
Barret Rhoden [Tue, 22 Jul 2014 04:49:56 +0000 (21:49 -0700)]
Allows concurrent dcache_put() calls

Two openers could fail to find a dentry in the dcache, then get the
dentry from the FS, and then both try to insert into the dcache.  The
second one would find a non-NEGATIVE item present.  This is fine, it's
just not something dcache_put was built for at the time, hence the

6 years agoFixes VFS generic_file_read with too large offsets
Barret Rhoden [Tue, 22 Jul 2014 04:47:50 +0000 (21:47 -0700)]
Fixes VFS generic_file_read with too large offsets

If offset is greater than the file size, we should return 0.

We had another bug causing large offsets, and when offset was greater
than the filesize, count would be < 0.  Definite trouble.

6 years agoFixes large dirreads on 9ns
Barret Rhoden [Sun, 20 Jul 2014 22:07:44 +0000 (15:07 -0700)]
Fixes large dirreads on 9ns

When reading from large dirs, we would fill the c->buf with lots of Ms,
such that we couldn't fit any more in there, and then we'd error out.
We get lots of Ms because we'd read more than one M per read call, but
extract only one M per read (M2kdirent).

The fix is to attempt to extract an M2kdirent before even performing
the underlying read, to keep the c->bufused size down.  Also avoids
unnecessary reads.

Also, successful dirreads return the sizeof(struct kdirent), which is
the actual amount of memory we are writing back to userspace, instead of
the size of an M.

6 years agoSimple test so we can try to find out what's wrong with directory reading
Ronald G. Minnich [Sat, 19 Jul 2014 02:26:07 +0000 (02:26 +0000)]
Simple test so we can try to find out what's wrong with directory reading

Opens 1000 files in /net/tcp by opening clone,

<arg1 files> in /net/tcp
<arg1 files> in <arg2>

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agosys_readlink: return the length of the string NOT including NULL
Ronald G. Minnich [Wed, 16 Jul 2014 15:23:25 +0000 (08:23 -0700)]
sys_readlink: return the length of the string NOT including NULL

For consistency with things like getcwd. Note that we should not be
able to return a negative number as the retlen is strlen(...) + 1.

This makes path/filepath go testing work.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agochmod() and fchmod(), implemented with wstat (XCC)
Barret Rhoden [Wed, 16 Jul 2014 05:21:34 +0000 (22:21 -0700)]
chmod() and fchmod(), implemented with wstat (XCC)

Removes SYS_chmod, using SYS_wstat for it instead.  While I was at it,
wstat and fwstat work for 9ns completely.  For the VFS, it only supports
changing the mode.

Rebuild glibc.  Either copy over the two new files or just make clean.
If you chmod and get "invalid" or something similar, either you didn't
rebuild glibc properly or you didn't fill kfs again.

6 years agoFixes the VFS chmod
Barret Rhoden [Wed, 16 Jul 2014 04:14:43 +0000 (21:14 -0700)]
Fixes the VFS chmod

Permissions could not be removed, due to the |=.  We also can't just set
the mode directly, since the file type is squeezed into the top part of
the inode's mode.

6 years agoFixes uninitialized mhead
Barret Rhoden [Wed, 16 Jul 2014 03:22:31 +0000 (20:22 -0700)]
Fixes uninitialized mhead

PFs later on when it tries to rwlock.

6 years agoFixes VFS getcwd
Barret Rhoden [Wed, 16 Jul 2014 01:42:35 +0000 (18:42 -0700)]
Fixes VFS getcwd

Off by 1, it was leaving an extra space in each link slot.  This was adding an
extra letter, or sometimes gibberish or 0, to each part of the path.

6 years agoSYS_wstat, fwstat, rename, and fchdir stubs (XCC)
Barret Rhoden [Wed, 16 Jul 2014 00:28:14 +0000 (17:28 -0700)]
SYS_wstat, fwstat, rename, and fchdir stubs (XCC)

Reinstall your kernel headers.

6 years agoMoves the 9ns conv functions to glibc (XCC)
Barret Rhoden [Tue, 15 Jul 2014 23:34:40 +0000 (16:34 -0700)]
Moves the 9ns conv functions to glibc (XCC)

Glibc will need to use these to implement functions like chmod.

Reinstall your cross compiler.  Either copy over the changed -ros files, or
just make clean the whole thing.

6 years agogetcwd: return the length of the string instead of just 0
Ronald G. Minnich [Wed, 16 Jul 2014 00:13:35 +0000 (17:13 -0700)]
getcwd: return the length of the string instead of just 0

Useful for Go.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agorelax permissions on devarch
Andrew Gallatin [Tue, 15 Jul 2014 20:39:25 +0000 (13:39 -0700)]
relax permissions on devarch

Until we have permissions sorted out in general,
make devarch functionality usable.

Discussed with Barret Rhoden & Ronald Minnich

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoImplement TSO
Andrew Gallatin [Tue, 15 Jul 2014 16:00:22 +0000 (09:00 -0700)]
Implement TSO

Implement TCP Segmentation Offload.  Part of this patch
involves adding a feat field to the output of the ether
stats so that etherbind can parse that, and set a flag
in the ipifc that can be used by TCP to check for TSO
support.  It is also nice to be able to see what offloads
a device supports:

feat: udpck tcppck padmin sg tso

I did it this way rather than just enabling TSO
everywhere & segmenting in software at the edge
for devices which don't support TSO (like I did for
checksum offload) because TSO may be inappropriate
for low bandwidth links.

This patch lets me send at line rate on my out-of-tree
10GbE NIC for message sizes larger than 8K
(an improvement from 6.9Gb/s -> 9.47Gb/s)

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoFixes memory leak with syscall strings
Barret Rhoden [Tue, 15 Jul 2014 02:21:16 +0000 (19:21 -0700)]
Fixes memory leak with syscall strings

Yield and exec don't return, so we would never free those blobs.

6 years agoDefault signal handlers are sigactions
Barret Rhoden [Tue, 15 Jul 2014 00:02:20 +0000 (17:02 -0700)]
Default signal handlers are sigactions

Instead of the weaker sighandlers.  This is useful so we have access to
the faulting context, such as in default_core_handler.

Incidentally, you may want to point a breakpoint in that handler if you
want to kfunc print_vmrs to debug the page fault.

6 years agoMinor touchup for tsc-compat
Barret Rhoden [Mon, 14 Jul 2014 23:59:43 +0000 (16:59 -0700)]
Minor touchup for tsc-compat

It wasn't compiling with some Linux programs.  Slightly odd, since I've
used this with gcc on Linux in the past.  Perhaps those programs also
defined FALSE.

6 years agoAdds signal(), wrapping sigaction()
Barret Rhoden [Mon, 14 Jul 2014 19:34:37 +0000 (12:34 -0700)]
Adds signal(), wrapping sigaction()

Needed for older programs that still use signal().

6 years agoFixes #r so that it shows /proc
Barret Rhoden [Wed, 9 Jul 2014 03:10:12 +0000 (20:10 -0700)]
Fixes #r so that it shows /proc

/proc was the last entry, and recently added.  I didn't add enough stuff
to #r for it to fully show up.  You'd only notice if you did an ls \#r.

There's instructions for how to add more entries.  I think this stuff is
usually generated by other code.

6 years agoFixes elf panic
Barret Rhoden [Wed, 9 Jul 2014 01:23:44 +0000 (18:23 -0700)]
Fixes elf panic

We have some programs that would hit the partial case, but would also
try to mmap beyond the file size.  When we attempted to zero the rest of
the page, we'd panic.  And that page would never fault in, since it is
beyond the file's limit.

This area is quite a mess.  Most of the code is very old, and related to
half-understood  elf loading rules.

6 years agorread: if you hit eof on a directory, mark the chan as being at eof
Ronald G. Minnich [Tue, 8 Jul 2014 14:16:12 +0000 (07:16 -0700)]
rread: if you hit eof on a directory, mark the chan as being at eof

This saves a 0-byte read for each directory entry.
Sadly, it does not save the ensuing stat for each entry, which is very foolish.
Failure of Vision on the part of glibc.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agorread: fix lingering 2048 constant -> DIRREADSIZE
Ronald G. Minnich [Tue, 8 Jul 2014 14:20:47 +0000 (07:20 -0700)]
rread: fix lingering 2048 constant -> DIRREADSIZE

I really have no idea how this one slipped through.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoOnly linearizeblock on #M qremoves
Barret Rhoden [Tue, 8 Jul 2014 03:39:50 +0000 (20:39 -0700)]
Only linearizeblock on #M qremoves

So we don't linearize blocks any time someone calls qremove.  The other
callers of qremove look okay.  It's up to the callers to know what to do
with the blocks.  For instance, bl2mem() knows how to deal with

Also, the other mount block op right above the change is now safer,
since pullupqueue() makes sure the full header is in place.

6 years agoBlock pullup fixes
Barret Rhoden [Tue, 8 Jul 2014 03:38:58 +0000 (20:38 -0700)]
Block pullup fixes

pullupqueue() acts like pullupblock, in that it makes sure the mainbody
has enough.

pullupblock had a minor accounting issue, in that it failed to zero out
the base (checkb() was failing).

6 years agosysfile.c: bump up the read size using a constant
Ronald G. Minnich [Tue, 8 Jul 2014 01:29:19 +0000 (18:29 -0700)]
sysfile.c: bump up the read size using a constant

DIRREADSIZE is now the amount of bytes we try to read
when reading a directory. 8192 sounds reasonable.

Next step is to have an 'at EOF' flag on directories so we
don't do one zero byte read per dirent. But things are already
much faster.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoqio: need to linearizeblock in qremove
Ronald G. Minnich [Tue, 8 Jul 2014 01:23:15 +0000 (18:23 -0700)]
qio: need to linearizeblock in qremove

Else data will be lost. This fixes the problem we saw when
/net/cs was not visible.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoCleans up kdirent hack, removes MIN_M_BUF_SZ
Barret Rhoden [Tue, 8 Jul 2014 01:23:44 +0000 (18:23 -0700)]
Cleans up kdirent hack, removes MIN_M_BUF_SZ

6 years agoFix up reads.
Ronald G. Minnich [Thu, 3 Jul 2014 20:13:20 +0000 (13:13 -0700)]
Fix up reads.

Buffer up directory read info so we can feed it to the
kernel one kdirent at a time. There is some performance
improvement to be had but this all by itself should remove the
'missed entries' problem and it also gets rid of the ghetto hack.

You should run the latest version of github.com/rminnich/go9p
to get the advantages

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoBlock extra_data
Barret Rhoden [Thu, 3 Jul 2014 04:17:35 +0000 (21:17 -0700)]
Block extra_data

Extends blocks to have an array of pointers to extra data.  The old
block buffer is now the 'main body'.  A block's data consists of the
main body, followed by the extra_data buffers, in order.

The extra data are currently kmalloc refcnt'd and are kfreed when the
block is freed.  Later, we'll want some way to handle other, probably
refcnt'd buffers.

Blocks are ideally kept in their scattered state, but most of our NIC
drivers do not know how to handle this yet.  For those, we linearize the
block before pushing it out devether.

Checksums, qdiscards, copies, clones, etc, all needed to be changed to
know about the new packet type.  There are also a lot of places where we
don't handle the new block types.  If you see any of the warnings, then
let me know.

Likewise, if you have weird networking failures, turn off
CONFIG_BLOCK_EXTRAS and see if that fixes it.  Regardless, let me know
the outcome.

6 years agoFixes allocb's use of mem flags
Barret Rhoden [Thu, 3 Jul 2014 04:09:37 +0000 (21:09 -0700)]
Fixes allocb's use of mem flags

_allocb was always waiting, even for iallocb.  Now iallocb can fail if
memory isn't available (as it was meant to), and allocb will block til
memory is available.

6 years agowarn_once()
Barret Rhoden [Wed, 2 Jul 2014 22:19:10 +0000 (15:19 -0700)]

To avoid massinve warning spam.

6 years agoHeader file changes for TSO
Barret Rhoden [Wed, 2 Jul 2014 17:50:37 +0000 (10:50 -0700)]
Header file changes for TSO

Via Drew.

6 years agoAdds /proc to devroot
Barret Rhoden [Tue, 1 Jul 2014 23:26:29 +0000 (16:26 -0700)]
Adds /proc to devroot

So we can bind #p to it.  Apparently, we haven't had /proc since the
nxm->inferno transition nearly 6 months ago.

6 years agoBind outputs an error when it fails
Barret Rhoden [Tue, 1 Jul 2014 23:23:48 +0000 (16:23 -0700)]
Bind outputs an error when it fails

And it turns out we haven't been binding #p to /proc!

6 years agoLinks in devarch (#P)
Barret Rhoden [Tue, 1 Jul 2014 23:13:23 +0000 (16:13 -0700)]
Links in devarch (#P)

For a device to be built in to the kernel (and thus bindable), it needs to be
annotated with __devtab.

6 years agosys_proc_create() can dup FGRPs (XCC)
Barret Rhoden [Tue, 1 Jul 2014 22:55:40 +0000 (15:55 -0700)]
sys_proc_create() can dup FGRPs (XCC)

9ns FGRPs were always being duped for all processes (fork and create), but VFS
ones were only duped for forks.  Now both 9ns and VFS behave the same way, and
you can pass a flag to have your entire FGRP, minus the CLOEXECs, duped from a
parent to a child on creation.  This happens implicitly in a fork().

Eventually, we'll have another dup call, say dup11345385(), that will allow a
parent to "dup2" specific FDs to its child.

Reinstall your kernel headers, or just:

$ cp kern/include/ros/procinfo.h \

6 years agoNeed #ifdef because path var doesnt even exist if not set
Kevin Klues [Thu, 26 Jun 2014 21:29:40 +0000 (14:29 -0700)]
Need #ifdef because path var doesnt even exist if not set

6 years agoAdd ability to run init script through config var
Kevin Klues [Thu, 26 Jun 2014 21:06:06 +0000 (14:06 -0700)]
Add ability to run init script through config var

There is now a config variable that allows you to specify a script to
run after the kernel has booted.  Use this variable to specify the path
to a script, followed by any arguments you want to pass it.  There is
default init.sh script that has been put in kfs/bin that simply calls
ifconfig and then drops you into busybox.

If this config variable isn't set, we still run the manager function, for
backwards compatibility reasons.  Eventually we want to do away with the
managers altogether, but the way jenkins is set up currently prevents
this without some major changes.  Once we have something like Ron's #z
device, we will be able to do away the menager completely since jenkins
will be able to use #z to run kernel tests from userspace.

6 years agoAdd cpio as a default program built for busybox
Kevin Klues [Fri, 20 Jun 2014 18:28:45 +0000 (11:28 -0700)]
Add cpio as a default program built for busybox

Dont forget to reconfigure and reinstall busybox with the cpio option
enabled if you don't want to reapply the default config.

6 years agoGo client script no longer needed on akaros side.
Kevin Klues [Fri, 20 Jun 2014 18:24:31 +0000 (11:24 -0700)]
Go client script no longer needed on akaros side.

6 years agoDebugging helper: kmalloc_refcnt()
Barret Rhoden [Thu, 26 Jun 2014 00:37:16 +0000 (17:37 -0700)]
Debugging helper: kmalloc_refcnt()

6 years agoRemoves dead code
Barret Rhoden [Tue, 24 Jun 2014 18:06:26 +0000 (11:06 -0700)]
Removes dead code

Was not building any of this, and we can add it back in later if needed.

6 years agoRefactored icmpkick6
Barret Rhoden [Tue, 24 Jun 2014 17:39:27 +0000 (10:39 -0700)]
Refactored icmpkick6

Can't test it, but this will get rid of the warnings.  No one has tested any of
the v6 functions yet.

6 years agoAssume natural alignment for IP & ether addrs
Andrew Gallatin [Mon, 23 Jun 2014 20:20:35 +0000 (13:20 -0700)]
Assume natural alignment for IP & ether addrs

Assume natural alignment for IP addresses and ethernet addresses in
the critical path.  By doing so, we can compare and copy via direct
4-byte load / store rather than either calling memcmp()/memmove(), or
doing hand-unrolled byte-by-byte operations.

This gains about 750Mb/s on a netperf TCP receive workload with a
10GbE NIC in a low-end x86_64.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agox86: Removes ioapic rerouting test
Barret Rhoden [Fri, 20 Jun 2014 19:56:59 +0000 (12:56 -0700)]
x86: Removes ioapic rerouting test

It doesn't work and just spews warnings, and no one is fixing it.  It
was originally meant to be watched by a human too.

Feel free to add a real IRQ routing test that's more than a printk in an
IRQ handler (which is what I've used in the past).

6 years agokmalloc_incref()
Barret Rhoden [Fri, 20 Jun 2014 19:52:24 +0000 (12:52 -0700)]

All kmalloc'd blobs are reference counted.  kmalloc() gives you one ref.
You can get more with kmalloc_incref().  Release them with kfree().

Note that if you krealloc, you may or may not get a new buffer.  If you
have a buffer with more than one ref, and if you realloc and get a new
buffer, the caller to krealloc gets the new buffer with refcnt == 1, and
the original buffer gets decreffed by 1.  At that point, both ref users
are pointing to different blobs with the same, but copied, contents.

6 years agoKmalloc minor cleanups
Barret Rhoden [Fri, 20 Jun 2014 19:04:21 +0000 (12:04 -0700)]
Kmalloc minor cleanups

Extracted some helpers and made the code related to the tag size more

6 years agoDon't try to reassemble IP_DF marked packets
Andrew Gallatin [Fri, 20 Jun 2014 18:44:40 +0000 (11:44 -0700)]
Don't try to reassemble IP_DF marked packets

Most modern TCP stacks mark TCP/IPv4 packets with IP_DF.
So, in addition to checking if the frags field is clear,
also check if the packet is marked as IP_DF, and bypass
reassembly if that is the case.

This improves perf by about ~150Mb/s for an rx heavy workload on a
10GbE NIC.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoAllow hardware devices to pad frames to mintu
Andrew Gallatin [Fri, 20 Jun 2014 14:25:46 +0000 (07:25 -0700)]
Allow hardware devices to pad frames to mintu

Rather than reallocating & copying frames to pad them
to 60 bytes (ethernet mintu), introduce a new feature NETF_PADMIN,
which a device can declare if it is capable of padding frames to
the min mtu.  If a device is not capable, we pad the frame just before
handing it to the device.

Reviewed-by: rminnich@gmail.com
Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoImplement transmit checksum offload.
Andrew Gallatin [Thu, 19 Jun 2014 19:29:11 +0000 (12:29 -0700)]
Implement transmit checksum offload.

The basic strategy is to put the pseudo hdr sum into the packet
at the TCP/UDP layer and assume we can do checksum offload.
Then when we know we cannot do checksum offload (ip frags,
sending on ether medium to a device which cannot offload,
or sending on a non-loopback medium), we complete the full

I have only implemented hardware checksum offload on
an out-of-tree device.

Reviewed-by: rminnich@gmail.com
Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoAdd a client script for running go programs remotely
Kevin Klues [Thu, 19 Jun 2014 00:57:33 +0000 (17:57 -0700)]
Add a client script for running go programs remotely

6 years agoAccidental comment now uncommented
Kevin Klues [Wed, 18 Jun 2014 23:44:52 +0000 (16:44 -0700)]
Accidental comment now uncommented

6 years agoOnly go into 9ns branch for certaion error codes
Kevin Klues [Wed, 18 Jun 2014 23:22:13 +0000 (16:22 -0700)]
Only go into 9ns branch for certaion error codes

Things like mkdir and were failing in busybox because the error codes
they were receiving were incorrect.  This fix should address that.

6 years agoFixes rm -r (XCC)
Barret Rhoden [Wed, 18 Jun 2014 18:50:49 +0000 (11:50 -0700)]
Fixes rm -r (XCC)

The root of the issue is the use of successive readdirs concurrent with
modifications of the underlying directory.  Coreutils's rm handles this
(via the fts_ family of functions) by reading in the entire directory
before removing.  So I'll stick with the current behavoir: if you do
that, unexpected things will happen, and just have busybox rewind after
each rm.

You'll need to rebuild glibc, after copying over the new file.

You'll also need to rebuild busybox, after applying the patch.

6 years agolisten1 cleans up its children
Barret Rhoden [Tue, 17 Jun 2014 23:44:04 +0000 (16:44 -0700)]
listen1 cleans up its children

6 years agox86: fixes lock debug issues with the new core_id
Barret Rhoden [Tue, 17 Jun 2014 22:34:51 +0000 (15:34 -0700)]
x86: fixes lock debug issues with the new core_id

When spinlock debugging, we would do a core_id_early call and get gibberish
back.  This was because core_id_ready was set (it was being set once the LAPIC
was available, and not when the segmentation stuff was available).  Instead,
we'd get a garbage address and fault enough to reboot the machine.

The fix is to not start using core_id too early.

In doing so, we also expose an issue with the lock debugger being used.  The
older LAPIC styles were ready earlier than smp_boot (in vm_init()).  Now,
core_id isn't ready til the smp boot is mostly done.  In the meantime, the
non-zero cores will think they are core 0, which means all of them share a
pcpui->lock_depth.  Those cores are running concurrently, and the
pcpui->lock_depth isn't protected in any way.  Eventually, we'd screw up the
lock depth.  The fix there is to just not debug locks for a little while.

6 years agoFixes warning in pthread.c
Barret Rhoden [Tue, 17 Jun 2014 21:07:08 +0000 (14:07 -0700)]
Fixes warning in pthread.c

Reworks the code slightly to just cast to a uthread right away, instead of
casting or otherwise mucking around each time it is used.

6 years agoadd the listen1 command.
Ronald G. Minnich [Tue, 17 Jun 2014 22:22:21 +0000 (15:22 -0700)]
add the listen1 command.

To use this command, e.g.
listen1 tcp!*!23 /bin/ash

Listens on port 23. The best thing we've found to talk to
it is netcat.

To make it available to localhost at 5555
qemu ... \
-net user,hostfwd=tcp::5555-:23 \

to talk to it:
netcat localhost 5555

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoTurn noisy vfs debugging code into printds
Kevin Klues [Thu, 12 Jun 2014 23:56:34 +0000 (16:56 -0700)]
Turn noisy vfs debugging code into printds

6 years agoBreak out of open without checking 9ns if EEXIST
Kevin Klues [Thu, 12 Jun 2014 19:38:16 +0000 (12:38 -0700)]
Break out of open without checking 9ns if EEXIST

6 years agoConfig option for kernel stack size (XCC)
Barret Rhoden [Thu, 12 Jun 2014 19:02:02 +0000 (12:02 -0700)]
Config option for kernel stack size (XCC)

Use the big stacks if you want to play it safe (the default).  I'm using
the small stacks.  If you do use the small stacks, if you have weird
crashes or panics, try toggling this setting.

Technically, this changes a kernel header, though userspace wasn't using
the KSTACK #defines, so don't worry about it.

6 years agoSlimmer setjmps
Barret Rhoden [Thu, 12 Jun 2014 17:41:43 +0000 (10:41 -0700)]
Slimmer setjmps

AFAIK, the returns_twice tells the compiler to not expect any
caller-saved registers to still be valid.  The handmade asm clobber
tells the compiler not to trust any callee-saved registers either.  The
compiler might be allowed to save and restore the registers across that
asm volatile, but it doesn't seem to do so.

The clobbering of the callee-saved registers was necessary; despite the
language of the returns_twice attribute, which does not make a
distinction between caller-saved and callee-saved.

In addition to faster waserrors, this leads to smaller errbufs, which
leads to kthreads using less stack space.  Ultimately, we'll be able to
go back to single-page kthread stacks.

6 years agox86: even faster core_id()s with segmentation
Barret Rhoden [Thu, 12 Jun 2014 04:32:46 +0000 (21:32 -0700)]
x86: even faster core_id()s with segmentation

The old slow core_id reads, using the LAPIC and the os_coreid() lookup
took about 50 TSC ticks per core_id() call (avg time in a for loop of
100000 calls).

The rdtscp option (the old FAST_COREID) was about 30 ticks.

The segmentation lookup is 1 tick.

rdtscp still has the pcoreid in ecx, so that userspace can use it.

6 years agoCheck the uthread flags for trigger_posix_signal
Barret Rhoden [Tue, 10 Jun 2014 21:25:25 +0000 (14:25 -0700)]
Check the uthread flags for trigger_posix_signal

I think there are some circumstances where current will be set, but the context
is still saved (in the uthread) instead of in the VCPD.

6 years agoDon't panic on invalid syscall numbers
Barret Rhoden [Tue, 10 Jun 2014 21:00:47 +0000 (14:00 -0700)]
Don't panic on invalid syscall numbers

It's a user bug, not a kernel bug.  We print out some helpful things to debug
userspace too.