akaros.git
5 years agoHelper for syscalls getting pid2proc
Barret Rhoden [Tue, 26 Aug 2014 21:56:29 +0000 (14:56 -0700)]
Helper for syscalls getting pid2proc

Given a pid, I often want to get a proc only if p controls it.  Some uses for
pid2proc, like in wait and poke, want to do their own thing.

5 years agoRevert "Add support for the childfdmap for Go"
Kevin Klues [Tue, 26 Aug 2014 20:01:39 +0000 (13:01 -0700)]
Revert "Add support for the childfdmap for Go"

This reverts commit 1f6c9b6de45e868d0dffd3415825273dac459695.

5 years agoAdd support for the childfdmap for Go
Ronald G. Minnich [Mon, 25 Aug 2014 17:51:20 +0000 (17:51 +0000)]
Add support for the childfdmap for Go

Sorry for this mess, but I'm hoping someone can fix the include mess.
We need a gerrit or something where we can post draft patches.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
5 years agoVFS O_APPEND
Barret Rhoden [Sun, 24 Aug 2014 17:39:57 +0000 (10:39 -0700)]
VFS O_APPEND

Might actually be race-free!

5 years ago__pthread_handle_pending_posix_signals() changes
Kevin Klues [Sat, 23 Aug 2014 21:00:16 +0000 (14:00 -0700)]
__pthread_handle_pending_posix_signals() changes

Don't call run_uthread() directly iniside
__pthread_handle_pending_posix_signals().  Actually don't even call this
function 'handle_pending_posix_signals' at all.  Instead call it
'prep_for_pending_posix_signal', and just prep the pthread so it will be
restarted inside its signal handler context next time it is run.
It's semantically identical to what we had before, but it's a better
abstraction since (in the future) we may wish to do something between
this prep and actually restarting the thread.

The previous implementation also forced us to always restore the signal
handler context from pthread->uthread.u_ctx (even if the pthread's
saved context was currently sitting in the vcpd uthread_ctx slot).
This implementation now updates the pthread's current context in place,
allowing it to be restarted the same way whether there were pending
posix signals or not.

5 years agoPosix signals in uthread context not vcore context
Kevin Klues [Fri, 22 Aug 2014 18:12:45 +0000 (11:12 -0700)]
Posix signals in uthread context not vcore context

This patch set makes is so that posix signals are run from uthread
context instead of vcore context when triggered from the pthread
library.

Whenever a pthread has a signal pending and it is about to be restarted,
a temprary signal context and stack is swapped in to run the signal
handlers for those pending signals, and the pthread is restored into
that context.  When the signal handlers have compelted, the original
context and stack are restored, and the pthread is rsumed.

A new 'sigdata' struct has been introduced to encapsulate the data
structures necessary to handle all this swapping back and forth.  These
'sigdata' structs are served as part of the parlib signal library, and
reused across different pthreads whenever they have a signal handler to
run. The rest of the changes live entirely in the pthread library,
though we may be able to move parts of it out to parlib once we
generalize it a bit more.

5 years agoAdd implementation of wait-free unordered list.
Kevin Klues [Fri, 22 Aug 2014 18:02:58 +0000 (11:02 -0700)]
Add implementation of wait-free unordered list.

The list is ever-increasing in size, in that once space is created to
accomodate an item in the list, that space is never freed until the
entire list is destroyed. Items are inserted in the list such that
ordering on removal is not guaranteed.

This structure is useful in situations when you want to maintain a
small pool of objects that are shared amongst a larger set of
objects, but only get used for a short period of time (e.g. futext
element structs, sigdata structs, etc.).

5 years agoVFS truncate
Barret Rhoden [Thu, 21 Aug 2014 17:53:44 +0000 (10:53 -0700)]
VFS truncate

Also flushes the PM on O_TRUNC and touches up some sync on the file
size, since it just needed a spinlock.  Too bad the VFS was built before
we had semaphores, though it probably still would be rather racy.

Note that KFS won't write pages back, so any modifications to a file
won't exist outside of the page cache.  This isn't particularly related
to truncates extending a file, since the same thing happens with
write().

5 years agoVFS rename
Barret Rhoden [Wed, 20 Aug 2014 18:22:31 +0000 (11:22 -0700)]
VFS rename

