akaros.git
17 months agopm: Implement pm_remove_or_zero_pages()
Barret Rhoden [Thu, 29 Mar 2018 15:35:15 +0000 (11:35 -0400)]
pm: Implement pm_remove_or_zero_pages()

This is what truncate/hole-punch really wants - best effort, and zero if
all else fails.  pm_remove_contig() tries to do too much, and doesn't
handle the failure cases.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agopm: Implement pm_destroy()
Barret Rhoden [Thu, 29 Mar 2018 15:33:57 +0000 (11:33 -0400)]
pm: Implement pm_destroy()

We had been just leaking memory.  Though it is hard to see this, since all
of the pages are actually just sitting in slab magazines, and not freed all
the way back to the arenas.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agoradix: Implement radix_tree_destroy()
Barret Rhoden [Wed, 28 Mar 2018 20:33:38 +0000 (16:33 -0400)]
radix: Implement radix_tree_destroy()

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agoradix: Add for_each iterators
Barret Rhoden [Wed, 28 Mar 2018 20:32:36 +0000 (16:32 -0400)]
radix: Add for_each iterators

These will help with implementing various page cache helpers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Allow racy truncations
Barret Rhoden [Tue, 27 Mar 2018 22:27:28 +0000 (18:27 -0400)]
9ns: Allow racy truncations

I'm relaxing the consistency guarantees during truncate/hole_punches.  If
you do concurrent reads, writes, or mmaps during truncate, you might get
weird data: old, new, or a combination of the two.

My primary desire for this is to avoid qlocking the file during what could
be parallel operations: reading or writing to non-overlapping parts of a
file.

Part of this is that the qlock is not held during pm_load_page, especially
for mmap faults.  In an alternate version of this code, pm_load_page held
the qlock, the PM op didn't need to grab the lock, and every mmap hard
fault (i.e. not the nowait, the one with pm_load_page that blocks) would
qlock.  Soft faults (the read fast-path) wouldn't qlock.

I'm not 100% on this, so I haven't squashed this into the original FS file
work.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agomm: Mark dirty pages when we munmap
Barret Rhoden [Mon, 26 Mar 2018 16:06:44 +0000 (12:06 -0400)]
mm: Mark dirty pages when we munmap

The page cache will need to know which pages are dirty.  I might
overhaul the PM code, but regardless this is a bug and needs to be done
- one way or another.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Add LRU support to tree filesystems
Barret Rhoden [Mon, 26 Mar 2018 14:11:51 +0000 (10:11 -0400)]
9ns: Add LRU support to tree filesystems

Any non-RAMFS will want some form of access to the LRU list.  These
devices will use tree files as caches, referred to as the frontend.  The
"real" filesystem will be elsewhere: typically on a 9p server, though a
disk FS would work as well.

Since the tree_file tree is a cache, both the TFs and the page cache for
the files, devices may want to shed their caches when memory becomes
tight.

Similarly, devices may want to perform their own work on the LRU list.
For instance, the #gtfs device, which fronts #mnt, will want to
periodically prune its open FIDs to the backend 9p server.  Stay tuned.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Make QTFILE == 0. Goddamn 9p
Barret Rhoden [Tue, 20 Mar 2018 19:55:00 +0000 (15:55 -0400)]
9ns: Make QTFILE == 0.  Goddamn 9p

This is annoying, but translating qids back and forth just for one bit
isn't worth the bugs.

Zero wouldn't be as bad if there were a bunch of *values* for qid.type, so
that we're just doing == checks or switches  (still, don't use zero).  But
it's bits!  The worst possible decision.

This is OK, and you see it everywhere:

c->qid.type & QTDIR

this isn't, since QTFILE has the value 0:

c->qid.type & QTFILE

This is the same shit with O_READ modes.

Goddamn.

Told-off-by: Barret Rhoden <brho@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agoexec: Clear owning proc earlier
Barret Rhoden [Tue, 20 Mar 2018 19:47:13 +0000 (15:47 -0400)]
exec: Clear owning proc earlier

We're supposed to clear as soon as we could block, but foc_open() can block
(as the comment says).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Add the cache option (-C) to mount
Barret Rhoden [Fri, 16 Mar 2018 20:02:47 +0000 (16:02 -0400)]
9ns: Add the cache option (-C) to mount

That needs cleaned up a bit, including exporting the mount flags in the
kernel interface.  Same probably goes for bind.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Remove the old mnt cache
Barret Rhoden [Fri, 16 Mar 2018 19:59:19 +0000 (15:59 -0400)]
9ns: Remove the old mnt cache

Plan 9 had a write-through, data only cache.  It would speed up reads,
and it assumed no one else was writing to the server, which is fine.
Since it was write-through, it never needed to sync to the backend.

The tree_file version of #mnt will use the TFS for its caching, so we
don't need the older caching layer - which actually didn't do anything
on Akaros.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Clean up the dir->mode bits
Barret Rhoden [Thu, 15 Mar 2018 15:32:16 +0000 (11:32 -0400)]
9ns: Clean up the dir->mode bits

The lower 9 bits are the classic rwxrwxrwx bits.  The upper bits contain
things like "is a directory."

