6 years agoDon't try to reassemble IP_DF marked packets
Andrew Gallatin [Fri, 20 Jun 2014 18:44:40 +0000 (11:44 -0700)]
Don't try to reassemble IP_DF marked packets

Most modern TCP stacks mark TCP/IPv4 packets with IP_DF.
So, in addition to checking if the frags field is clear,
also check if the packet is marked as IP_DF, and bypass
reassembly if that is the case.

This improves perf by about ~150Mb/s for an rx heavy workload on a
10GbE NIC.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoAllow hardware devices to pad frames to mintu
Andrew Gallatin [Fri, 20 Jun 2014 14:25:46 +0000 (07:25 -0700)]
Allow hardware devices to pad frames to mintu

Rather than reallocating & copying frames to pad them
to 60 bytes (ethernet mintu), introduce a new feature NETF_PADMIN,
which a device can declare if it is capable of padding frames to
the min mtu.  If a device is not capable, we pad the frame just before
handing it to the device.

Reviewed-by: rminnich@gmail.com
Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoImplement transmit checksum offload.
Andrew Gallatin [Thu, 19 Jun 2014 19:29:11 +0000 (12:29 -0700)]
Implement transmit checksum offload.

The basic strategy is to put the pseudo hdr sum into the packet
at the TCP/UDP layer and assume we can do checksum offload.
Then when we know we cannot do checksum offload (ip frags,
sending on ether medium to a device which cannot offload,
or sending on a non-loopback medium), we complete the full

I have only implemented hardware checksum offload on
an out-of-tree device.

Reviewed-by: rminnich@gmail.com
Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoAdd a client script for running go programs remotely
Kevin Klues [Thu, 19 Jun 2014 00:57:33 +0000 (17:57 -0700)]
Add a client script for running go programs remotely

6 years agoAccidental comment now uncommented
Kevin Klues [Wed, 18 Jun 2014 23:44:52 +0000 (16:44 -0700)]
Accidental comment now uncommented

6 years agoOnly go into 9ns branch for certaion error codes
Kevin Klues [Wed, 18 Jun 2014 23:22:13 +0000 (16:22 -0700)]
Only go into 9ns branch for certaion error codes

Things like mkdir and were failing in busybox because the error codes
they were receiving were incorrect.  This fix should address that.

6 years agoFixes rm -r (XCC)
Barret Rhoden [Wed, 18 Jun 2014 18:50:49 +0000 (11:50 -0700)]
Fixes rm -r (XCC)

The root of the issue is the use of successive readdirs concurrent with
modifications of the underlying directory.  Coreutils's rm handles this
(via the fts_ family of functions) by reading in the entire directory
before removing.  So I'll stick with the current behavoir: if you do
that, unexpected things will happen, and just have busybox rewind after
each rm.

You'll need to rebuild glibc, after copying over the new file.

You'll also need to rebuild busybox, after applying the patch.

6 years agolisten1 cleans up its children
Barret Rhoden [Tue, 17 Jun 2014 23:44:04 +0000 (16:44 -0700)]
listen1 cleans up its children

6 years agox86: fixes lock debug issues with the new core_id
Barret Rhoden [Tue, 17 Jun 2014 22:34:51 +0000 (15:34 -0700)]
x86: fixes lock debug issues with the new core_id

When spinlock debugging, we would do a core_id_early call and get gibberish
back.  This was because core_id_ready was set (it was being set once the LAPIC
was available, and not when the segmentation stuff was available).  Instead,
we'd get a garbage address and fault enough to reboot the machine.

The fix is to not start using core_id too early.

In doing so, we also expose an issue with the lock debugger being used.  The
older LAPIC styles were ready earlier than smp_boot (in vm_init()).  Now,
core_id isn't ready til the smp boot is mostly done.  In the meantime, the
non-zero cores will think they are core 0, which means all of them share a
pcpui->lock_depth.  Those cores are running concurrently, and the
pcpui->lock_depth isn't protected in any way.  Eventually, we'd screw up the
lock depth.  The fix there is to just not debug locks for a little while.

6 years agoFixes warning in pthread.c
Barret Rhoden [Tue, 17 Jun 2014 21:07:08 +0000 (14:07 -0700)]
Fixes warning in pthread.c

Reworks the code slightly to just cast to a uthread right away, instead of
casting or otherwise mucking around each time it is used.

