akaros.git
23 months agonet: Remove mbps from ipifc
Barret Rhoden [Wed, 15 Nov 2017 17:24:50 +0000 (12:24 -0500)]
net: Remove mbps from ipifc

Unused.

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

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>
23 months 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>
23 months 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
off.

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>
23 months 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
offload.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months 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>
23 months 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>
23 months 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>
23 months agoether: Add a field for the driver_name
Barret Rhoden [Thu, 9 Nov 2017 20:36:07 +0000 (15:36 -0500)]
ether: Add a field for the driver_name

For debugging and viewable in ether/stats.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: Let ifconfig use NICs other than ether.0
Barret Rhoden [Thu, 9 Nov 2017 18:58:54 +0000 (13:58 -0500)]
net: Let ifconfig use NICs other than ether.0

To pick a different NIC, put its MAC address in a config block in
/etc/network/local.d/.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoqio: Don't make extra empty EBDs
Barret Rhoden [Thu, 9 Nov 2017 17:22:40 +0000 (12:22 -0500)]
qio: Don't make extra empty EBDs

We overestimated the number of extra data blocks in a couple of ways, and
this was triggering issues with SG in the NICs.

First, we were counting (and pointing to) the headers of blocks even when
the headers were empty.  Excessive work, no gain, extra ebds.

We were also counting the entire blist, even if we were only extracting a
small amount of data.  I had a few blocks that had 80 ebds, but only one
valid block.

We continue to assume that EBDs are all valid, and thus it is still an
overestimate.  It's not a bad one though, since I think the only time we
have empty EBDs are a result of pullups or other one-off operations.  Not
sure though.

It might be worth tracking the number of valid EBDs (base && len), but it
might be tricky.  Note that we have some EBDs with no len but with a
refcounted base.  So you'd have to be careful how you count 'valid.'

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: Add an option for RX checksum offload
Barret Rhoden [Wed, 8 Nov 2017 20:49:49 +0000 (15:49 -0500)]
net: Add an option for RX checksum offload

Plan 9 drivers assume that this feature is always on, if available, and it
is unqueryable.

Linux drivers have a flag for this, and by setting that flag to zero, NICs
(e.g. r8169) turn off their feature since they think the user doesn't want
it.

It's likely this will turn on RX checksumming on bnx2x and mlx4.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: tcp: Fix TSO for incoming connections
Barret Rhoden [Wed, 8 Nov 2017 19:43:45 +0000 (14:43 -0500)]
net: tcp: Fix TSO for incoming connections

TSO was only being used on outbound connections.  The issue was that the
'flags' in tcpmtu for inbound connections was seg.flags, not tcb->flags.
So that bit we were setting was discarded.

The fix is to do the lookup (which requires the ifc) once we finally have
the tcb, which is after the conversation comes out of limbo.  Instead of
looking up the ifc twice, we can just store the uncounted ref.  We'll
probably have other uses for the ifc.

Note that the ifc->feat is not exactly the same as ether->netif->feat.  The
device's features are copied over to the IP interface during etherbind.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: Add network_offset to blocks
Barret Rhoden [Wed, 8 Nov 2017 16:44:18 +0000 (11:44 -0500)]
net: Add network_offset to blocks

Similar to transport_offset, this is the offset from bp->rp to the
beginning of the network layer header, e.g. IP.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: Change transport_header_end -> tranport_offset
Barret Rhoden [Mon, 6 Nov 2017 16:44:32 +0000 (11:44 -0500)]
net: Change transport_header_end -> tranport_offset

mlx4 wanted the size of a TCP packet, but other NICs want the start of the
TCP header.  We can go from "header start" -> "header end" easily, but not
the other way.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: tcp: Refactor the tcp header structs
Barret Rhoden [Mon, 6 Nov 2017 16:40:42 +0000 (11:40 -0500)]
net: tcp: Refactor the tcp header structs