'mode' is a bit confusing, especially if you are familiar with the
POSIX/glibc world.  dir->mode is the permissions, which we get from the
'perm' argument to create (i.e. SYS_openat with O_CREATE).  That is
different from the 'mode' argument to open(), which is the e.g. O_RDWR
flags for the *chan* (file in Unix) - not the filesystem file (inode in
Unix).

Good times.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agostrace: Report errno and errstr on failure
Barret Rhoden [Wed, 14 Mar 2018 19:40:44 +0000 (15:40 -0400)]
strace: Report errno and errstr on failure

I got tired of looking at straces, knowing there was an error, and
wondering what the errno/errstrs were.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Support rename
Barret Rhoden [Wed, 14 Mar 2018 17:27:37 +0000 (13:27 -0400)]
9ns: Support rename

Devices without a rename operation just get an EXDEV.  Usually userspace
can handle that (e.g. busybox's mv).

I added rename to the struct dev ops since it should be a 9p operation,
allowing renames across directories.  9p wstat does allow an
intra-directory rename, but that's not really what you want.  By giving
the device the old chan, the parent chan, and the name, it can
atomically perform the rename.  Atomicity is a critical part of rename.

Previously, we tried mucking around with rename and wstat, and it was
missing some of the namec-magic associated with Acreate (findmounts and
other stuff).  The device wasn't given the parent chan - it had to find
that on its own, and I was worried that there were some TOCTTOU races if
we just gave it the path.

Additionally, the device may need to do various "version" checks, which
can be done in a dev.rename op, but are harder to do generically.  See
tmpfs for an example.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Add #tmpfs
Barret Rhoden [Tue, 13 Mar 2018 21:43:16 +0000 (17:43 -0400)]
9ns: Add #tmpfs

The tmpfs device can have many instances, each of which are separate
filesystem trees.  When you close the last chan into the instance,
whether that was by unmounting it or by closing an open FD, it will
destroy itself.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agopm: Track the fs_file instead of the inode/blockdev
Barret Rhoden [Tue, 20 Mar 2018 19:53:11 +0000 (15:53 -0400)]
pm: Track the fs_file instead of the inode/blockdev

This is somewhat left over from the VFS removal.  The 9ns devices (ramfs)
were just zeroing memory, so they didn't care.  But we'll eventually need
the actual fs_file.

The PM code needs a much bigger overhaul, but this is the minimum to get
things working.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agokfs: Remove a few old debugging files
Barret Rhoden [Mon, 12 Mar 2018 17:52:41 +0000 (13:52 -0400)]
kfs: Remove a few old debugging files

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Remove vfs.h
Barret Rhoden [Mon, 12 Mar 2018 17:49:15 +0000 (13:49 -0400)]
vfs: Remove vfs.h

e.g. this, plus a few missing #includes.

find kern/ -name '*.c' -exec sed -i '/#include <vfs.h>/d' '{}' \;

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Move FD management code to 9ns
Barret Rhoden [Mon, 12 Mar 2018 17:56:37 +0000 (13:56 -0400)]
vfs: Move FD management code to 9ns

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Remove the last references to struct file *
Barret Rhoden [Thu, 8 Mar 2018 02:06:17 +0000 (18:06 -0800)]
vfs: Remove the last references to struct file *

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Remove the guts of the VFS
Barret Rhoden [Thu, 8 Mar 2018 01:32:01 +0000 (17:32 -0800)]
vfs: Remove the guts of the VFS

Left the FD stuff around.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Remove misc tests
Barret Rhoden [Mon, 12 Mar 2018 00:48:40 +0000 (20:48 -0400)]
vfs: Remove misc tests

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Remove monitor functions
Barret Rhoden [Wed, 7 Mar 2018 22:00:20 +0000 (14:00 -0800)]
vfs: Remove monitor functions

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Remove KFS, blockdev and devfs
Barret Rhoden [Wed, 7 Mar 2018 21:57:24 +0000 (13:57 -0800)]
vfs: Remove KFS, blockdev and devfs

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Remove fs_env from struct proc
Barret Rhoden [Wed, 7 Mar 2018 21:26:18 +0000 (13:26 -0800)]
vfs: Remove fs_env from struct proc

Part of removing the VFS.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Remove ext2 support
Barret Rhoden [Wed, 7 Mar 2018 21:04:04 +0000 (13:04 -0800)]
vfs: Remove ext2 support

It only half worked, and only for the VFS.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agovfs: Remove syscall access to the VFS
Barret Rhoden [Wed, 7 Mar 2018 20:48:16 +0000 (12:48 -0800)]
vfs: Remove syscall access to the VFS

At this point, everything should be going through 9ns.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Add get_cwd()
Barret Rhoden [Wed, 7 Mar 2018 19:02:13 +0000 (11:02 -0800)]
9ns: Add get_cwd()

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Remove #root
Barret Rhoden [Wed, 7 Mar 2018 01:10:25 +0000 (17:10 -0800)]
9ns: Remove #root

Everything it did is done better by #kfs.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: kfs: Add root entries
Barret Rhoden [Wed, 7 Mar 2018 01:08:44 +0000 (17:08 -0800)]
9ns: kfs: Add root entries

These are directories that our init scripts expect to exist.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Add #kfs
Barret Rhoden [Wed, 7 Mar 2018 00:47:23 +0000 (16:47 -0800)]
9ns: Add #kfs

It's a tree_filesystem.  There is a single instance, and the contents
are populated from the CPIO, which is still used by the VFS's KFS.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agoExtract parse_cpio_entries() from KFS
Barret Rhoden [Tue, 6 Mar 2018 22:18:00 +0000 (14:18 -0800)]
Extract parse_cpio_entries() from KFS

Moves it from KFS to cpio.c, so we can use it in other places.  I
attempted to update it a bit, including size checks.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: allow 'current-less' operations in 9ns
Barret Rhoden [Wed, 7 Mar 2018 00:48:21 +0000 (16:48 -0800)]
9ns: allow 'current-less' operations in 9ns

This can pop up if you walk from a device init function or from any sort
of kernel function during boot, such as mon_bin_run().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Implement chdir/fchdir
Barret Rhoden [Tue, 6 Mar 2018 19:20:55 +0000 (11:20 -0800)]
9ns: Implement chdir/fchdir

You won't be able to use it easily, since the VFS will still get first
dibs on lookups.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agoAdd atomic_swap_ptr()
Barret Rhoden [Tue, 6 Mar 2018 19:12:13 +0000 (11:12 -0800)]
Add atomic_swap_ptr()

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Remove support for SYS_rename
Barret Rhoden [Thu, 1 Mar 2018 20:47:16 +0000 (15:47 -0500)]
9ns: Remove support for SYS_rename

The current approach won't work.  I think we'll need namec support for
rename.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Support SYS_rmdir
Barret Rhoden [Thu, 1 Mar 2018 20:46:35 +0000 (15:46 -0500)]
9ns: Support SYS_rmdir

Just another remove.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Support SYS_access (XCC)
Barret Rhoden [Thu, 1 Mar 2018 20:37:48 +0000 (15:37 -0500)]
9ns: Support SYS_access (XCC)

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agomm: 9ns: Add support for mmap
Barret Rhoden [Thu, 1 Mar 2018 19:29:32 +0000 (14:29 -0500)]
mm: 9ns: Add support for mmap

I'm not 100% on it, but I think the device mmap op will return an fs_file,
and once the VFS is out, we can integrate that more tightly with the mmap
code.

For instance, the assumption of the existence of the page cache can get
pushed into the fs_file and hidden behind ops, so that we can mmap
arbitrary objects.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agoSet O_EXEC when the kernel opens a file for exec
Barret Rhoden [Thu, 1 Mar 2018 18:58:43 +0000 (13:58 -0500)]
Set O_EXEC when the kernel opens a file for exec

Not a huge deal, but if we're going to have the flags, then we should use
them.  This popped up when doing permission checks on mmap on chans.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Add error_jmp(): jump with an existing error
Barret Rhoden [Thu, 1 Mar 2018 16:43:04 +0000 (11:43 -0500)]
9ns: Add error_jmp(): jump with an existing error

Some parts of the code set errno and errstr, but defer the jumping.

This is what that old dev.c code wanted to do: set the error, but not
actualy jump.  That is a common pattern in walk code: it's only an error()
for the first name in a walk.  There can be errors on later names that
don't result in a long jump, but we do want to record the errno/errstr.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Add fs_files and tree_files
Barret Rhoden [Thu, 1 Mar 2018 02:23:40 +0000 (21:23 -0500)]
9ns: Add fs_files and tree_files

fs_files are a basic structure that any 9ns device can use for a file
that contains data.  It's mostly a struct dir and a pagemap, though
future versions might not have a page mapping.  fs_files also come with
a set of operations, which will grow over time.

tree_files are fs_files that are arranged in a hierarchy consisting of
parents and children.  There are no hardlinks, but there are symlinks.
tree_files also come with a set of operations, which a device can use to
perform its role in operations such as lookups and creation.

Both fs_files and tree_files come with a collection of helper utilities,
such as fs_file_stat(), which a device can call.  The helpers handle the
various races and whatnot.

Devices do not need to use these at all, though my long term plan is to
replace all of the struct dirtabs with fs_files.  The dirtab is
basically a dir, but with the storage for the name built-in.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agopm: Add a stub for pm_destroy()
Barret Rhoden [Thu, 1 Mar 2018 19:31:38 +0000 (14:31 -0500)]
pm: Add a stub for pm_destroy()

The lack of a pm_destroy() was a little disturbing.  The PM code needs an
overhaul, which I'll get to later.  This stub is needed for the fs_file
work.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months agoAdd a garbage RCU implementation
Barret Rhoden [Thu, 1 Mar 2018 02:10:35 +0000 (21:10 -0500)]
Add a garbage RCU implementation

It's a placeholder for now while I build the tree_file code.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
17 months ago9ns: Fix devtab function pointer signatures
Barret Rhoden [Thu, 1 Mar 2018 04:07:39 +0000 (23:07 -0500)]
9ns: Fix devtab function pointer signatures

The signatures had the wrong signedness for some of the types.  It had
been an ongoing annoyance for every new device we create.  I pulled off
the bandaid.

Returning negative values for e.g. dev.read() will decrement the chan's
offset!  See rread() for details.  It's unlikely, but we shouldn't be
propagating errors like that, and the type ought to tell us what the
function should do.

Note that SYS_read returns an ssize_t.  dev.read() does not.  It should
throw for errors.

When I noticed device-internal functions with similar problems, for
instance helper functions like mntrdwr() or some of the functions in
sd.c, I fixed those too.  But this was far from exhaustive.

I did notice that pipebwrite() returns the retval from qio functions, but
ipbwrite() just returns n.  Those qio functions could return -1, maybe,
since they are ssize_t.  That needs some work still.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agomm: Allow dev.mmap() to block
Barret Rhoden [Thu, 22 Mar 2018 18:39:33 +0000 (14:39 -0400)]
mm: Allow dev.mmap() to block

This is a bit hokey.  I'd like the dev.mmap function to be able to block.
Previously, that was called while holding the vmr spinlock.  This shrinks
the time that the spinlock is held by setting up a lot of the VMR in
advance of inserting it in the list.  Thus I split the allocation from
insertion and attached the file first.

The one complication is that the PM pruner code might look at the VMR while
vm_base and vm_end are being set.  To avoid issues, I added the racy ready
bool.

All of this is screaming for a rewrite.  At the very least, we could
separate out the address allocation to be an arena.  Though any major
changes should involve reading Austin's RadixVM paper.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agomm: Clean up the functional interface
Barret Rhoden [Thu, 22 Mar 2018 16:26:20 +0000 (12:26 -0400)]
mm: Clean up the functional interface

I have a few changes to make, and there's no need for the rest of the
kernel to know about it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agomm: Call dev.mmap before checking the file
Barret Rhoden [Wed, 28 Feb 2018 22:19:37 +0000 (17:19 -0500)]
mm: Call dev.mmap before checking the file

Not all files in 9ns will be mmappable.  Check with the device first, which
will determine if you can mmap it or not and also make available the
various structures (e.g. fs_file) for the foc ops.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agomm: Use struct file_or_chan for VMR files
Barret Rhoden [Wed, 28 Feb 2018 21:52:00 +0000 (16:52 -0500)]
mm: Use struct file_or_chan for VMR files

As they say, all problems in CS can be solved with a layer of indirection.
The file_or_chan struct hides the details of whether or not we're talking
to a file or a chan.  This will ease the transition from the VFS to 9ns.

The chan stuff isn't implemented yet - that'll require a few more changes.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agomm: Ignore the FD on MAP_ANON mmaps
Barret Rhoden [Wed, 28 Feb 2018 16:46:51 +0000 (11:46 -0500)]
mm: Ignore the FD on MAP_ANON mmaps

Linux lets you do this.  Portable apps should set FD to -1 when they don't
have a file, i.e. anonymous maps, but we can be liberal in what we receive.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agomm: Fix permission checks
Barret Rhoden [Wed, 28 Feb 2018 16:43:28 +0000 (11:43 -0500)]
mm: Fix permission checks

Our checks are based on the file's open mode, not on the underlying inode
permissions.  Note that the VFS currently stores its open mode (e.g.
O_READ) as an rwx.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agomm: Stop leaking refs on mmap() errors
Barret Rhoden [Wed, 28 Feb 2018 16:42:29 +0000 (11:42 -0500)]
mm: Stop leaking refs on mmap() errors

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agomm: Fix type bug
Barret Rhoden [Wed, 7 Mar 2018 23:21:53 +0000 (15:21 -0800)]
mm: Fix type bug

That looks like it was a copy-paste bug from a long time ago.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Allow binds on symlinks
Barret Rhoden [Tue, 27 Feb 2018 23:04:00 +0000 (18:04 -0500)]
9ns: Allow binds on symlinks

We'll see if this is a good idea or not.  It does increase the cost of
following symlinks a little, though we already do a lot of findmounts for
every point.  That whole mess could get sped up with RCU.

Note: the "ntry - 1" on a WQ result doesn't check the last qid returned
from dev.walk.  The last one gets checked during domount(), which is
selectively done.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Sort out when to not follow symlinks
Barret Rhoden [Tue, 27 Feb 2018 19:13:28 +0000 (14:13 -0500)]
9ns: Sort out when to not follow symlinks

The classic example is unlink/remove: the operation targets the symlink
itself, not its target.

I figure any of the bind/mount family of calls also want to target the
symlink.  They are changing the namespace, and operate on names, regardless
of directories/files/whatever.

Note that if you try to remove a symlink with a trailing slash with our
busybox, it *won't* fail.  e.g.

$ rm some_link_to_dir/

That should fail, but busybox won't send the trailing slash.  If you
manually call unlink/remove, we'll catch it and you'll get an error.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Fix a couple namec() error cases
Barret Rhoden [Tue, 27 Feb 2018 17:35:46 +0000 (12:35 -0500)]
9ns: Fix a couple namec() error cases

Those errors were being written to the tmperrorbuf, but that wasn't being
used for anything.  Instead, you'd often get whatever other errstr was
previously set.  I'd often get ones from devdir "tell brho you saw this."
The namec error handling has always been a bit crazy, but at least now it's
a little better.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Make walk() follow symlinks
Barret Rhoden [Mon, 26 Feb 2018 21:55:29 +0000 (16:55 -0500)]
9ns: Make walk() follow symlinks

When we hit a chan that is a symlink, walk() will check it for mount
points, just like any other file.  Otherwise, we'll attempt to walk it.

Note that O_NOFOLLOW doesn't throw an error; it just means to not follow
the last step.  open() can throw an error if it wants.

Relative lookups are a little nasty.  We need the parent of the symlink,
but only the device knows the parent.  We can use walk() and dotdot to get
the parent.  The special casing can be a tricky.  When the tree_file code
is merged, you can see what tree_file_walk does.  It's basically the same
as the check that walk() makes: we can walk from a symlink, but only to
dotdot.  We should only be doing that when handling a relative walk, though
there might be a case where we can sneak by - hence the asserts.

We allow eight nested symlinks, and otherwise you can have as many symlinks
in your path as you'd like.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Use a helper struct for walk/namec options
Barret Rhoden [Mon, 26 Feb 2018 16:51:12 +0000 (11:51 -0500)]
9ns: Use a helper struct  for walk/namec options

'can_mount' is just one option from namec down through all walks.  Symlinks
will us more options and helper functions, and we'll also need a loop
counter.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Add high-level support for symlinks
Barret Rhoden [Mon, 26 Feb 2018 16:00:10 +0000 (11:00 -0500)]
9ns: Add high-level support for symlinks

This creates links with SYS_symlink and extracts the info with
SYS_readlink.  You need a 9ns device that supports symlinks, such as the
yet-unmerged KFS.  Walking through symlinks doesn't work yet.

Similar to the VFS, we have various accessor-functions for stat, such as
regular stat and lstat.  Same goes for the 'dirstat' functions.  For those
not familiar, those functions are basically "stat a path and convert to a
dir."

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Extend struct dir and the stat M bufs
Barret Rhoden [Fri, 23 Feb 2018 22:34:05 +0000 (17:34 -0500)]
9ns: Extend struct dir and the stat M bufs

These extensions are IAW 9p2000.u.  Additionally, I extend the dir even
further to have full timespecs.  Between these timespecs and the extension
string, we might be able to do everything that statx() does.

This commit changes the kernel's side of things.  The stat bufs it produces
with convD2M() can be interpretted by older 9p readers, since the initial
part of the message is the same.  We can read old or new stat buffers with
convM2D().  For instance, userspace creates wstat messages (e.g. mkdir())
in the old format still.

I replaced the guts of convM2kdirent() and convM2kstat() with convM2D(),
which greatly simplifies that area.  Those functions are for converting
from Ms to glibc-style dirents and stat structures that Akaros used before
we had Plan 9.

I also cleaned up the STATFIXLEN mess.  I found that tricky to debug and a
little unclear.  Given there are two formats now, things would get even
worse; I wasn't about to change the magic '4's to '5's.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Add 'extensions' to namec()
Barret Rhoden [Thu, 22 Feb 2018 22:32:27 +0000 (17:32 -0500)]
9ns: Add 'extensions' to namec()

We'll need this for creating symlinks.  We might be able to use this for
other things, like the crazy open extensions Ron and I talked about years
ago.  Though that might want to get a value back, instead of sending a
value.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Add 'extensions' to dev.create
Barret Rhoden [Thu, 22 Feb 2018 21:47:30 +0000 (16:47 -0500)]
9ns: Add 'extensions' to dev.create

This is based on Eric VH's 9p2000 RFC:

http://ericvh.github.io/9p-rfc/rfc9p2000.u.html

The extension string's meaning will depend on the mode/perm bits (not
omode, which is open mode).