6 years agoadd the listen1 command.
Ronald G. Minnich [Tue, 17 Jun 2014 22:22:21 +0000 (15:22 -0700)]
add the listen1 command.

To use this command, e.g.
listen1 tcp!*!23 /bin/ash

Listens on port 23. The best thing we've found to talk to
it is netcat.

To make it available to localhost at 5555
qemu ... \
-net user,hostfwd=tcp::5555-:23 \

to talk to it:
netcat localhost 5555

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoTurn noisy vfs debugging code into printds
Kevin Klues [Thu, 12 Jun 2014 23:56:34 +0000 (16:56 -0700)]
Turn noisy vfs debugging code into printds

6 years agoBreak out of open without checking 9ns if EEXIST
Kevin Klues [Thu, 12 Jun 2014 19:38:16 +0000 (12:38 -0700)]
Break out of open without checking 9ns if EEXIST

6 years agoConfig option for kernel stack size (XCC)
Barret Rhoden [Thu, 12 Jun 2014 19:02:02 +0000 (12:02 -0700)]
Config option for kernel stack size (XCC)

Use the big stacks if you want to play it safe (the default).  I'm using
the small stacks.  If you do use the small stacks, if you have weird
crashes or panics, try toggling this setting.

Technically, this changes a kernel header, though userspace wasn't using
the KSTACK #defines, so don't worry about it.

6 years agoSlimmer setjmps
Barret Rhoden [Thu, 12 Jun 2014 17:41:43 +0000 (10:41 -0700)]
Slimmer setjmps

AFAIK, the returns_twice tells the compiler to not expect any
caller-saved registers to still be valid.  The handmade asm clobber
tells the compiler not to trust any callee-saved registers either.  The
compiler might be allowed to save and restore the registers across that
asm volatile, but it doesn't seem to do so.

The clobbering of the callee-saved registers was necessary; despite the
language of the returns_twice attribute, which does not make a
distinction between caller-saved and callee-saved.

In addition to faster waserrors, this leads to smaller errbufs, which
leads to kthreads using less stack space.  Ultimately, we'll be able to
go back to single-page kthread stacks.

6 years agox86: even faster core_id()s with segmentation
Barret Rhoden [Thu, 12 Jun 2014 04:32:46 +0000 (21:32 -0700)]
x86: even faster core_id()s with segmentation

The old slow core_id reads, using the LAPIC and the os_coreid() lookup
took about 50 TSC ticks per core_id() call (avg time in a for loop of
100000 calls).

The rdtscp option (the old FAST_COREID) was about 30 ticks.

The segmentation lookup is 1 tick.

rdtscp still has the pcoreid in ecx, so that userspace can use it.

6 years agoCheck the uthread flags for trigger_posix_signal
Barret Rhoden [Tue, 10 Jun 2014 21:25:25 +0000 (14:25 -0700)]
Check the uthread flags for trigger_posix_signal

I think there are some circumstances where current will be set, but the context
is still saved (in the uthread) instead of in the VCPD.

6 years agoDon't panic on invalid syscall numbers
Barret Rhoden [Tue, 10 Jun 2014 21:00:47 +0000 (14:00 -0700)]
Don't panic on invalid syscall numbers

It's a user bug, not a kernel bug.  We print out some helpful things to debug
userspace too.

6 years agoFixes network stats printf strings
Barret Rhoden [Tue, 10 Jun 2014 19:09:24 +0000 (12:09 -0700)]
Fixes network stats printf strings

All of these protocols are using u32s for their stats and other stuff.  The
format strings were looking for longs instead of ints.  This fixes them to use ints.

Alternatively, we could change the stats fields to u64.  I'm indifferent.

I didn't both changing any of the protocols that we don't use or even compile.

6 years agoFix printing of udp stats
Ronald G. Minnich [Tue, 10 Jun 2014 18:42:24 +0000 (11:42 -0700)]
Fix printing of udp stats

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoFixes compile bug with TRACE_LOCKS
Barret Rhoden [Tue, 10 Jun 2014 17:49:53 +0000 (10:49 -0700)]
Fixes compile bug with TRACE_LOCKS

Bug added by dd7d3f0, when the irq_state variable was moved into an 'if' block.

