2 years 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>
2 years 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

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>
2 years 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>
2 years 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>
2 years 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>
2 years 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

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years 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>
2 years 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>
2 years 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

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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years 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

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years 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>
2 years 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

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years 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:


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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years 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>
2 years 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>
2 years 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>
2 years 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

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years 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>
2 years 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

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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.

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>
2 years 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>
2 years 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>
2 years 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

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years 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>
2 years 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
- 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

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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>
2 years 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

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>
2 years 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>
2 years agosched: Fix packed initialization
Barret Rhoden [Wed, 13 Dec 2017 17:57:11 +0000 (12:57 -0500)]
sched: Fix packed initialization

Setting alloc_proc = -1 blows up a few things, at least prov -s.  There's
probably other / future issues with it.

The new way a lot clearer too - one pass, make our decision, and move on.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agosched: Remove the idle core interface
Barret Rhoden [Wed, 13 Dec 2017 17:48:58 +0000 (12:48 -0500)]
sched: Remove the idle core interface

It's only used by ARSC code, which no one uses and probably needs a better

The code for the packed scheduler is buggy as hell:
- __get_any_idle_core doesn't return once it finds an item
- __get_any_idle_core uses uninitialized *spc
- There's no refcounting or interaction with the idle list.
- The UNNAMED_PROC is a problem too (prov -s crashes)

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd implementation of packed core alloc strategy
Kevin Klues [Tue, 6 Oct 2015 02:42:22 +0000 (19:42 -0700)]
Add implementation of packed core alloc strategy

This core allocation strategy attempts to hand out cores to a process
based on the underlying topology of the machine. It's strategy is based
on trying to pack cores as tightly as possible when handing out cores to
a process.

The first time a process requests a core, the algorithm will try to find
an idle core as far away as possible from all other allocated cores on
the machine. Once the first core is established, subsequent requests
will try and pack cores as tightly as possible to cores it already owns.
Cores from a proc's list of provisioned cores are preferentially chosen,
followed by the remaining idle cores in the system.

The core allocation strategy to use can be chosen as a makeconfig

Signed-off-by: Kevin Klues <klueska@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Fix topology detection
Barret Rhoden [Wed, 13 Dec 2017 17:02:50 +0000 (12:02 -0500)]
x86: Fix topology detection

The main thing is that we were off by one - the is_unique check would
compare us to ourselves, which will always fail.

The end result was that the number of numa nodes was always 0, which turns
off all of the other topology information.  I'm not sure how this ever

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmx: Squelch per-core startup messages
Barret Rhoden [Wed, 13 Dec 2017 17:48:29 +0000 (12:48 -0500)]
vmx: Squelch per-core startup messages

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Provide a fast-path for IPIs in the kernel
Barret Rhoden [Tue, 12 Dec 2017 18:27:55 +0000 (13:27 -0500)]
vmm: Provide a fast-path for IPIs in the kernel

Handling the IPI in userspace takes a couple usec.  If the target guest
pcore is loaded and running, such as when in greedy mode or under load, the
kernel can inject the IPI.

This helped perf bench pipe sched on tinycore in greedy mode, where the
guest was sending IPIs every 8-10 usec.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Check VPPR and interrupt-window-blocking with RVI
Barret Rhoden [Tue, 12 Dec 2017 18:24:02 +0000 (13:24 -0500)]
vmm: Check VPPR and interrupt-window-blocking with RVI

We had been checking just the full byte of RVI.  However, that is not what
the hardware will treat as a condition to trigger an interrupt in the

I didn't have a specific problem with this, but it popped up as a potential
issue when I was working on IPIs.

Note that vectors less than 16 in RVI won't trigger a wakeup, which is in
accordance with the SDM's algorithm.  The only time I've seen the RVI field
less than 16 so far is during an INIT/SIPI.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Add mmio helper functions
Barret Rhoden [Tue, 12 Dec 2017 18:22:00 +0000 (13:22 -0500)]
vmm: Add mmio helper functions

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix Linux timers, jiffies, and HZ
Barret Rhoden [Mon, 4 Dec 2017 23:16:34 +0000 (18:16 -0500)]
Fix Linux timers, jiffies, and HZ

Since commit 2a991d374670 ("Treat jiffies as msec since boot"), we've been
waiting ten times longer than we should.  For Linux code, jiffies are one
msec, and HZ = 1000.