The main user will be symlinks.  The ext string will be the path.  By
adding the path to the create message, we can atomically create a symlink
file and have its path set.  That might make namec easier.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Set eve's name to "eve"
Barret Rhoden [Thu, 1 Mar 2018 17:47:01 +0000 (12:47 -0500)]
9ns: Set eve's name to "eve"

Previously, it was "", which was annoying to debug.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agodevalarm: Use the dummy dev functions
Barret Rhoden [Thu, 22 Feb 2018 21:45:09 +0000 (16:45 -0500)]
devalarm: Use the dummy dev functions

The alarm functions do the same thing as the dev functions.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agoMove 'KFOP' helpers to umem.c
Barret Rhoden [Thu, 22 Feb 2018 21:21:57 +0000 (16:21 -0500)]
Move 'KFOP' helpers to umem.c

This is a nasty hack that lets a copying routine work for either a kernel
client or a userspace client.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months ago9ns: Add helpers for permissions checks
Barret Rhoden [Thu, 22 Feb 2018 21:19:33 +0000 (16:19 -0500)]
9ns: Add helpers for permissions checks

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agovfs: Use a fake device number for KFS
Barret Rhoden [Thu, 1 Mar 2018 16:40:27 +0000 (11:40 -0500)]
vfs: Use a fake device number for KFS

