akaros.git
5 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>
5 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>
5 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>
5 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>
5 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>
5 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>
5 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

5 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.

5 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).

5 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.

5 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
"at".

5 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.

5 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().

5 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.

5 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
parsing.

5 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.

5 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
assert.

5 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.

5 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.

5 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,

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

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 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>
5 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.

5 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.

5 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.

5 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.

5 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.

5 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.

5 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>
5 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>
5 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>
5 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.

5 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.

5 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.

5 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().

5 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.

5 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.

5 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>
5 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>
5 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
extra_data.

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

5 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).

5 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>
5 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>
5 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

5 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>
5 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.

5 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.

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

To avoid massinve warning spam.

5 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.

5 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.

5 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!

5 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.

5 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 \
  XCC_ROOT/install-x86_64-ros-gcc/x86_64-ros/sys-include/ros/procinfo.h

5 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

5 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.

5 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.

5 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.

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

5 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.

5 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.

5 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>
5 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).

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

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.

5 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
flexible.

5 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>
5 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>
5 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
checksum.

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>
5 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

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

5 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.

5 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.

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

5 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.

5 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.

5 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>
5 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

5 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

5 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.

5 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.

5 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.

5 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.

5 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.

5 years agoFixes network stats printf strings
Barret Rhoden [Tue, 10 Jun 2014 19:09:24 +0000 (12:09 -0700)]
Fixes network stats printf strings

All of these protocols are using u32s for their stats and other stuff.  The
format strings were looking for longs instead of ints.  This fixes them to use ints.

Alternatively, we could change the stats fields to u64.  I'm indifferent.

I didn't both changing any of the protocols that we don't use or even compile.

5 years agoFix printing of udp stats
Ronald G. Minnich [Tue, 10 Jun 2014 18:42:24 +0000 (11:42 -0700)]
Fix printing of udp stats

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoFixes compile bug with TRACE_LOCKS
Barret Rhoden [Tue, 10 Jun 2014 17:49:53 +0000 (10:49 -0700)]
Fixes compile bug with TRACE_LOCKS

Bug added by dd7d3f0, when the irq_state variable was moved into an 'if' block.

5 years agoFix up alarm and pvcalarm tests
Kevin Klues [Tue, 10 Jun 2014 16:33:45 +0000 (09:33 -0700)]
Fix up alarm and pvcalarm tests

It appears that qeum doesn't properly virtualize the tsc accross vcores,
so calling read_tsc() in a situation where our vcores are actually
multiplexed on top of a single underlying linux task results in
incorrect values. The assertions in these tests have been changed to
make sure that AT LEAST the amount of time we expect has passed in real
time, rather than relying on the time counted per vcore.

5 years agocleanup: remove redundant includes left over from script.
Ronald G. Minnich [Mon, 9 Jun 2014 15:08:27 +0000 (08:08 -0700)]
cleanup: remove redundant includes left over from script.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoSpeed up ptclbsum
Andrew Gallatin [Fri, 6 Jun 2014 22:44:58 +0000 (15:44 -0700)]
Speed up ptclbsum

Bring in the 64-bit checksum routine that originated in
NetBSD/alpha, and then came into FreeBSD/alpha and was used for
many of its 64-bit platforms including amd64.  This speeds
up non-checksum offload paths (like UDP transmit) by about 5%.

5 years agoSpeed up memmove on x86
Andrew Gallatin [Fri, 6 Jun 2014 21:56:11 +0000 (14:56 -0700)]
Speed up memmove on x86

Take an asm bcopy (which has the same overlapping semantics
as memmove) from FreeBSD.  This speeds up netperf by anywhere
from 25-40% on x86_64

Note:  I also brought in a copy for i686, but i686 does not
compile due to other prolems in the tree, so I was unable to test it.

5 years agoDon't zero new blocks.
Andrew Gallatin [Fri, 6 Jun 2014 18:43:57 +0000 (11:43 -0700)]
Don't zero new blocks.

Avoid zeroing new blocks.  This has a real cost at 10GbE speeds