6 years agoFix up alarm and pvcalarm tests
Kevin Klues [Tue, 10 Jun 2014 16:33:45 +0000 (09:33 -0700)]
Fix up alarm and pvcalarm tests

It appears that qeum doesn't properly virtualize the tsc accross vcores,
so calling read_tsc() in a situation where our vcores are actually
multiplexed on top of a single underlying linux task results in
incorrect values. The assertions in these tests have been changed to
make sure that AT LEAST the amount of time we expect has passed in real
time, rather than relying on the time counted per vcore.

6 years agocleanup: remove redundant includes left over from script.
Ronald G. Minnich [Mon, 9 Jun 2014 15:08:27 +0000 (08:08 -0700)]
cleanup: remove redundant includes left over from script.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoSpeed up ptclbsum
Andrew Gallatin [Fri, 6 Jun 2014 22:44:58 +0000 (15:44 -0700)]
Speed up ptclbsum

Bring in the 64-bit checksum routine that originated in
NetBSD/alpha, and then came into FreeBSD/alpha and was used for
many of its 64-bit platforms including amd64.  This speeds
up non-checksum offload paths (like UDP transmit) by about 5%.

6 years agoSpeed up memmove on x86
Andrew Gallatin [Fri, 6 Jun 2014 21:56:11 +0000 (14:56 -0700)]
Speed up memmove on x86

Take an asm bcopy (which has the same overlapping semantics
as memmove) from FreeBSD.  This speeds up netperf by anywhere
from 25-40% on x86_64

Note:  I also brought in a copy for i686, but i686 does not
compile due to other prolems in the tree, so I was unable to test it.

6 years agoDon't zero new blocks.
Andrew Gallatin [Fri, 6 Jun 2014 18:43:57 +0000 (11:43 -0700)]
Don't zero new blocks.

Avoid zeroing new blocks.  This has a real cost at 10GbE speeds

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoIncrease the UDP buffer size.
Andrew Gallatin [Fri, 6 Jun 2014 18:42:24 +0000 (11:42 -0700)]
Increase the UDP buffer size.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoEnable UDP checksum offload.
Andrew Gallatin [Fri, 6 Jun 2014 18:37:07 +0000 (11:37 -0700)]
Enable UDP checksum offload.

Enable UDP csum offload for IPv4.  This is good for a few
hundred Mb/s performance improvement for netperf -tUDP_STREAM
tests using a 10GbE NIC.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoUse larger queue sizes for faster NICs
Andrew Gallatin [Fri, 6 Jun 2014 18:31:06 +0000 (11:31 -0700)]
Use larger queue sizes for faster NICs

Use larger queue sizes for 1GbE and 10GbE interfaces.  This fixes
soft overflow drops on a 10GbE interface I've been using.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoProperly set the siginfo errno on SIGSEGV
Kevin Klues [Sat, 7 Jun 2014 19:45:00 +0000 (12:45 -0700)]
Properly set the siginfo errno on SIGSEGV

Also explciitly set the signal number (though this will be set
underneath anyway).

6 years agoDon't wait on stdin if read count 0
Kevin Klues [Sat, 7 Jun 2014 06:19:38 +0000 (23:19 -0700)]
Don't wait on stdin if read count 0

6 years agoAlso send SIGSEGV on EACCES fault
Kevin Klues [Sat, 7 Jun 2014 05:19:59 +0000 (22:19 -0700)]
Also send SIGSEGV on EACCES fault

6 years agoSignal with different u_ctx if current_uthread set
Kevin Klues [Sat, 7 Jun 2014 02:49:19 +0000 (19:49 -0700)]
Signal with different u_ctx if current_uthread set

When current uthread is set, we should not use the ctx attached to the
uthread, but rather the one stored in the vcpd.

6 years agoFixes alarm pcpu printing
Barret Rhoden [Thu, 5 Jun 2014 22:43:45 +0000 (15:43 -0700)]
Fixes alarm pcpu printing

The old alarm code (from last week) had the sem and the func in separate
memory; now they are a union.  We were printing the func as if it was a

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

6 years agoAllow printing when the kernel faults
Barret Rhoden [Thu, 5 Jun 2014 22:42:11 +0000 (15:42 -0700)]
Allow printing when the kernel faults

On occasion, printk faults due to other bugs.  It does so when holding
the output_lock, and then the fault handler deadlocks since it can't
print anything.