We need a number that won't conflict with any of the Plan 9 devices.
Otherwise, userspace might think a KFS file is on a Plan 9 device.

This is temporary, in that the VFS and the old KFS are going away soon.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agoAdd an unmount helper
Barret Rhoden [Wed, 7 Mar 2018 00:50:10 +0000 (16:50 -0800)]
Add an unmount helper

Should we make a symlink to it called 'umount'?

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agobusybox: Clear errstr after setting errno
Barret Rhoden [Thu, 1 Mar 2018 17:10:12 +0000 (12:10 -0500)]
busybox: Clear errstr after setting errno

Otherwise, whenever BB prints an error message, it will print an old,
confusing errstr.

This is far from exhaustive: it's just the spot I noticed it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agomlx4: Disable the user-level bypass
Barret Rhoden [Thu, 8 Mar 2018 01:19:17 +0000 (17:19 -0800)]
mlx4: Disable the user-level bypass

Pending a rewrite for 9ns.  No one has used this in years either.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agoproc: Fix buggy disowning of children
Barret Rhoden [Tue, 13 Mar 2018 23:29:07 +0000 (19:29 -0400)]
proc: Fix buggy disowning of children

Two things: it was decreffing while holding a spinlock and it was
holding the wrong spinlock.  The process's children list is protected by
the 'child_wait' lock, not the overall proc lock.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agoproc: Move decref out of __proc_disown_child()
Barret Rhoden [Tue, 13 Mar 2018 23:16:26 +0000 (19:16 -0400)]
proc: Move decref out of __proc_disown_child()