Similarly, some mlx4 code was using mod_timer() for relative changes.  Once
we started treating jiffies as non-zero, these timers broke.

This fixes some nastiness with mod_timer - there never should have been
'delay', since all callers expect to use absolute time.  We should have
just had jiffies == msec or whatever from the beginning.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Fix signature for trace_printf()
Barret Rhoden [Fri, 1 Dec 2017 20:23:47 +0000 (15:23 -0500)]
parlib: Fix signature for trace_printf()

Commit 248d1a835700 ("Add printx to userspace (XCC)") moved the void
trace_printf() from one header to another.  But it turns out that 'void'
was wrong.  It conflicted with glibc's parlib-compat helper, which expected
an int.  The old code didn't notice since parlib/ros_debug.h wasn't
included by glibc's parlib-compat.c, but parlib/stdio.h is.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agovmm: Export the TSC freq via a vmcall (XCC)
Barret Rhoden [Wed, 22 Nov 2017 16:44:23 +0000 (11:44 -0500)]
vmm: Export the TSC freq via a vmcall (XCC)

This reduces the changes we make to the guest outside of akaros.c and
simplifies the commandline processing on our end.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agovmm: Remove lapic_timer_frequency from the cmd line
Barret Rhoden [Wed, 22 Nov 2017 15:17:50 +0000 (10:17 -0500)]
vmm: Remove lapic_timer_frequency from the cmd line

Linux's lapic_timer_frequency isn't in raw Hz.  It's actually the lapic
freq divided by HZ, the Linux variable, e.g. 250 or 1000.

Linux's akaros.c will take care of this.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agovmm: Halt vcore 0 instead of spinning
Barret Rhoden [Mon, 20 Nov 2017 20:09:52 +0000 (15:09 -0500)]
vmm: Halt vcore 0 instead of spinning

Spinning limits the sibling core's performance and limits the turbo mode
potential of the rest of the machine.

Instead, we'll mwait on notif_pending or an IPI.  Our ev_qs are already set
up to send IPIs with the notification, so things like syscalls and timers
will work fine.  If the 2LS enqueues a task thread - which are handled by
VC 0 - it'll make sure the vcore wakes up.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllow sys_halt_core() to monitor notif_pending
Barret Rhoden [Mon, 20 Nov 2017 19:20:08 +0000 (14:20 -0500)]
Allow sys_halt_core() to monitor notif_pending

This lets the 2LS halt the core and wait for someone to touch
notif_pending, which is touched for any event delivery to the vcore.

2LSs that want to wake vcores without sending a full event will need to use
wake_vcore().  The force_ipi is to help them break out of spinning
uthreads.  We'll see if that's needed or not.  Some of this ties into the
long range 2LS changes I've been planning.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMake cpu_halt() return with IRQs disabled
Barret Rhoden [Mon, 20 Nov 2017 19:12:47 +0000 (14:12 -0500)]
Make cpu_halt() return with IRQs disabled

And don't assume we woke from an IRQ that changed the kernel pcpui state.
Although that is always the case, it won't be if we woke due to an mwait.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agovmm: Let the VMM control mwait vmexits (XCC)
Barret Rhoden [Fri, 17 Nov 2017 15:59:27 +0000 (10:59 -0500)]
vmm: Let the VMM control mwait vmexits (XCC)

We can handle mwaits in software, but only for power management halts - the
monitor won't work.  We tell the guest (via cpuid) that monitor/mwait is
not supported, so the only VMs that should be making mwait calls are
paravirtualized guests.

The greedy 2LS sets mwait exiting in the same way that it controls whether
or not halts trigger a vmexit.

The end result should be that guests can mwait at whatever sleep state they
want - preferably at least C2 (mwait 0x10), which would allow other
physical cores to reach a higher turbo mode setting.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Remove UNUSED_ARG #define
Barret Rhoden [Fri, 17 Nov 2017 17:35:07 +0000 (12:35 -0500)]
x86: Remove UNUSED_ARG #define

We aren't using it, and if we need it, we can put it in compiler.h.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd printx to userspace (XCC)
Barret Rhoden [Wed, 22 Nov 2017 16:15:11 +0000 (11:15 -0500)]
Add printx to userspace (XCC)