This just disables print locking when the kernel is in a trap context,
which almost always is a bug that we want to hear about.

6 years agoSCP syscalls can be aborted
Barret Rhoden [Thu, 5 Jun 2014 22:20:41 +0000 (15:20 -0700)]
SCP syscalls can be aborted

Thanks to Drew for this patch.

6 years agoBSD sockets UDP uses 'headers' for all packets
Barret Rhoden [Thu, 5 Jun 2014 20:40:36 +0000 (13:40 -0700)]
BSD sockets UDP uses 'headers' for all packets

BSD sockets wants to do both:
socket, bind, {sendto,recvfrom}
socket, bind, connect, {send,recv}

'headers' mode allows us to blindly sendto and recvfrom.  The last
chance we have to set this is in bind (though it makes more sense to do
so in socket).

We can only announce or connect once.  To be able to receive, we need to
have announced by the end of bind so that our entry is in the hash
table before the application knows which local port we're on.  So we'll
never be able to connect after doing a bind.

Connect still sets the sockets raddr (in the Rock), so all of our
send/recv calls will just go through sendto/recvfrom, and extract the
raddr from the Rock and put it in the 'headers'.

We could consider having calls to connect() clear the headers, and then
connect as normal, but that would require the kernel to let us change
from announced to connected.  I'm not willing to do that yet.

Also, this way, we can connect multiple times, changing the default
remote end, which is what you're supposed to be able to do.  You can't
send multiple connect messages to the kernel.

Note that the Rock code is not threadsafe, and that every send/recv
needs to extract the rock, which is O(number of rocks/fds).

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

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

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

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

Also added a utest to test this stuff.

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

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

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

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

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

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

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

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

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

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

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

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

Just need a read (with appropriate ordering).

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

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

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

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

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

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

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

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

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

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

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

For upcoming event handler registration.

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

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

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

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

6 years agoFix synchronization bug in pvcalarms
Kevin Klues [Mon, 2 Jun 2014 07:39:22 +0000 (00:39 -0700)]
Fix synchronization bug in pvcalarms

When refactoring code before the initial commit, I just left the
__vcore_preamble() function calling return when the service was
disabled.  The body of this function used to copied into the places
where the call sites now are, so it was previously THOSE functions that
would return, not some underlying call.  Doh.  Should be fixed now.

6 years agoNeed to cd into user/utest to do proper make clean
Kevin Klues [Mon, 2 Jun 2014 07:01:03 +0000 (00:01 -0700)]
Need to cd into user/utest to do proper make clean

6 years agoAdd specific target for cleaning the utests
Kevin Klues [Mon, 2 Jun 2014 06:48:03 +0000 (23:48 -0700)]
Add specific target for cleaning the utests

6 years agoVC_PRIVATE instead of INDIR events for pvcalarms
Kevin Klues [Mon, 2 Jun 2014 05:57:09 +0000 (22:57 -0700)]
VC_PRIVATE instead of INDIR events for pvcalarms

6 years agoA utest for the pvcalarm service
Kevin Klues [Sun, 1 Jun 2014 22:54:04 +0000 (15:54 -0700)]
A utest for the pvcalarm service

6 years agoImplementation of a per-vcore alarm service
Kevin Klues [Sun, 1 Jun 2014 22:53:22 +0000 (15:53 -0700)]
Implementation of a per-vcore alarm service

6 years agoAdd helpers for vcore_account_uptime()
Kevin Klues [Sun, 1 Jun 2014 22:13:59 +0000 (15:13 -0700)]
Add helpers for vcore_account_uptime()

These helpers calculate the total uptime of the vcore, i.e. the time
that the vcore was held by the the MCP, excluding any time it was

6 years agoBug fix in grow function and race fix in dispatcher
Kevin Klues [Sun, 1 Jun 2014 17:59:13 +0000 (10:59 -0700)]
Bug fix in grow function and race fix in dispatcher

6 years agoAdd a dispatcher for the alarm event
Kevin Klues [Fri, 30 May 2014 23:23:42 +0000 (16:23 -0700)]
Add a dispatcher for the alarm event

Every event has only a single event handler registered for it in the
ev_handlers array.  The alarm dispatcher sets ev_handler[EV_ALARM] to a
dispatcher function, which dispatches alarm events to registered
handlers keyed by alarmid.