proc_decref() can potentially block.  If it's the last ref, it'll
trigger __proc_free(), which will close chans.  You can make this happen
if you cd into a #tmpfs directory, then unmount the tmpfs, and exit the
shell.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agox86: Fix PTE_ bit definitions (XCC)
Barret Rhoden [Thu, 8 Feb 2018 02:05:23 +0000 (21:05 -0500)]
x86: Fix PTE_ bit definitions (XCC)

__PTE_JPAT was wrong.  The description (bit 12) was correct, but the number
was wrong.  I changed them all to be the more easily veriable (1 << bit_nr)
style.  The comment for PTE_PAT was wrong, but the number was correct.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agox86: Add a kfunc for testing wrmsr()
Barret Rhoden [Fri, 12 Jan 2018 18:56:05 +0000 (13:56 -0500)]
x86: Add a kfunc for testing wrmsr()

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agoRemove the #defines for struct stat and dirent (XCC)
Barret Rhoden [Thu, 11 Jan 2018 19:08:03 +0000 (14:08 -0500)]
Remove the #defines for struct stat and dirent (XCC)

This was always a nasty hack.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agoAdd a couple #defines to stdint
Barret Rhoden [Wed, 28 Mar 2018 20:29:31 +0000 (16:29 -0400)]
Add a couple #defines to stdint