Works, but it's ridiculously racy, as is most all of the VFS.  If you
have renames concurrent with other renames or much of anything, you
could bust the dentry tree or who knows what else.

The VFS (and anything that does a similar task, like a 9ns device) needs
a serious overhaul for both concurrency protection and scalability.

I also don't bother checking if new_path contains old_path.  A check
would help, but we're still in "serious redesign" territory.  Check out
my comments for more info.

That being said, you can mv files and directories around with busybox.

I didn't use testrename much, mv worked quite well.  But I'll leave it
around for now for debugging with 9ns (which needs work).  Also, glibc's
rename work, and there is no need for a separate rename() for the test
program.  Calling the syscall directly means you had an old glibc
(either not compiled right, or not loaded in KFS).

5 years agox86: avoids bad frame pointers in backtrace
Barret Rhoden [Wed, 20 Aug 2014 02:06:56 +0000 (19:06 -0700)]
x86: avoids bad frame pointers in backtrace

Backtrace will stop backtracing if it hits a non-canonical, non-kernel address.
It'll still record the PC, so we can see some evidence of the corruption.

Thanks to Drew for pointing this out and providing a fix.

5 years agoFixes some 32 bit usages of NOW
Barret Rhoden [Tue, 19 Aug 2014 22:53:34 +0000 (15:53 -0700)]
Fixes some 32 bit usages of NOW

I looked for any place storing NOW in a 32 bit int, but I might have missed a
few or otherwise broke things.

5 years agoSYS_dup_fds_to (XCC)
Barret Rhoden [Tue, 19 Aug 2014 22:14:16 +0000 (15:14 -0700)]
SYS_dup_fds_to (XCC)

Finishes Ron's sys_mapchildfds.

Reinstall your kernel headers.

5 years agoFixes insert_file()
Barret Rhoden [Tue, 19 Aug 2014 22:13:11 +0000 (15:13 -0700)]
Fixes insert_file()

__claim_fd() returns a status, not a value.

5 years agoFixes buggy assert in __claim_fd()
Barret Rhoden [Tue, 19 Aug 2014 17:42:15 +0000 (10:42 -0700)]
Fixes buggy assert in __claim_fd()

Was checking FD 0, instead of the FD we claimed.

5 years agoAllow a parent to set up a child's fd's via a new system call
Ronald G. Minnich [Tue, 19 Aug 2014 17:15:29 +0000 (17:15 +0000)]
Allow a parent to set up a child's fd's via a new system call

Needed for Go. The parent sets up an array of
childfdmap
structs, with parent and childfds, then calls system call 65536,
which we might want to consider naming ;-)

Not working.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
5 years agoKFS allows seeks beyond the file size
Barret Rhoden [Thu, 14 Aug 2014 16:46:25 +0000 (09:46 -0700)]
KFS allows seeks beyond the file size

It looks like the VFS writes, page cache, and KFS readpage() can all handle the
offset being higher than the file size, and it should create a hole.

5 years agoNo longer require LD_LIBRARY_PATH to be set (XCC)
Kevin Klues [Thu, 14 Aug 2014 03:51:50 +0000 (20:51 -0700)]
No longer require LD_LIBRARY_PATH to be set (XCC)

Previously we had to have LD_LIBRARY_PATH =/lib set in the environment
for all binaries to be able to find their shared libraries.  This was
because we had the wrong set of default paths specified in our ld.so
dynamic loader library.  This patch fixes that.

I had to manually set the variable "default-rpath" in
glibc-2.14.1/Makeconfig to make this work.  By default this value is set
to the lib path in our cross compiler (i.e.
x86_64-ros-gcc/x86_64-ros/lib/).  This default path is sufficient if you
only ever use the resulting ld.so file on the host machine.  The problem
is, we manually copy this file over to run natively on akaros, and at
this point, the default-rpath that got set is bogus.  There's really no
way around it, but to manually set it because of the weird way we are
moving this library around.

Anyway, we no longer have to have an LD_LIBRARY_PATH set for every
executable, ld.so knows to look in /lib by default.

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

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

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

5 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

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

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

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

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

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.

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

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

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

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

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

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

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