This component ws built mostly in preparation for the addition of a
per-vcore alarm service that will need this dispatching functionality.

6 years agoAdd alarm test into utests
Kevin Klues [Fri, 30 May 2014 23:01:26 +0000 (16:01 -0700)]
Add alarm test into utests

6 years agoFixes PF bug in devsrv
Barret Rhoden [Thu, 29 May 2014 21:04:41 +0000 (14:04 -0700)]
Fixes PF bug in devsrv

This was a little disturbing.  It's a simple bug, but I thought the
compiler used to catch these.  Do these sorts of things get ignored now
that we're using -fplan9-extensions?

6 years agox86: disables lock debugging when handling PFs
Barret Rhoden [Thu, 29 May 2014 17:11:37 +0000 (10:11 -0700)]
x86: disables lock debugging when handling PFs

Needs some work.  It's only necessary right now for kernel page faults,
not user ones, since user page faults don't increment the kernel trap

RISCV may need to do something similar.

6 years agoGo command to translate #K/oprofile to pprof format.
Ronald G. Minnich [Thu, 29 May 2014 15:02:53 +0000 (08:02 -0700)]
Go command to translate #K/oprofile to pprof format.

This works. Turns out addr2line is a piece of @@@@, which means that
we're still not seeing symbol names in go tool pprof. One problem at a

Note that when we move to using ticks, not ns, for kpoprofile, this
will have to change too.

6 years agoRemoves tests/prof_test.c
Barret Rhoden [Wed, 28 May 2014 20:48:41 +0000 (13:48 -0700)]
Removes tests/prof_test.c

6 years agoprof: samples userspace PCs
Barret Rhoden [Wed, 28 May 2014 20:47:48 +0000 (13:47 -0700)]
prof: samples userspace PCs

6 years agoprof: backtrace the interrupted context
Barret Rhoden [Wed, 28 May 2014 19:18:26 +0000 (12:18 -0700)]
prof: backtrace the interrupted context

Just calling backtrace on the current context just gave us the IRQ's BT,
which is just handle_irq, timer_interrupt, etc.  We actually want the
context that we interrupted, such as the kernel executing a syscall or

6 years agoHelpers for extracting PC/FP from hwtfs
Barret Rhoden [Wed, 28 May 2014 19:16:38 +0000 (12:16 -0700)]
Helpers for extracting PC/FP from hwtfs

This might not work, depending on how RISCV works.  In which case, we'll
need to adjust our BT functions.

6 years agoprof: fixes backtrace
Barret Rhoden [Wed, 28 May 2014 17:56:51 +0000 (10:56 -0700)]
prof: fixes backtrace

And cleans up a bit.  Two main things:
- The BT was jumping back too far
- We were writing out the full BT depth, even if the BT slots were
  empty.  They happened to be 0 for now, since the memory was fresh,
  but would be gibberish later.  They also took up extra space.

6 years agooprofile: change data format for #K/kpoprofile
Ronald G. Minnich [Wed, 28 May 2014 15:00:35 +0000 (08:00 -0700)]
oprofile: change data format for #K/kpoprofile

It now has a header descriptor, a time in ns, and 1
or more EIP values.

first word
high 8 bits is ee, which is an invalid address on amd64.
next 8 bits is protocol version
next 16 bits is unused, MBZ. Later, we can make it a packet type.
next 16 bits is core id
next 8 bits is unused
next 8 bits is # words following, should be > 0.

second word is time in ns.

Third and following words are PCs, there must be at least one of them.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoJenkins: lously lapic timer set incorrectly for launcher
Kevin Klues [Wed, 28 May 2014 04:06:21 +0000 (21:06 -0700)]
Jenkins: lously lapic timer set incorrectly for launcher

6 years agoUtest: Give the test a little more time to complete
Kevin Klues [Wed, 28 May 2014 02:37:50 +0000 (19:37 -0700)]
Utest: Give the test a little more time to complete

6 years agoJenkins: Enable the lousy lapic timer since we don't have KVM
Kevin Klues [Wed, 28 May 2014 02:37:23 +0000 (19:37 -0700)]
Jenkins: Enable the lousy lapic timer since we don't have KVM

6 years agoRemove erroneous print statement
Kevin Klues [Wed, 28 May 2014 00:22:20 +0000 (17:22 -0700)]
Remove erroneous print statement