On occasion I want ULONG_MAX, LONG_MAX, and keep wondering if we have
SIZE_MAX.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
18 months agoslab: Catch attempted NULL frees
Barret Rhoden [Wed, 28 Mar 2018 18:27:03 +0000 (14:27 -0400)]
slab: Catch attempted NULL frees

If someone is using the slab interface, then they need to know if they have
an object or not.  This ain't like kfree().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
19 months agoFix 'include' issue
Barret Rhoden [Thu, 11 Jan 2018 17:33:08 +0000 (12:33 -0500)]
Fix 'include' issue

If you tried to use error() without including syscall.h, it would fail to
compile.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agovmm: Clean up the VM cmdline files
Barret Rhoden [Fri, 22 Dec 2017 19:13:17 +0000 (14:13 -0500)]
vmm: Clean up the VM cmdline files

A bunch of these options were leftovers from the early days of debugging.
Ideally, we want as few options as possible.  nortc and nozswap are
still necessary on recent Linux kernels.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agovmm: Add a vmcall for tracing the TF (XCC)
Barret Rhoden [Fri, 22 Dec 2017 18:18:03 +0000 (13:18 -0500)]
vmm: Add a vmcall for tracing the TF (XCC)

This vmcall will print the current context, minus r11.  It was useful in
debugging a brutal bug.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agovmm: Handle mov with zero-extend
Barret Rhoden [Fri, 22 Dec 2017 17:06:24 +0000 (12:06 -0500)]
vmm: Handle mov with zero-extend

I noticed that if you dropped the apic=debug command line argument to the
guest, then they would crash.

The root cause was our EPT handler, which emulates access to the low 4K of
physical memory, wasn't handling movzwl correctly.  We were not
zero-extending.  That led to junk in registers that the compiler didn't
expect.  And that led Linux to get a false positive for get_bios_ebda(),
which lead to dereferencing garbage.

The apic=debug turned on a printk, which was enough to change the registers
so that the junk was not present.  Similarly, some basic tracing that moved
registers or changed "don't care" values before the call to get_bios_ebda()
was enough to make the code work.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agovmm: Rename userspace's gvatogpa() -> gva2gpa()
Barret Rhoden [Fri, 22 Dec 2017 17:05:03 +0000 (12:05 -0500)]
vmm: Rename userspace's gvatogpa() -> gva2gpa()

This will match the kernel's name.  It's mostly for my convenience when
trying to find the function in the future.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agovmm: Mask NX / unused bits in guest page walks
Barret Rhoden [Fri, 22 Dec 2017 17:02:18 +0000 (12:02 -0500)]
vmm: Mask NX / unused bits in guest page walks