Signed-off-by: Andrew Gallatin <gallatin@google.com>
5 years agoIncrease the UDP buffer size.
Andrew Gallatin [Fri, 6 Jun 2014 18:42:24 +0000 (11:42 -0700)]
Increase the UDP buffer size.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
5 years agoEnable UDP checksum offload.
Andrew Gallatin [Fri, 6 Jun 2014 18:37:07 +0000 (11:37 -0700)]
Enable UDP checksum offload.

Enable UDP csum offload for IPv4.  This is good for a few
hundred Mb/s performance improvement for netperf -tUDP_STREAM
tests using a 10GbE NIC.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
5 years agoUse larger queue sizes for faster NICs
Andrew Gallatin [Fri, 6 Jun 2014 18:31:06 +0000 (11:31 -0700)]
Use larger queue sizes for faster NICs

Use larger queue sizes for 1GbE and 10GbE interfaces.  This fixes
soft overflow drops on a 10GbE interface I've been using.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
5 years agoProperly set the siginfo errno on SIGSEGV
Kevin Klues [Sat, 7 Jun 2014 19:45:00 +0000 (12:45 -0700)]
Properly set the siginfo errno on SIGSEGV

Also explciitly set the signal number (though this will be set
underneath anyway).

5 years agoDon't wait on stdin if read count 0
Kevin Klues [Sat, 7 Jun 2014 06:19:38 +0000 (23:19 -0700)]
Don't wait on stdin if read count 0

5 years agoAlso send SIGSEGV on EACCES fault
Kevin Klues [Sat, 7 Jun 2014 05:19:59 +0000 (22:19 -0700)]
Also send SIGSEGV on EACCES fault

5 years agoSignal with different u_ctx if current_uthread set
Kevin Klues [Sat, 7 Jun 2014 02:49:19 +0000 (19:49 -0700)]
Signal with different u_ctx if current_uthread set

When current uthread is set, we should not use the ctx attached to the
uthread, but rather the one stored in the vcpd.

5 years agoFixes alarm pcpu printing
Barret Rhoden [Thu, 5 Jun 2014 22:43:45 +0000 (15:43 -0700)]
Fixes alarm pcpu printing

The old alarm code (from last week) had the sem and the func in separate
memory; now they are a union.  We were printing the func as if it was a
sem.

This change is also more useful, since we can see what the function
handler is (e.g. __ksched_tick) for non-semaphore based alarms.

5 years agoAllow printing when the kernel faults
Barret Rhoden [Thu, 5 Jun 2014 22:42:11 +0000 (15:42 -0700)]
Allow printing when the kernel faults

On occasion, printk faults due to other bugs.  It does so when holding
the output_lock, and then the fault handler deadlocks since it can't
print anything.

This just disables print locking when the kernel is in a trap context,
which almost always is a bug that we want to hear about.

5 years agoSCP syscalls can be aborted
Barret Rhoden [Thu, 5 Jun 2014 22:20:41 +0000 (15:20 -0700)]
SCP syscalls can be aborted

Thanks to Drew for this patch.

5 years agoBSD sockets UDP uses 'headers' for all packets
Barret Rhoden [Thu, 5 Jun 2014 20:40:36 +0000 (13:40 -0700)]
BSD sockets UDP uses 'headers' for all packets

BSD sockets wants to do both:
socket, bind, {sendto,recvfrom}
and
socket, bind, connect, {send,recv}

'headers' mode allows us to blindly sendto and recvfrom.  The last
chance we have to set this is in bind (though it makes more sense to do
so in socket).

We can only announce or connect once.  To be able to receive, we need to
have announced by the end of bind so that our entry is in the hash
table before the application knows which local port we're on.  So we'll
never be able to connect after doing a bind.

Connect still sets the sockets raddr (in the Rock), so all of our
send/recv calls will just go through sendto/recvfrom, and extract the
raddr from the Rock and put it in the 'headers'.

We could consider having calls to connect() clear the headers, and then
connect as normal, but that would require the kernel to let us change
from announced to connected.  I'm not willing to do that yet.

Also, this way, we can connect multiple times, changing the default
remote end, which is what you're supposed to be able to do.  You can't
send multiple connect messages to the kernel.

Note that the Rock code is not threadsafe, and that every send/recv
needs to extract the rock, which is O(number of rocks/fds).