6 years agoImplement pthead_kill() and sigmask stuff for pthreads
Kevin Klues [Tue, 27 May 2014 23:24:49 +0000 (16:24 -0700)]
Implement pthead_kill() and sigmask stuff for pthreads

6 years agoFix bug in building files for utest
Kevin Klues [Tue, 27 May 2014 23:24:15 +0000 (16:24 -0700)]
Fix bug in building files for utest

6 years agoFixes KMSG IPI handling bug
Barret Rhoden [Tue, 27 May 2014 20:51:11 +0000 (13:51 -0700)]
Fixes KMSG IPI handling bug

Left over from the x86 change to not have IRQs globally disabled when running
IRQ handlers.

Note that even though RKMs are processed during a routine point, the lock still
needs to be irqsave.  The lock is grabbed from IRQ context, when sending
messages such as the alarm handler or the console IRQs.

6 years agooprof: Fixes warning and #includes
Barret Rhoden [Tue, 27 May 2014 17:18:21 +0000 (10:18 -0700)]
oprof: Fixes warning and #includes

6 years agooprofile
Ronald G. Minnich [Fri, 23 May 2014 22:18:18 +0000 (15:18 -0700)]

The oprofile tools are pretty hardwired to a certain directory structure
that is hard to recreate, and not clearly needed.

Change the output of #K/kpoprofile to the following:
bits 63-4, time in ns; 3-0, number PCs following
[an array of PCs]

I don't think we'll miss the 1 ns precision, because there's no way
we're that accurate. +- 16 ns is fine.

TRACEME now calls oprofile_add_backtrace, which adds the backtrace.

Sadly, we're not seeing any backtrace data, but our Go program finds this output
very easy to digest.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agooprofile: sampling works
Ronald G. Minnich [Fri, 23 May 2014 02:49:46 +0000 (19:49 -0700)]
oprofile: sampling works

ash /ifconfig
echo opstart > /prof/kpctl
do stuff
echo opstop > /prof/kpctl

cat /prof/kpoprofile > /whatever (or 9p place)

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agooprofile: add traceme to clock interrupt, fix bug.
Ronald G. Minnich [Fri, 23 May 2014 00:47:59 +0000 (17:47 -0700)]
oprofile: add traceme to clock interrupt, fix bug.

but nothing is traced yet.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoSteps to make oprofile more IRQ safe
Barret Rhoden [Fri, 23 May 2014 00:19:12 +0000 (17:19 -0700)]
Steps to make oprofile more IRQ safe

Might be missing some things still.

6 years agoTRACEME() helper for oprofile
Barret Rhoden [Fri, 23 May 2014 00:18:31 +0000 (17:18 -0700)]
TRACEME() helper for oprofile

6 years agoqibwrite() irqsafe queue block writes
Barret Rhoden [Fri, 23 May 2014 00:01:51 +0000 (17:01 -0700)]
qibwrite() irqsafe queue block writes

So we can push blocks from IRQ context.

6 years agobacktrace_list()
Barret Rhoden [Thu, 22 May 2014 23:28:25 +0000 (16:28 -0700)]

Extracts the backtrace into an array of PCs.

6 years agoset_frame_pointer() for reset stacks
Barret Rhoden [Thu, 22 May 2014 23:08:21 +0000 (16:08 -0700)]
set_frame_pointer() for reset stacks

Helps with backtraces, so we can check for FP = 0.

6 years agoKprof samples during the timer IRQ
Barret Rhoden [Thu, 22 May 2014 21:54:37 +0000 (14:54 -0700)]
Kprof samples during the timer IRQ

It's a bit cheap, since the timer won't rearm til we handle RKMs.  This means
that during heavy activity, we might not take the samples as frequently.  I've
got some ideas to fix this.  For now, we can at least get a sample from IRQ

6 years agox86: enables IRQs globally during IRQ handling
Barret Rhoden [Thu, 22 May 2014 21:00:16 +0000 (14:00 -0700)]
x86: enables IRQs globally during IRQ handling

This allows IRQs to be preempted by higher priority IRQs.  If handlers need
IRQs disabled, then they need to do so themselves.  IRQ-save spinlocks will
still work, since they disable IRQs on the CPU.