The guest can (and does) set the NX bit.  Similarly, bits 62:52 are ignored
and could be used in the future.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agonet: rock: Read the connection status for getsockopt() (XCC)
Barret Rhoden [Wed, 20 Dec 2017 18:30:04 +0000 (13:30 -0500)]
net: rock: Read the connection status for getsockopt() (XCC)

Once a non-blocking connect() activates, either via select or epoll,
applications check if the connect() succeeded or not with getsockopt().
See man 2 connect for more details.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agonet: rock: Use a helper for conversation filenames (XCC)
Barret Rhoden [Wed, 20 Dec 2017 18:28:03 +0000 (13:28 -0500)]
net: rock: Use a helper for conversation filenames (XCC)

This pops up a few times, and it is safer to use a common helper.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agonet: Support non-blocking connect() calls
Barret Rhoden [Wed, 20 Dec 2017 18:20:10 +0000 (13:20 -0500)]
net: Support non-blocking connect() calls

Dropbear's port forwarding requires support for non-blocking connect().
Specifically, they will attempt a connection, then go back to their service
loop.  Once select() returns for that FD (which is a Qdata FD), it'll check
the socket options - a spurious select() will break it.

Without non-blocking connect(), the entire DB connection would lock up.
For instance, if you port-forward to a host on the other side of a firewall
that doesn't send resets, your connection will hang in SYN_SENT until TCP
times out.  Your DB connection (e.g. the shell associated with the port
forward) will hang.

As far as tapping and polling for the connection being up, we can use the
Qdata FD.  It will become writable when we know one way or the other about
the connection: e.g. either established or reset.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agonet: Make select() not spurious
Barret Rhoden [Tue, 19 Dec 2017 23:12:48 +0000 (18:12 -0500)]
net: Make select() not spurious

Our old select() was spurious - in the event there was some race, or even
some potential race, we'd say that all of the FDs had some action.  For
instance, when we first added an FD to the epoll set, we could have missed
an event: say it happened!  Or if we might have had another thread consume
our event: say it happened!

This was OK for a while, but it break with non-blocking connect().  Calls
like read() and write() are often in a loop, so a spurious event isn't a
big deal.  But with connect(), once the app is told the connect is done,
they expect either completion or failure.

Originally, we never polled the FDs with fstat.  Over time, it turns out
that we needed to, such as for apps that call select() even though they
didn't drain them to empty (which would trigger an edge event later).  Now
that we have that polling method (fstat + appropriate support for
readable/writable bits) we can redo select such that we do not return
spurious events.

This might be broken, especially for FDs on devices that don't support the
necessary stat bits.  So far, it's been working with sshd and port
forwarding (which uses non-blocking connects).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agonet: Report conversation-wide info in Qdata stats
Barret Rhoden [Tue, 19 Dec 2017 17:20:19 +0000 (12:20 -0500)]
net: Report conversation-wide info in Qdata stats

select() and other users of stat will check the Qdata file, but not the
other files such as Qlisten or possibly Qctl.

It's reasonable to merge the 'Connected' status with Qdata
readability/writability.  If a conversation is not connected, then the user
can't read or write yet, even if the qio queues have room/data.  This
applies for protocols that have a connect method, like TCP and also UDP.

This pops up as an issue for apps that want to tap the ctl FD for
non-blocking connect() calls.  They actually select on the socket, which
ends up being an epoll on the data FD, listen FD, and ctl FD.  However,
thanks to the Linux buggy epoll behavior, if you start epolling on a data
FD and the FD is ready, you'll get an epoll event.  An epoll/select on any
of the Rock FDs looks like the socket is ready - in this case writable.
That looks to the app as if select fired for a non-blocking connect.
Whoops!

Similarly, we could have situations where select() stats a Qdata instead of
a Qlisten.  Reporting on Qlisten for Qdata isn't ideal, but the socket
stuff should never use a socket for both listening and data at the same
time.  I think.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agoepoll: Split out the guts of ctl_add and ctl_del
Barret Rhoden [Mon, 18 Dec 2017 16:21:38 +0000 (11:21 -0500)]
epoll: Split out the guts of ctl_add and ctl_del

This way we don't do sock lookups when we know they will fail.
Previously, whenever we recursively called __epoll_ctl_add() on the listen
FD, that sock lookup would always fail.

It's a little hard to see from the diff, but this only moves the actual
ctl_add and ctl_del functionality into separate helpers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agonet: rock: Look up the ctl FD with the listen FD (XCC)
Barret Rhoden [Fri, 15 Dec 2017 21:31:22 +0000 (16:31 -0500)]
net: rock: Look up the ctl FD with the listen FD (XCC)

Epoll may need to tap all three FDs when tapping a socket/rock.  This is
the glibc portion of the change - epoll still taps only the listen FD.
Even if we don't use this for epoll, tracking the ctlfd doesn't hurt and
may prove useful.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agonet: rock: Mirror F_SETFL flags to all FDs (XCC)
Barret Rhoden [Fri, 15 Dec 2017 20:40:33 +0000 (15:40 -0500)]
net: rock: Mirror F_SETFL flags to all FDs (XCC)

When the application attempts a fcntl + F_SETFL on a Rock FD (which is a
data FD), we'll mirror those commands to the other FDs (ctl and listen).