v4 and v6 have the same TCP header (since it's the same protocol).  Plan 9
embeds them in TCP-IPv4 and TCP-IPv6 structs.  It behooves us to have a
common struct.  It could be used to clean up a bunch of tcp.c code, but for
now I just need it for a header helper.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoMove srch_linux_pci_tbl to linux_compat.h
Barret Rhoden [Thu, 2 Nov 2017 22:51:13 +0000 (18:51 -0400)]
Move srch_linux_pci_tbl to linux_compat.h

This was a helper used by bnx2x, but all users of Linux PCI tables can
use it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agopci: Add a struct device field
Barret Rhoden [Wed, 1 Nov 2017 20:28:28 +0000 (16:28 -0400)]
pci: Add a struct device field

bnx2x has a lot of other places that are still using pcidev->dev, but it's
passing them to dont-care macros.  It's hokey, and spatch doesn't seem to
want to catch them all.  It's also a little hard to spatch after doing the
native conversion; some places have akaros_pcidev->dev, meaning the 'd' of
TBDF.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agopci: Update pci_regs.h
Barret Rhoden [Wed, 1 Nov 2017 18:41:29 +0000 (14:41 -0400)]
pci: Update pci_regs.h

This file was originally from Linux.  This is the updated version, from
commit 569dbb88e80d ("Linux 4.13").

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agopci: Add cacheline and MWI helpers from Linux
Barret Rhoden [Wed, 1 Nov 2017 18:09:09 +0000 (14:09 -0400)]
pci: Add cacheline and MWI helpers from Linux

These were copied and ported from commit 569dbb88e80d ("Linux 4.13").

They are simple enough that we can use them too.  We weren't doing anything
with memory-write-invalidate, but it's a performance helper.  Eventually,
we might end up porting all of Linux's PCI infrastructure.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoether: Add Linux-compatible netif_stats
Barret Rhoden [Thu, 2 Nov 2017 16:34:23 +0000 (12:34 -0400)]
ether: Add Linux-compatible netif_stats

Instead of faking stat structs (like we did with mlx4) or completely
ignoring them (like bnx2x), we can just use the same struct and put it in
struct netif (anonymously in struct ether).  We can even have an ifstat()
function pointer that all the Linux drivers use to extract the info.

Given we probably won't have too many Plan 9 drivers, we might just yank
the Plan 9 stats and covert everyone to using netif_stats.

netif_stats is Linux's rtnl_link_stats64, from commit 569dbb88e80d ("Linux
4.13").

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoether: Fix ETHERMAXTU calculations
Barret Rhoden [Wed, 1 Nov 2017 23:19:01 +0000 (19:19 -0400)]
ether: Fix ETHERMAXTU calculations

In commit f5e7ebb31ce7 ("Changes devether's Max Trans Unit to 1500")
I changed ETHERMAXTU to not account for the header size.  I changed places
that had maxmtu, but not places that directly used ETHERMAXMTU.

As a fun side note, I noticed the problem in devether, near the vlan case.
I was tempted to change it in a previous commit, but decided to do a
separate commit.  In doing so, I did a more thorough job and grepped for
ETHERMAXMTU and found the bugs in 8139 and 8169.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoether: Fix MTU control variables
Barret Rhoden [Wed, 1 Nov 2017 23:08:45 +0000 (19:08 -0400)]
ether: Fix MTU control variables

Plan 9 had maxmtu, but it was pretty much used as 'what is the current
MTU", not "what is the highest MTU we can have."  I had been spatching
Linux drivers from mtu -> maxmtu.

Instead, let's name the MTU we're using 'mtu' (like Linux).  We'll have
max_mtu and min_mtu, which are the highest and lowest possible settings.

Mostly this is a revert of commit a73aedb3c118 ("BNX2X: spatch ether->mtu
-> ether->maxmtu"), manually changing the mlx4 driver, and all of the
renames.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoether: Port the Linux MII code
Barret Rhoden [Wed, 1 Nov 2017 15:09:17 +0000 (11:09 -0400)]
ether: Port the Linux MII code

Unfortunately, I had to comment out most of the file: all ethtool and ioctl
stuff.

Maybe the next step will be to port the ethtool interfaces.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoether: Spatch Linux MII files
Barret Rhoden [Wed, 1 Nov 2017 14:56:38 +0000 (10:56 -0400)]
ether: Spatch Linux MII files

$ for i in scripts/spatch/linux/*.cocci; do echo $i; spatch -sp-file $i
-in-place kern/drivers/net/linux_mii.c; done

Looks like these had no spatch complaints either (unlike r8169).  We'll
see.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoether: Add Linux's MII code
Barret Rhoden [Tue, 31 Oct 2017 21:12:07 +0000 (17:12 -0400)]
ether: Add Linux's MII code

From commit 569dbb88e80d ("Linux 4.13").

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoUpdate Linux compatibility shims/coccis
Barret Rhoden [Thu, 2 Nov 2017 18:02:00 +0000 (14:02 -0400)]
Update Linux compatibility shims/coccis

These were updates I made for the r8169.

There's also a potential bugfix in there for mlx4.  wait_for_completion()
should sleep, not busywait.  This pops up later in the patchset when we
make netif_carrier_ok() not just return true.  Incidentally, if we're going
to busywait, we should be using udelay.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agomlx4: bnx2x: Use pci_set_bus_master()
Barret Rhoden [Wed, 1 Nov 2017 19:26:07 +0000 (15:26 -0400)]
mlx4: bnx2x: Use pci_set_bus_master()

Instead of the #define.  There will be an spatch for this.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agox86: Rename VPD (XCC)
Barret Rhoden [Wed, 1 Nov 2017 15:14:15 +0000 (11:14 -0400)]
x86: Rename VPD (XCC)

Conflicts with some device stuff (Vital Product Data).

Reinstall your kernel headers (not manadatory).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoAdd variants to I_AM_HERE
Barret Rhoden [Wed, 8 Nov 2017 16:24:45 +0000 (11:24 -0500)]
Add variants to I_AM_HERE

For trace printing (viewable with dmesg) and/or printxing.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoMove uninitialized_var() to compiler.h
Barret Rhoden [Thu, 2 Nov 2017 16:21:23 +0000 (12:21 -0400)]
Move uninitialized_var() to compiler.h

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoAdd IS_ERR_OR_NULL helper
Barret Rhoden [Wed, 1 Nov 2017 20:29:52 +0000 (16:29 -0400)]
Add IS_ERR_OR_NULL helper

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoPort Linux's math64 headers
Barret Rhoden [Fri, 21 Jul 2017 23:21:55 +0000 (19:21 -0400)]
Port Linux's math64 headers

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoAdd Linux's math64.h
Barret Rhoden [Fri, 21 Jul 2017 23:12:23 +0000 (19:12 -0400)]
Add Linux's math64.h

k/a/x/div64.h is a truncated version of asm-generic/div64.h, which is
all that Linux's x86_64 is.

From Linux's commit 921edf312a6a ("ide: avoid warning for timings
calculation").

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: tcp: Lowercase-ify struct names
Barret Rhoden [Fri, 21 Jul 2017 22:02:07 +0000 (18:02 -0400)]
net: tcp: Lowercase-ify struct names

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: tcp: Move TCP's headers into net/tcp.h
Barret Rhoden [Fri, 21 Jul 2017 19:22:37 +0000 (15:22 -0400)]
net: tcp: Move TCP's headers into net/tcp.h

We'll want these in their own file when we start using different
congestion avoidance modules.

This also makes most of the functions in tcp.c static, since they aren't
called from outside tcp.c.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: Move ip.h to net/ip.h
Barret Rhoden [Fri, 21 Jul 2017 19:00:18 +0000 (15:00 -0400)]
net: Move ip.h to net/ip.h

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agonet: tcp: Don't increment snd.nxt
Barret Rhoden [Thu, 16 Nov 2017 15:32:59 +0000 (10:32 -0500)]
net: tcp: Don't increment snd.nxt

Ever since commit 682b414ddb84 ("net: tcp: Support SACK"), we weren't
sending FINs when our connections were shutdown or closed.

For the sackless, normal case, that commit changed the from_seq from
snd.rtx to snd.nxt.  Those are supposed to be in sync for normal operation.
However, the old Plan 9 stack was incrementing snd.nxt whenever it wanted
to send a FIN.  It should *only* increment flgcnt, which is the weird
signal that means to send a FIN, since we end up trying to send one more
byte than we have bytes in the qio.  (And the extra byte is interpreted as
a FIN at some point).

Anyway, the old code, before the SACK overhaul, got away with it since it
was sending with from_seq being snd.rtx (the retrans point).  That's a
little messed up, but no one ever noticed since the old snd.rtx usually had
the value that snd.nxt *should* have had.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agolinuxemu: fix fcntl GETFL flags
Gan Shun Lim [Thu, 26 Oct 2017 07:19:49 +0000 (18:19 +1100)]
linuxemu: fix fcntl GETFL flags

GETFL returns the file flags, but akaros flags and linux flags are
different.

Change-Id: I7ecdf605e2548f2a120bbea3f2375b7715cca7b5
Signed-off-by: Gan Shun Lim <ganshun@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoAdd support for attempting returns from panic
Barret Rhoden [Mon, 30 Oct 2017 18:35:39 +0000 (14:35 -0400)]
Add support for attempting returns from panic

If you ever wanted to keep going after a panic, it just got a little
easier.  You can exit the monitor ('exit' or 'e'), like always.  This
commit cleans up a little so the core doesn't keep panicking.

This will rarely work well, since the system is toasted, but I've been able
to get back to userspace with it.  You might lose the core that panicked,
(e.g. MCP triggers a racy panic), but at least that core won't keep polling
the console in the monitor.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agopm: Catch issues with page map pages
Barret Rhoden [Mon, 30 Oct 2017 18:14:25 +0000 (14:14 -0400)]
pm: Catch issues with page map pages

We had bugs with PM reference counts and pages being freed with PG_ flags
still set.  The PM code needs to clean up after itself.

The various asserts are probably paranoia, but there might be similar bugs
out there still.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agomm: Don't free pages in the page cache
Barret Rhoden [Mon, 30 Oct 2017 17:48:39 +0000 (13:48 -0400)]
mm: Don't free pages in the page cache

map_page_at_addr() should have had !page_is_pagemap() (note the !).
Instead, we were actually freeing page cache pages under those rare
circumstances where map_page_at_addr() frees a page.

Specifically, we had a case where we'd have multiple PFs at once, and we
hit the benign race.  But we accidentally freed the page cache page and
then reused it.  Reusing the page, which was a binary text page, destroyed
the program (crazy faults).  Also, when we reused the page, its PG_PAGEMAP
flag was still set, which caused it to be PM-decreffed without a
corresponding incref.  That led to a negative refcnt, and an assertion
flipped out when it didn't have a positive ref.

Fixes brho/akaros#42.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agopm: Fix uninitialized struct page semaphore
Barret Rhoden [Sat, 28 Oct 2017 00:38:00 +0000 (20:38 -0400)]
pm: Fix uninitialized struct page semaphore

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agox86: Add get_actual_pstate()
Barret Rhoden [Tue, 24 Oct 2017 20:04:34 +0000 (16:04 -0400)]
x86: Add get_actual_pstate()

This is useful for seeing what p-state a core is actually running at.  For
instance:

$ m monitor 4

(entered monitor on 4)

> kfunc get_actual_pstate

That'll tell you the p-state, and other cores won't be active, which can
interfere with the p-state the core can actually run at.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agox86: Use MSRs and model info for timer freqs (XCC)
Barret Rhoden [Tue, 24 Oct 2017 20:00:32 +0000 (16:00 -0400)]
x86: Use MSRs and model info for timer freqs (XCC)

We should be able to know from cpuid family/model what the bus frequency
is.  It's a minor pain.

On some machine (notably not my Qemu), you can read MSR_PLATFORM_INFO and
get the invariant TSC freq.  With that and the bus freq, we can get an
exact TSC frequency.

This helps FTQ slightly.  With slight errors in the invariant TSC freq,
our measurements would drift.  FTQ has an override for get_tsc_freq(), but
we can do the right thing on Akaros.

Plus this speeds up everyone's boot times!

Reinstall your kernel header, though it shouldn't matter.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoperf: x86: Fix GPF with bad events
Barret Rhoden [Thu, 26 Oct 2017 18:29:43 +0000 (14:29 -0400)]
perf: x86: Fix GPF with bad events

Userspace could give us a bad 'event' parameter with reserved bits set.
That would blow up write_msr() with a GPF.

I noticed this by looking at the code, but it turns out you can recreate
the bug in qemu by trying to use 'anythread' with a non-fixed counter.
e.g.:

perf stat -e TLB_FLUSH:t hello

will die.  Using -e cycles won't do it, since fixed counters were checking
the 'any thread' bit.  Hacking up perf and writing bits to the upper half
of the event / MSR would also trigger the GPF.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoperf: Fix perf event attr config
Barret Rhoden [Thu, 19 Oct 2017 18:32:42 +0000 (14:32 -0400)]
perf: Fix perf event attr config

The mask is supposed to be shifted 8.  The PMEV_GET_MASK helper doesn't
just return the field in place, it masks and shifts the field down to bit
0.

This was causing certain raw and pfm events to be reported to perf
incorrectly.  For example, the HSW icache miss counter is 0x80 mask 0x2.
That was showing up as 0x82 instead of 0x280.  This didn't affect the
actual counter used - just the line from perf that says:

Samples: 6K of event 'raw 0x280:kuH'

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agoperf: Fix uninitialized core_set bug
Barret Rhoden [Thu, 19 Oct 2017 15:41:36 +0000 (11:41 -0400)]
perf: Fix uninitialized core_set bug

Depending on your machine, some bits in the core_set could be set already,
which would be treated as low-latency cores, and thus we wouldn't provision
them to the process.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
23 months agox86: Add a turbo mode helper
Barret Rhoden [Sat, 7 Oct 2017 18:59:58 +0000 (14:59 -0400)]
x86: Add a turbo mode helper

This commands disables or enables Turbo mode, or deals with the turbo
ratio.

The ratio of APERF/MPERF is the amount of turbo mode boosting a processor
received while *unhalted*.  Since we're doing the two MSR reads with a
large gap in between, this will only be accurate over a larger time scale.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd a cpuid helper program
Barret Rhoden [Sat, 7 Oct 2017 18:58:57 +0000 (14:58 -0400)]
Add a cpuid helper program

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agofcntl: reduce noise on invalid arguments
Dmitry Vyukov [Tue, 17 Oct 2017 07:14:46 +0000 (09:14 +0200)]
fcntl: reduce noise on invalid arguments

Kernel generally should not print to console on every EINVAL.
This can produce lots of noise for programs intentionally
or unintentionally feeding garbage into kernel.
Don't print on invalid commands to fcntl syscall.

Change-Id: Ia921c588b670a61f6e647490875ad563ac8738e5
Signed-off-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix dup() of 9ns FDs
Barret Rhoden [Mon, 16 Oct 2017 17:49:57 +0000 (13:49 -0400)]
Fix dup() of 9ns FDs

Glibc uses dup() to implement dup2(), by way of sysdeps/posix/dup2.c.  VFS
dup() was handling the low_fd argument, but 9ns wasn't.  The fix is to
propagate the low_fd (and must_use_low) down through newfd() to
insert_obj_fdt().

Note that fcntl's dup() doesn't force us to use the fd - it's a hint.  The
bigger issue is that glibc's implementation of dup2 might fail; a
concurrent thread could open newfd.  If this is an issue, we'll need an
in-kernel version of dup2().

Fixes brho/akaros#41.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoClose FDs in test_open_lots_and_spawn()
Barret Rhoden [Mon, 16 Oct 2017 17:48:09 +0000 (13:48 -0400)]
Close FDs in test_open_lots_and_spawn()

This allows the following tests to assume a reasonable number of FDs alread
open.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agopthread: Fix null attr for pthread_mutex_init()
Barret Rhoden [Mon, 16 Oct 2017 16:09:22 +0000 (12:09 -0400)]
pthread: Fix null attr for pthread_mutex_init()

Fixes brho/akaros#40.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd an example jumbo page allocator
Barret Rhoden [Thu, 12 Oct 2017 18:23:10 +0000 (11:23 -0700)]
Add an example jumbo page allocator

For reference.  I had one before, but deleted it since it was so simple.
Though it took me longer than I liked to remember how to remake it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Silently accept another type of PIO out
Barret Rhoden [Thu, 5 Oct 2017 19:44:46 +0000 (15:44 -0400)]
vmm: Silently accept another type of PIO out

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: virtio-blk: Add sanity check
Barret Rhoden [Thu, 5 Oct 2017 18:26:46 +0000 (14:26 -0400)]
vmm: virtio-blk: Add sanity check

The comments says there must be three IOVs; let's assert it to avoid any
problems.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: virtio-net: Handle single IOVs
Barret Rhoden [Thu, 5 Oct 2017 18:25:29 +0000 (14:25 -0400)]
vmm: virtio-net: Handle single IOVs

Newer versions of Linux send only one IOV, not two.  I didn't see anything
in the spec that says the payload is in the second IOV.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Attempt to backtrace the guest on error
Barret Rhoden [Thu, 5 Oct 2017 15:49:03 +0000 (11:49 -0400)]
vmm: Attempt to backtrace the guest on error

Build the guest with CONFIG_FRAME_POINTER.

You can backtrace it with the usual bt-akaros.sh.  You'll need to point
bt-akaros's BIN_PATH to your vmlinux.  Here's what I do:

BIN_PREFIX=PATH_TO_THE_REPO/linux-guest/ ~/scripts/bt-akaros.sh

e.g.

echo '#01 Addr 0xffffffff81480cda is in vmlinux at offset 0xffffffff81480cda
 #02 Addr 0xffffffff81480d0f is in vmlinux at offset 0xffffffff81480d0f
 #03 Addr 0xffffffff813f8e37 is in vmlinux at offset 0xffffffff813f8e37'
 | BIN_PREFIX=../linux-guest/ ~/scripts/bt-akaros.sh

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd backtrace_current_ctx()
Barret Rhoden [Fri, 29 Sep 2017 14:36:31 +0000 (10:36 -0400)]
Add backtrace_current_ctx()

This is a convenience helper.  I'll use it for one-off tracing attempts.
For instance, in sys_openat(), you can do this:

if (!strcmp(path, "hello.txt"))
backtrace_current_ctx();

And then at runtime when catting hello.txt you'll see:

Backtrace of user context on Core 0:
Offsets only matter for shared libraries
 #01 Addr 0x00003000000d2cee is in libc-2.19.so at offset 0x00000000000d0cee
 #02 Addr 0x00003000000ca200 is in libc-2.19.so at offset 0x00000000000c8200
 #03 Addr 0x0000000000415f47 is in busybox at offset 0x0000000000015f47
 #04 Addr 0x002f3d4457500074 has no VMR

which you can pipe through scripts/bt-akaros.sh.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoTrack errno and errstr in the kthread
Barret Rhoden [Thu, 28 Sep 2017 21:50:23 +0000 (17:50 -0400)]
Track errno and errstr in the kthread

Using user memory was slightly dangerous.

First, there are some places in the kernel where we'd read errno/errstr
and make decisions based on it.  Userspace could influence those
decisions - often to their detriment, but perhaps to the kernel's.

The other issue is that the kernel could PF setting errno or errstr,
perhaps if userspace unmaps their syscall struct.  Now, the only places
where that can happen are controlled.  Since we'll want to call error()
(setting errno/errstr) from kernel PF contexts, we don't want to
possibly PF again.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRefactor uses of finish_{current_,}syscall
Barret Rhoden [Thu, 28 Sep 2017 21:50:08 +0000 (17:50 -0400)]
Refactor uses of finish_{current_,}syscall

There are a few things that get done for every syscall, and the list is
growing: delete the save_str, finish the trace, finish the sysc, etc.
It gets a little nasty due to exec() and fork(), as always.  Yield is
pretty simple, by comparison.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Fix devalarms on forks without exec
Barret Rhoden [Thu, 28 Sep 2017 14:54:06 +0000 (10:54 -0400)]
parlib: Fix devalarms on forks without exec

After the fork, the child would close the alarm FDs, which are the
parent's alarm FDs.  However, it wouldn't get its own alarms until exec,
during the ctor.  For processes that forked but never execed, they
wouldn't have the alarm service available.

I noticed this when the process's child was trying to close those -42
FDs when the process forked. (e.g. db -> db -> sh).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoepoll: Fix leaked listen bug (XCC)
Barret Rhoden [Thu, 28 Sep 2017 01:40:03 +0000 (21:40 -0400)]
epoll: Fix leaked listen bug (XCC)

During the close callbacks for a data FD, the rock CB was called first.
That would close the listen FD (if it was open).  Then we'd call the
epoll CB, which would do an __epoll_ctl_del().  That would open the
listen FD.  However, at that point, the callback that would make sure
the listen FD was closed wouldn't run (it already ran).

The end result for dropbear was that listen FDs were getting leaked.
The DB parent would have the child's listen line open (e.g.
/net/tcp/1/listen, while the child had 1/data).  The child also had the
parent's 0/listen.  The latter had the effect of us never being able to
restart sshd while a client was connected, since someone would always be
listening on port 22.

Rebuild glibc and dropbear.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd strace info for SYS_tap_fds
Barret Rhoden [Thu, 28 Sep 2017 01:03:52 +0000 (21:03 -0400)]
Add strace info for SYS_tap_fds

Now we can tell what sort of taps the user is attempting.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoUse the better hash multiplier for __generic_hash
Barret Rhoden [Wed, 27 Sep 2017 21:20:57 +0000 (17:20 -0400)]
Use the better hash multiplier for __generic_hash

I added Linux's hash.h a while back, but didn't update __generic_hash,
which was using the hardcoded GOLDEN_RATIO_PRIME_32.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRemove old PER_CPU_THING
Barret Rhoden [Wed, 27 Sep 2017 21:03:38 +0000 (17:03 -0400)]
Remove old PER_CPU_THING

This might have been from Ivy.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoDiscard leading 'm ' from monitor commands
Barret Rhoden [Wed, 27 Sep 2017 20:59:45 +0000 (16:59 -0400)]
Discard leading 'm ' from monitor commands

If you use 'm' a lot, when you are actually in the kernel monitor, you
may type 'm COMMAND' out of habit.  This will ignore the 'm' and execute
the command.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd monitor helpers for hexdump and pahexdump
Barret Rhoden [Wed, 27 Sep 2017 20:40:20 +0000 (16:40 -0400)]
Add monitor helpers for hexdump and pahexdump

Hexdump takes a PID.  Use 0 for the kernel or "don't care."

There are shortcuts too: 'hd' for hexdump and 'phd' for pahexdump.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix leaked proc refcnt in showmapping
Barret Rhoden [Wed, 27 Sep 2017 20:38:10 +0000 (16:38 -0400)]
Fix leaked proc refcnt in showmapping

You'd only trigger this if you were using monitor functions.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovfs: Update atime/mtime/ctime
Barret Rhoden [Wed, 27 Sep 2017 20:13:47 +0000 (16:13 -0400)]
vfs: Update atime/mtime/ctime

I noticed we weren't tracking these in the VFS when trying to see if
ssh+scp was working.  Even though that code is old and destined for the
dumpster, I'd rather fix it a little and not waste time wondering if I
actually changed a file or not.

This is far from perfect, especially in that we don't tell the
filesystem that we updated an inode, but that goes for all of the VFS.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoUse AKAROS_ROOT in bt-akaros.sh
Barret Rhoden [Wed, 27 Sep 2017 19:16:16 +0000 (15:16 -0400)]
Use AKAROS_ROOT in bt-akaros.sh

This way people can use the script without modification or adding extra
variables to their environment.

You can still override SOLIBS and BIN, either in your own script or in
your environment if you want to point at a different collection of
binaries (i.e. large ones that you don't want to put in KFS).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Squelch 'Unsupported IPI' for INIT/SIPI
Barret Rhoden [Wed, 27 Sep 2017 18:50:46 +0000 (14:50 -0400)]
vmm: Squelch 'Unsupported IPI' for INIT/SIPI

We let them attempt those IPIs, so it's not something to worry about.
These were noticeable if you launched a VM with a lot of cores.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Update the check for BRK_END
Barret Rhoden [Wed, 27 Sep 2017 18:42:47 +0000 (14:42 -0400)]
x86: Update the check for BRK_END

This was printing out warnings since the change to BRK_END.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Clarify cpuid 64 bit check
Barret Rhoden [Wed, 27 Sep 2017 18:37:15 +0000 (14:37 -0400)]
x86: Clarify cpuid 64 bit check

That bit wasn't checking FS/GS MSRs, it was checking for long mode
capability.  Long mode has those MSRs, so the check was working, but it
was confusing.  Since we only run on 64 bit x86, we can be more explicit
about what we're checking and why it failed.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix sleep 99999999
Barret Rhoden [Wed, 27 Sep 2017 18:30:57 +0000 (14:30 -0400)]
Fix sleep 99999999

Due to various int-vs-long issues, if you slept for 99999999, you'd
sleep for 275000000 usec (275 sec).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAllow INVPCID from the guest.
Gan Shun [Thu, 28 Sep 2017 19:25:01 +0000 (12:25 -0700)]
Allow INVPCID from the guest.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Ib8226f5b936d15644a5d35b86f26488aa9696b47
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdded new Hypervisor signature for Akaros.
Gan Shun [Thu, 28 Sep 2017 18:03:53 +0000 (11:03 -0700)]
Added new Hypervisor signature for Akaros.

With this we can tell the guest that they are paravirt under akaros. We
also tell them we're KVM for now so it calls the requisite KVM
initialization functions.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Ia420f8776887e7cd6a5adf8737d7ccd5639899ba
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Aggressively save and restore the FPU
Barret Rhoden [Tue, 26 Sep 2017 21:06:30 +0000 (17:06 -0400)]
parlib: Aggressively save and restore the FPU

Whenever we enter vcore context and the uthread's FP state might be
dirty (HW, VM ctxs, but not SW ctxs, which are cooperative), we
preemptively save the FP state, to include XMMs (on x86).

The rest of the patch is dealing with the consequences of that early
saving, notably that when we restart current_uthread, we'll have to
restore its FPU state.  There are also a few assertions that needed
flipped around.

The driver for this is that vcore context code continues to muck with
the XMM registers.  strlen(), snprintf(), memset(), and the list goes
on.  Until we can change glibc to be vcore-context-aware, this is the
best we can do.

The downside is that save/restore has noticeable costs.  On one machine,
the cost for a notify / software IPI is about 2850 cycles.  It's about
250 more when we do the save/restore too.  This affects every __notify
(event delivery), reflected trap, and vmexit.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd tests for interference
Barret Rhoden [Tue, 26 Sep 2017 19:41:44 +0000 (15:41 -0400)]
Add tests for interference

The kernel test runs via kfunc.  The user test runs from userspace.
Both require running 'perf stat -e cycles sleep 99999999' or something
similar to turn on the pmc.

When running either test, you can kfunc ipi_spam to blast the core with
IPIs (spaced by 1 ms).  For userspace, you can notify PID 9 in a bash
for loop.

The userspace test can also be built for Linux, though you won't get the
histogram or other stats for values above the threshold.  If someone
wants to link in benchutil, then that should work.  I tried briefly, but
ld didn't like it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Add a couple helpers
Barret Rhoden [Tue, 26 Sep 2017 19:40:43 +0000 (15:40 -0400)]
parlib: Add a couple helpers

Including to misc-compat.h.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoDocumentation: document running go test with u-root
Ronald G. Minnich [Fri, 15 Sep 2017 16:34:23 +0000 (09:34 -0700)]
Documentation: document running go test with u-root

This documents how to package up an initramfs with u-root
to run go test. You can also use these instructions to package
up anything.

Change-Id: If1c15ed0fa5ee75127686c7c335cad8d3d8847b9
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[ trailing whitespace ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRemove deprecated/unused define in linuxemu.h
Zach Zimmerman [Fri, 22 Sep 2017 21:55:03 +0000 (14:55 -0700)]
Remove deprecated/unused define in linuxemu.h

We no longer need MAX_GPCs as gpcores are managed
by our vmm.

Change-Id: I0319345caa9620ca42f4e49d0bdc4f66e37ab684
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: tcp: Enforce reasonable 'acked' values
Barret Rhoden [Tue, 19 Sep 2017 18:56:07 +0000 (14:56 -0400)]
net: tcp: Enforce reasonable 'acked' values

If the distant end ACKs something outside the window, specifically an ACK
of 0 or less than una (perhaps out-of-order packets?), then 'acked' would
be negative.  That throws off everything, especially the qdiscard() call.
Then if qdiscard() does discard all of 'acked' (which it won't for negative
or very large 'acked'), it'll decrement flgcnt.  That will lead to us
sending FINs and advancing our seq by MTU, though the packets themselves
will have little data (unless we wanted to send something).

In short, madness.

I noticed this when a Layer 1 problem was causing a lot of packet loss.
It'd be nice to run Akaros on NS or some other simulator and see what
happens.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdded miscellaneous syscalls to linuxemu
Zach Zimmerman [Tue, 19 Sep 2017 00:09:12 +0000 (17:09 -0700)]
Added miscellaneous syscalls to linuxemu

These syscalls are implemented as a baseline
to get minimal functionality. They do not all work
in the general case.

Added rudimentary implementations for the following
additional system calls:

mincore
sigprocmask
sigaltstack
sigaction
epoll_create
epoll_wait
epoll_ctl
fstatfs
getgroups
geteuid
getegid
getuid
getgid
sched_getaffinity

Change-Id: I2f7b7517bda6e95dccab78d433e8bd267071fdc9
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoImplemented additional syscalls in linuxemu
Zach Zimmerman [Mon, 11 Sep 2017 18:54:01 +0000 (11:54 -0700)]
Implemented additional syscalls in linuxemu

Implemented fstat, stat, fallocate.
Implemented sleep functions features for pselect6
Implemented basic features of getrandom

Change-Id: Ia2b2d39f30155ee05c5a10ebdbcf9a053d0f2e7f
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRemove the frontend appserver code
Barret Rhoden [Sat, 16 Sep 2017 15:03:14 +0000 (11:03 -0400)]
Remove the frontend appserver code

The frontend code was for working with the RISC-V and SPARC boards.
Whenever we ever resurrect the RISC-V port, we can add support for
whatever they are using then.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRemove unused virtualization code
Barret Rhoden [Sat, 16 Sep 2017 14:56:13 +0000 (10:56 -0400)]
Remove unused virtualization code

I looked for any .c file that wasn't in a Kbuild, excluding the Linux
mlx4 and bnx2x drivers.  I also scanned the header files and checked any
suspcious ones to see if they were #included and used.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Added more syscalls and helpers to linuxemu
Zach Zimmerman [Fri, 8 Sep 2017 18:51:55 +0000 (11:51 -0700)]
vmm: Added more syscalls and helpers to linuxemu

Added the open, openat, unlinkat, readlinkat,
close, and sched_yield syscalls.

Added helpers and structures to manage fds and
file paths opend in linuxemu.

Fixed typing issue: mmap_file memsize and offset
params should be size_t

Change-Id: I7dafb65068189de706f849c41fb628267f558342
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
[ vmm tag and merge conflict ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Add vthread_test
Barret Rhoden [Wed, 13 Sep 2017 21:14:43 +0000 (17:14 -0400)]
vmm: Add vthread_test

This creates and joins on a few threads, basically a 'hello world.'  It
also has examples of vthread apps adding their own vmcalls.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Support basic vthread syscalls
Barret Rhoden [Wed, 13 Sep 2017 18:45:14 +0000 (14:45 -0400)]
vmm: Support basic vthread syscalls

You can extend these if you want (example forthcoming), but most generic
vthread apps will want some basic vmcalls.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Add vthread_join()
Barret Rhoden [Wed, 13 Sep 2017 17:31:41 +0000 (13:31 -0400)]
vmm: Add vthread_join()

The main idea is surprisingly easy - the controller needs to call
uth_2ls_thread_exit(), which is what normal threads call when they exit.
This is normally hidden by the 2LS.

A vthread can exit by making a vmcall, then the controller exits on its
behalf.  The joiner actually joins on the controller (which is a uthread),
instead of the guest_thread.

The slightly tricky part was getting the uthreads to be reinitialized
properly, and noting that the join exit callback is called from vcore
context.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Allow dynamic vthread creation
Barret Rhoden [Tue, 12 Sep 2017 17:31:03 +0000 (13:31 -0400)]
vmm: Allow dynamic vthread creation

Previously, when we first mucked with vthreads, we'd have to create all the
vthreads / GPCs / guest_threads in advance.  Now we can create them on the
fly.

vthread_alloc() also takes the GPCI, which is split out as another step.
The GPCIs are used for each individual GPC, and the guest_thread will
maintain the copy of the GPCI.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Rename root_mtx
Barret Rhoden [Thu, 14 Sep 2017 20:20:49 +0000 (16:20 -0400)]
vmm: Rename root_mtx

I'll need to use it for something else.  If it becomes a problem, we can
split the mutex up, or just not use it at all for the page tables (just map
it all).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Overhaul how vthread_create works
Barret Rhoden [Mon, 11 Sep 2017 21:56:48 +0000 (17:56 -0400)]
vmm: Overhaul how vthread_create works

vthread_attr_init() is gone.  That was a vestige of the "let me create the
threads implicitly and then have them ready later."

This splits vthread_create() into several helpers: allocation, context
initialization, and running.  The important part is splitting the
"creation" (allocation, setup, etc) from actually running it.

Some users, like dune, want to do stuff to the context after creating it,
but before creating the thread.  That's a mess.  You shouldn't access the
vm_tf before the thread was created!  We were getting by because we
declared the max number of vthreads in advance.

The old vthread_create() still works, though it returns a pointer to the
thread instead of success/fail.  It's just a convenience wrapper calling
the helpers.  It still takes the gpcid (guest), but that will change
shortly.  I kept the name intact, since it's similar to what people expect
from e.g. pthread_create.

As a side note, it was a bad sign that we didn't have a vthread struct or
header.  We might end up making vthreads more distinct from VMs in the
future.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Move the vmcall overrides to the VM struct
Barret Rhoden [Mon, 11 Sep 2017 20:49:57 +0000 (16:49 -0400)]
vmm: Move the vmcall overrides to the VM struct

The proximate cause of this is that vthreads is trying to set this before
creating the thread.  That's relying on the internals of vthreads having
actually made all the threads in advance.

Given that there's probably not a need to have the vmcall per vthread, we
can just do it per VM.  This also puts the vmcall hook right next to the
halt_exit hook.

Further, we don't need to copy the halt_exit hook to the gth either.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Allow dynamic growth of __gths
Barret Rhoden [Mon, 11 Sep 2017 20:23:56 +0000 (16:23 -0400)]
vmm: Allow dynamic growth of __gths

Right now the main vmm code doesn't use this.  There's really no need for
actual virtual machines.  Vthreads will use this later.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Use a helper for all gth lookups
Barret Rhoden [Mon, 11 Sep 2017 19:59:39 +0000 (15:59 -0400)]
vmm: Use a helper for all gth lookups

With one central lookup helper, I can grow the list dynamically.  I used
the compiler to find these cases, hence the name change of gths -> __gths.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Moves gpci into guest_thread
Barret Rhoden [Mon, 11 Sep 2017 19:41:08 +0000 (15:41 -0400)]
vmm: Moves gpci into guest_thread

It's a minor pain.  GPCI's are coupled 1:1 with guest threads.  However,
the info for their contents comes from vmrunkernel, not from libvmm (yet).
So for now, the GPCIs are passed to libvmm, which will make copies.

Overall, I want to cut down on the amount of lookups for structures based
on guest_pcoreid, since we'll soon have dynamically growing GPC lists.
That will require delicate synchronization, and I only want that in a few
places.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Move user_data to struct guest_thread (XCC)
Barret Rhoden [Mon, 11 Sep 2017 19:19:16 +0000 (15:19 -0400)]
vmm: Move user_data to struct guest_thread (XCC)

There's no need for it to be part of the gpci.  Soon, gpci will also hang
off the guest thread, as part of the "dynamic guest thread" changes.

This required a little cleanup for the VM LAPIC timer/alarms.  It's easier
to pass around pointers to the guest threads, since the gth can easily give
you the gpc_id and gpci.

Reinstall your kernel headers.

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