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.

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

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

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

6 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>
6 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%.

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

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

6 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

6 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

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

6 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

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

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

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

6 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}
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).

6 years agoBSD sockets fix-up
Barret Rhoden [Wed, 4 Jun 2014 22:59:22 +0000 (15:59 -0700)]
BSD sockets fix-up

Removes the listenproc stuff and just does the plan9-listen directly.

Also adds a listener to test basic listening for both plan9 and BSD.
You'll need to manually edit and compile it to use the BSD code.  Check
out the top of the file for more info.

6 years agoAdd SIGPROF based pvcalarms to pthreads
Kevin Klues [Wed, 4 Jun 2014 19:44:49 +0000 (12:44 -0700)]
Add SIGPROF based pvcalarms to pthreads

Also added a utest to test this stuff.

6 years agoHandle pending signals even when resuming current_uthread
Kevin Klues [Wed, 4 Jun 2014 19:43:21 +0000 (12:43 -0700)]
Handle pending signals even when resuming current_uthread

6 years agoUpdate pvcalarm test
Kevin Klues [Wed, 4 Jun 2014 19:38:30 +0000 (12:38 -0700)]
Update pvcalarm test

Use pthread_lib_init() instead of uthread_lib_init(), which requires us
to set pthread_can_adjust_vcores to false.  Also, need to initalize
counts to 0, otherwise we miscount and break the timing loop early.

6 years agoFixes ksched's alarm handler
Barret Rhoden [Tue, 3 Jun 2014 23:37:43 +0000 (16:37 -0700)]
Fixes ksched's alarm handler

Was sending another RKM, even though the old __kalarm itself was an RKM.  No
reason to do that other than laziness.

6 years agoKprof uses an IRQ alarm
Barret Rhoden [Tue, 3 Jun 2014 23:36:54 +0000 (16:36 -0700)]
Kprof uses an IRQ alarm

Oprof is still hacked into the timer IRQ.  Will get to that soon.

6 years agoKernel alarms can run in IRQ or RKM context
Barret Rhoden [Tue, 3 Jun 2014 22:35:02 +0000 (15:35 -0700)]
Kernel alarms can run in IRQ or RKM context

Some alarms want to run in IRQ context, and some want to run as RKMs.  We can
only have one tchain, which manages the timer IRQ, and the tchain is the tool
to manage that, regardless of IRQ vs. RKM context.

Alarm handlers that run in IRQ context will have access to the HW TF.

Check out fbee73f5ee for when we switched it from IRQ -> RKM in the first
place.  There are a few alarms that want to be RKMs, due to locking issues.
You can't send_event() from IRQ context, for instance...

6 years agoRemoves extra CASs in the PVC alarm
Barret Rhoden [Tue, 3 Jun 2014 21:27:47 +0000 (14:27 -0700)]
Removes extra CASs in the PVC alarm

Just need a read (with appropriate ordering).

6 years agoRemoves the alarm_dispatcher
Barret Rhoden [Tue, 3 Jun 2014 21:06:27 +0000 (14:06 -0700)]
Removes the alarm_dispatcher

Can just register multiple handlers: one for the global alarm service and
another for the per-vc alarm.

In the future, we'll probably get the full kernel alarm tchain code in
userspace, and each of the #A alarms (global, pvc) will be a separate tchain.

6 years agoFixes preempt/indir tracing in lock_test
Barret Rhoden [Tue, 3 Jun 2014 20:33:35 +0000 (13:33 -0700)]
Fixes preempt/indir tracing in lock_test

Much nicer than overriding the lock handler, and we don't need to expose the vc
and indir handlers anymore.

6 years agoEvent handling can have multiple handlers
Barret Rhoden [Tue, 3 Jun 2014 20:23:12 +0000 (13:23 -0700)]
Event handling can have multiple handlers

Events have a type (integer), like IRQs.  We can now have multiple handlers per
event type, all of which are executed for each event.

6 years agoINDIR event handler registered dynamically
Barret Rhoden [Tue, 3 Jun 2014 01:23:02 +0000 (18:23 -0700)]
INDIR event handler registered dynamically

All processes need this registered.  This one used to be done
statically, but that'll be a little painful when we use registration

So long as this is done before any INDIR events are sent, we're fine.
(This is the case here).

6 years agoAll user events take a void *data
Barret Rhoden [Tue, 3 Jun 2014 01:11:18 +0000 (18:11 -0700)]
All user events take a void *data

For upcoming event handler registration.

6 years agoBenchutil needs to depend on parlib
Barret Rhoden [Tue, 3 Jun 2014 01:00:15 +0000 (18:00 -0700)]
Benchutil needs to depend on parlib

6 years agoRemove the need for a poke_pvcalarm function
Kevin Klues [Tue, 3 Jun 2014 01:39:20 +0000 (18:39 -0700)]
Remove the need for a poke_pvcalarm function

We wanted a way to avoid having to add the poke function to every
vcore_entry() so that they could take care of initializing their own
pvcalarm upon the first time they come up, and then starting it on
subsequent times if it happened to be disabled.  To do this we now just
preemptively initialize max_vcore() number of alarms (one for each
vcore) and start them / stop them upon enable/disable of the service.

Removes alot of complexity for very little extra overhead -- especially
on machines with a small number of max_vcores().