The motivator for this is dropbear, which sets a socket O_NONBLOCK and then
polls with connect().  It expects the O_NONBLOCK set on the socket FD to
apply to the entire socket.  Recall that all of the files that make up a
Rock collectively are a socket.

Back before commit 765fc2a8270a ("Remove the O_NONBLOCK fcntl() intercept
(XCC)"), we handled O_NONBLOCK in userspace.  This commit is somewhat
similar in that we need to do special Rock processing, but we still just do
fcntls.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
21 months agonet: rock: Keep the ctl FD open (XCC)
Barret Rhoden [Fri, 15 Dec 2017 20:08:10 +0000 (15:08 -0500)]
net: rock: Keep the ctl FD open (XCC)

Instead of reopening the ctl FD every time we want to use it, we can just
keep it open.

Notionally, all of the Rock's FDs (data, ctl, and listen) are part of the
same object.  The only downside is we have more open FDs, chans, and convs.

The motivator for this is fcntl operations on sockets - the application's
intent is to affect all of the FDs of the Rock, not just the data FD.

Note that you'll see more files in 'pip', and that the name of Qctl files
is usually 'listen' or clone.  For example, conversation 2's ctl file was
created by opening 1/listen:

FD: 08,  pathname: /net/tcp/1/listen
Dev: ip, Devinfo: Qctl, proto tcp, conv idx 2

The lesson is that the pathname is what was opened, not what the file is.
You need to look at the rest of the info for that.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
22 months agomlx4: Linearize large blocks to avoid dropping packets
Barret Rhoden [Thu, 14 Dec 2017 21:23:59 +0000 (16:23 -0500)]
mlx4: Linearize large blocks to avoid dropping packets

On occasion I would get the "Oversized header or SG list" error.  It might
have been due to having too few TXBB slots for the number of fragments.

Our TCP stack doesn't limit the number of EBDs it sends down the pipe yet.
In lieu of breaking the block into multiple blocks, we can linearize it.  I
had the same issue with r8169.

The longer term fixes:
- Maybe a helper that breaks a block, but it'd need to maintain the
  headers, to include the length fields.
- Peak at the first block in the queue or otherwise block until there is
  enough room.  Need to be careful that we don't get a block that has more
EBDs than the NIC has SG slots.
- Give TCP (and other block producers) a way to know the max number of
  EBDs.
- Just use 16.

I somewhat like the notion of having a limit and then have the helper break
the block at the appropriate layer, since you might not know where a block
is going when you create it.  (Though TCP does - we do this with MSS
already).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
22 months agosched: Slightly fix up tests/prov
Barret Rhoden [Wed, 13 Dec 2017 21:23:10 +0000 (16:23 -0500)]
sched: Slightly fix up tests/prov

prov now takes core lists (e.g. "1,3-5") instead of just a core at a time,
just like perf.

prov also can spawn processes, just like perf and strace.

Other than that, it's still in need of an overhaul.  It doesn't let you
provision multiple resource types to a process at a time, such as cores and
memory.  'show' mode still uses the kernel hack.  Stylistically, it could
use some work too.

For now, since we only provision cores, it's OK.  When we update the kernel
interface, we'll update prov too.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
22 months agoparlib: Move the provisioning of cores to a PID
Barret Rhoden [Wed, 13 Dec 2017 21:06:51 +0000 (16:06 -0500)]
parlib: Move the provisioning of cores to a PID

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
22 months agoparlib: Move core_sets to parlib
Barret Rhoden [Wed, 13 Dec 2017 20:21:09 +0000 (15:21 -0500)]
parlib: Move core_sets to parlib

I converted xopen() -> open() and xstrdup() -> strdup().

I tried putting xlib in parlib, but a bunch of other projects use those
names for the same functions, and we run into conflicts.  This is why we
can't have nice things.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
22 months agoperf: Rename the ros_ core_set code
Barret Rhoden [Wed, 13 Dec 2017 20:09:09 +0000 (15:09 -0500)]
perf: Rename the ros_ core_set code

I'll move it to parlib shortly.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
22 months agoparlib: Make bitmask.h more compilable
Barret Rhoden [Wed, 13 Dec 2017 22:26:52 +0000 (17:26 -0500)]
parlib: Make bitmask.h more compilable

In an upcoming patch, parlib headers will include this more broadly, which
means glibc will include it too.

You can't include stdio.h widely throughout glibc, so that needs to go.
Similarly, the header is included in parts of gcc that don't like the c99
for loop declarations.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
22 months agosched: Touch up the packed scheduler
Barret Rhoden [Wed, 13 Dec 2017 19:02:52 +0000 (14:02 -0500)]
sched: Touch up the packed scheduler

These are from my code review from the initial posting of the packed
scheduler.

The biggest fix was the TAILQ bug, since alloc_next is used for two lists.
The other stuff is mostly for clarity.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
22 months agosched: When disabling SMT, turn off the odd cores
Barret Rhoden [Wed, 13 Dec 2017 18:02:28 +0000 (13:02 -0500)]
sched: When disabling SMT, turn off the odd cores

Previously, we were turning off the even cores, but that gave out core 1,
which was hyperthreaded with core 0.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>