Userspace now has printx (to stderr) and trace_printx (to dmesg).  We also
have all the variants of I_AM_HERE (_x, _t, _tx).

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove i386 from glibc (XCC)
Barret Rhoden [Wed, 22 Nov 2017 15:45:12 +0000 (10:45 -0500)]
Remove i386 from glibc (XCC)

I plan to add a bool to procdata and noticed the unused ldt variable.  By
removing it and putting in padding, I can make that space and keep people
from needing a rebuild.

If you have weird problems, rebuild the world.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: tcp: Handle reseqs of length 0
Barret Rhoden [Tue, 21 Nov 2017 20:24:13 +0000 (15:24 -0500)]
net: tcp: Handle reseqs of length 0

The SACK code was panicking, but it is possible to have length = 0 (on a
SYN or FIN).  We can just ignore any potential SACK updates in those

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agomlx4: Use netif_stats for ifstat
Barret Rhoden [Thu, 16 Nov 2017 16:09:57 +0000 (11:09 -0500)]
mlx4: Use netif_stats for ifstat

Linux drivers have a way of exporting their stats to a struct netif_stats.
We have a way to parse netif_stats when we cat ether/ifstats.  Put those
together and you have a simple way to get stats from any Linux driver.

For mlx4, I had to turn on a few bits of code that we had commented out.
There were minor issues with the MAC address changing, but I think we can
ignore that for now.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoTreat jiffies as msec since boot
Barret Rhoden [Thu, 16 Nov 2017 17:17:56 +0000 (12:17 -0500)]
Treat jiffies as msec since boot

We had been treating jiffies as 0, and then using relative time in
mod_timer.  This is nasty, and breaks things that want to use jiffies for
other stuff, like mlx4 stats.

Instead, we'll pretend like we're a Linux machine with HZ = 1000 and a
jiffie being a millisecond.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix ttcp rate output string
Barret Rhoden [Thu, 16 Nov 2017 15:52:52 +0000 (10:52 -0500)]
Fix ttcp rate output string

Previously, we'd have output like:

ttcp-t: X bytes in Y real seconds = Z (null)/sec

Now it is:

ttcp-t: X bytes in Y real seconds = Z KB/sec

'unit' wasn't set.  It gets set as a byproduct of calling rate().  The old
code was assuming that the arguments to fprintf were processed in order.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Remove 9ns's rtl8169 driver
Barret Rhoden [Wed, 15 Nov 2017 18:55:16 +0000 (13:55 -0500)]
net: Remove 9ns's rtl8169 driver

It barely worked for a couple models.  The half-baked Linux driver is

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agor8169: Port the driver
Barret Rhoden [Wed, 15 Nov 2017 18:50:24 +0000 (13:50 -0500)]
r8169: Port the driver

It's better than bnx2x and mlx4, but there's still more for us to do to
properly port Linux drivers.  Here's a few things:

- Backpressure is sorted out with pokes and whatnot.  Linux's
  netif_stop/start might be a better way - handled at a higher layer in the

- Shutdown/detach/power management is pretty much unsupported.

- Multicast is missing.  Again, there's more support at higher levels of
  the stack than 9ns has.

- Our PCI MSI(X) support doesn't let the driver have a say in whether or
  not MSI is used.

Til next time...

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agor8169: Make the driver compile
Barret Rhoden [Thu, 2 Nov 2017 18:14:21 +0000 (14:14 -0400)]
r8169: Make the driver compile

I permanently commented out (AKAROS_PORT) things related to ethtool, ioctl,
and vlan.

I commented out and panicked (AKAROS_ROOT_TODO) things that will need to be
ported manually.  These things involve SKBs and NAPI.  For the most part,
they work, but they'll need some massaging.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agor8169: Spatch the driver
Barret Rhoden [Tue, 31 Oct 2017 19:36:39 +0000 (15:36 -0400)]
r8169: Spatch the driver