I don't have IRQs enabled during trap processing, notably page faults, yet.
It's probably okay to do so right around handle_page_fault(), though that's
tricky code.  I'll look in to turning it on if it becomes an issue.

6 years agox86: reorganizes IRQ/trap vectors (XCC)
Barret Rhoden [Thu, 22 May 2014 20:07:07 +0000 (13:07 -0700)]
x86: reorganizes IRQ/trap vectors (XCC)

LAPIC IRQs are now the highest priority interrupts on x86.  Bits 7:4 of the
vector define the priority class, and 3:0 are largely ignored.

Higher priority IRQs will interrupt lower priority ones, if CPU IRQs are
enabled.  For instance, a NIC IRQ handler that enables IRQs can be interrupted
by a local timer tick, which is useful for profiling.

You need to rebuild userspace apps.

Also note that while I changed the 32 bit code, we currently don't compile on
32 bit for a few minor reasons.

6 years agoAdd gross hack so we can see how big the oprofile queue is
Ronald G. Minnich [Thu, 15 May 2014 03:24:47 +0000 (20:24 -0700)]
Add gross hack so we can see how big the oprofile queue is

We really need a kprofgen, this is just ugly. FIXME.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoUgly script to add tracing.
Ronald G. Minnich [Thu, 15 May 2014 03:10:42 +0000 (20:10 -0700)]
Ugly script to add tracing.

This could be better but it's a start. I quick tested it with
ip and it seems to produce data.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoGet oprofile working more correctly.
Ronald G. Minnich [Thu, 15 May 2014 00:49:46 +0000 (17:49 -0700)]
Get oprofile working more correctly.

Do this:
echo opstart > /prof/kpctl
echo 8 > /prof/kpoprofile
echo 8 > /prof/kpoprofile
echo 8 > /prof/kpoprofile
echo opstop > /prof/kpctl
cat /prof/kpoprofile

This will return data in oprofile format. Shame that oprofile is obsolete,
this was so easy.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoGet things to work with new gcc
Ronald G. Minnich [Thu, 15 May 2014 00:49:07 +0000 (17:49 -0700)]
Get things to work with new gcc

Not the best way, disabling warnings, but the only one that's going to
work with 4.9

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoProc vcore list only has available vcores
Barret Rhoden [Thu, 15 May 2014 00:09:11 +0000 (17:09 -0700)]
Proc vcore list only has available vcores

Previously, you could see up to vcore 8 on an 8 core machine, even
though you could never get that last vcore.  This commit keeps the list
of vcores in sync with which vcores are available.

Right now, the rules for max_vcores is that it is set at process
creation and never changed.  The ksched could offer a process less than
the number of CG cores in the system, via the max_vcores() function.

6 years agoMonitor command: pip
Barret Rhoden [Thu, 15 May 2014 00:08:09 +0000 (17:08 -0700)]
Monitor command: pip

Short version of "procinfo pid".  I got tired of typing it.

6 years agoVcore timers are stored in ticks (XCC)
Barret Rhoden [Thu, 15 May 2014 00:03:26 +0000 (17:03 -0700)]
Vcore timers are stored in ticks (XCC)

Convert only when we actually care about the value.  Also renames

Reinstall your kernel headers.

6 years agoFixes vcore counters
Barret Rhoden [Wed, 14 May 2014 23:45:31 +0000 (16:45 -0700)]
Fixes vcore counters

I was a little tossed up about putting the accounting in map/unmap or
not.  It'd be correct (if we did a little more unmapping for SCPs), but
in the end I wanted to parallelize the work as much as possible.  Our
'for each' vcore loops are probably long enough as it is.

6 years agoSyscall debugging helper
Barret Rhoden [Wed, 14 May 2014 22:13:21 +0000 (15:13 -0700)]
Syscall debugging helper

Kfunc this from the monitor.  Helps when you want to know details about
a kthread sleeping on a semaphore.  If the process dies or the syscall
completes while you run this, you'll get garbage and might fault.

6 years agoSyscall string debugging
Barret Rhoden [Wed, 14 May 2014 22:07:38 +0000 (15:07 -0700)]
Syscall string debugging

When CONFIG'd, allows certain syscalls to store some text in the name of
its kthread.  You can see the name of a kthread when debugging
semaphores.  Each syscall needs to have its own message, as I've done
for read and open so far.