Ran the scripts/spatch/linux/*.cocci files.  I had to do the u64s and
{read,write}{b/l/w} manually, due to errors like:

 try to delete an expanded token: writeb

It has something to do with weird usages of macros.

Did a bunch of other spatches separately as I changed the coccis, such as
pci_dev->dev => pci_dev->device.

A bunch of u32, u16, and u8s also failed silently.  Some worked, some

Same with BUG_ON.

And a couple of struct net_device.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agor8169: Add Linux's RTL 8169 driver
Barret Rhoden [Tue, 31 Oct 2017 19:14:10 +0000 (15:14 -0400)]
r8169: Add Linux's RTL 8169 driver

From commit 569dbb88e80d ("Linux 4.13").

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Add rx_mode to ether/netif
Barret Rhoden [Wed, 15 Nov 2017 18:08:53 +0000 (13:08 -0500)]
net: Add rx_mode to ether/netif

It's only used in a Linux driver.  It simplifies the driver a bit, and is
likely to help all other Linux drivers.  It's the way of the future!

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Remove mbps from ipifc
Barret Rhoden [Wed, 15 Nov 2017 17:24:50 +0000 (12:24 -0500)]
net: Remove mbps from ipifc


Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Delay etherbind until the link is up
Barret Rhoden [Tue, 14 Nov 2017 19:26:20 +0000 (14:26 -0500)]
net: Delay etherbind until the link is up

On some drivers, at least r8169, the link auto-negotiation takes a few
seconds.  It starts during attach(), but we can't wait there.  Lots of NICs
get attached, including ones that will never have a link.  Note that
attach() happens when you try to cat \#ether.0/ether0/addr.

We can't wait at attach.  If we try to error out during transmit, that
actually breaks (error at ipifc.c L444).  The IP stack will try to send

So we have two choices: on every transmit, do a netif_wait_for_carrier(),
or catch it after attach, but before Ipifc initialization.  It turns out
that during etherbind() we can wait.  This is when we try to prepare the
NIC to use IPv4, v6, and ARP.

Note this means all 9ns drivers need to tell the rest of the stack that
their links are up.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Add a helper to parse netif_stats
Barret Rhoden [Mon, 13 Nov 2017 19:59:48 +0000 (14:59 -0500)]
net: Add a helper to parse netif_stats

NIC drivers can use this for their ifstats function.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Split hw_features out from feat
Barret Rhoden [Mon, 13 Nov 2017 19:20:57 +0000 (14:20 -0500)]
net: Split hw_features out from feat

hw_features is what is possible; feat is what is turned on *or* other Plan
9 characteristics.  Notably, NETF_PADMIN is more of a signal that the NIC
will pad to the mintu.  It's not something the hardware will turn on or

By #defining hw_features to feat, we were possibly turning on things that
shouldn't be on by default.  Likewise, an = (instead of |=) could clobber
values of feat.  It was all quite nasty.

Note that the name 'feat' is an ABI to some extent.  etherbind() looks for
that string when it decides which features get added to the Ipifc.  If we
have dynamic features and want them to actually take affect to IP stacks
bound to a NIC, then we'll need to propagate those changes to Ipifc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Split up BCKSUM_FLAGS
Barret Rhoden [Fri, 10 Nov 2017 21:07:58 +0000 (16:07 -0500)]
net: Split up BCKSUM_FLAGS

Those flags were for more than block checksums - Btso was in there, which
isn't a checksum.

This clarifies the use of the block checksum flags, including being
explicit about when we are using the flag for transport layer checksum

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoEncapsulate block metadata better
Barret Rhoden [Fri, 10 Nov 2017 17:44:52 +0000 (12:44 -0500)]
Encapsulate block metadata better

Everytime I add something, like network_offset, I had to update a few
places.  Well, two places.  This way, we're slightly more clear about what
we're doing, instead of adding minor hacks each time.

A couple points:
- We had been copying the metadata over only if certain flags were set.  We
  should be able to copy that data over no matter what.
- It was probably buggy to only copy network_offset and transport_offset
  based on a flag.
- If you muck with a block, like in padblock(), you still need to adjust
  any offsets.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Clarify transport checksum offload
Barret Rhoden [Fri, 10 Nov 2017 17:14:50 +0000 (12:14 -0500)]
net: Clarify transport checksum offload

It turns out that checksum_start (an offset) was always the same as
transport_offset.  That's how these transport xsum offloads work.

The asserts are for sanity checks.  We can take those out once we're sure
I'm right about all this.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Remove block->checksum
Barret Rhoden [Fri, 10 Nov 2017 16:53:49 +0000 (11:53 -0500)]
net: Remove block->checksum

This was used to report the checksum computed by the NIC.  However, the
rest of the stack wasn't using it for anything.

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