/* Copyright (c) 2013, 2014 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * lock_test: microbenchmark to measure different styles of spinlocks.
 *
 * to build on linux: (hacky)
 * $ gcc -O2 -std=gnu99 -fno-stack-protector -g tests/lock_test.c -lpthread \
 *    -lm -o linux_lock_test */

#define _GNU_SOURCE /* pthread_yield */

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <math.h>
#include <argp.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <string.h>

/* OS dependent #incs */
#ifdef __ros__

#include <parlib/parlib.h>
#include <parlib/vcore.h>
#include <parlib/timing.h>
#include <parlib/spinlock.h>
#include <parlib/mcs.h>
#include <parlib/arch/arch.h>
#include <parlib/event.h>

#include <parlib/tsc-compat.h>
#include <benchutil/measure.h>

#else

#include "../user/parlib/include/parlib/tsc-compat.h"
#include "misc-compat.h"
#include "linux-lock-hacks.h" /* TODO: have a build system and lib / C file */

#include "../user/benchutil/include/benchutil/measure.h"
#include "../user/benchutil/measure.c"

static void os_prep_work(pthread_t *worker_threads, int nr_threads)
{
	if (nr_threads > num_vcores())
		printf("WARNING: %d threads requested, but only %d cores available\n",
		       nr_threads, num_vcores());
}

static void os_post_work(pthread_t *worker_threads, int nr_threads)
{
	if (nr_threads > num_vcores())
		return;
	/* assuming we're taking cores 0..nr_threads, and we never move. */
	for (int i = 0; i < nr_threads; i++) {
		cpu_set_t cpuset;
		CPU_ZERO(&cpuset);
		CPU_SET(i, &cpuset);
		pthread_setaffinity_np(worker_threads[i], sizeof(cpu_set_t), &cpuset);
	}
}

#define print_preempt_trace(args...) {}

__thread int __vcore_context = 0;

#endif

/* TODO: There's lot of work to do still, both on this program and on locking
 * and vcore code.  For some of the issues, I'll leave in the discussion /
 * answers, in case it comes up in the future (like when I read this in 8
 * months).
 *
 * BUGS / COMMENTARY
 * 		Occasional deadlocks when preempting and not giving back!
 * 			- with the new PDRs style, though that doesn't mean the older styles
 * 			don't have this problem
 * 			- shouldn't be any weaker than PDR.  they all check pred_vc to see
 * 			if they are running, and if not, they make sure someone runs
 * 			- could be weaker if we have an old value for the lockholder,
 * 			someone outside the chain, and we made sure they ran, and they do
 * 			nothing (spin in the 2LS or something?)
 * 				no, they should have gotten a msg about us being preempted,
 * 				since whoever we turn into gets the message about us swapping.
 * 			- anyway, it's not clear if this is with MCSPDR, event delivery,
 * 			preemption handling, or just an artifact of the test (less likely)
 * 		why aren't MCS locks in uth_ctx getting dealt with?
 * 			- because the event is handled, but the lock holder isn't run.  the
 * 			preemption was dealt with, but nothing saved the lock holder
 * 			- any uthread_ctx lockholder that gets preempted will get
 * 			interrupted, and other cores will handle the preemption.  but that
 * 			uthread won't run again without 2LS support.  either all spinners
 * 			need to be aware of the 'lockholder' (PDR-style), or the 2LS needs
 * 			to know when a uthread becomes a 'lockholder' to make sure it runs
 * 			via user-level preempts.  If the latter, this needs to happen
 * 			atomically with grabbing the lock, or else be able to handle lots of
 * 			fake 'lockholders' (like round-robin among all of them)
 * 		why is the delay more than the expected delay?
 * 			because it takes ~2ms to spawn and run a process
 * 			could do this in a separate process, instead of a script
 * 				could also consider not using pth_test and changing prov, but
 * 				driving it by yields and requests.  would also test the
 * 				alarm/wakeup code (process sets alarm, goes to sleep, wakes up
 * 				and requests X cores)
 * 		why do we get occasional preempt-storms? (lots of change_tos)
 * 			due to the MCS-PDR chain, which i tried fixing by adjusting the
 * 			number of workers down to the number of vcores
 * 			why isn't the worker adaptation working?
 * 				- it actually was working, and nr_workers == nr_vcores.  that
 * 				just wasn't the root cause.
 * 				- was expecting it to cut down on PDR kernel traffic
 * 			- still get periods of low perf
 * 				like O(100) preempt msgs per big preempt/prov
 * 				does it really take that much to work out an MCS-PDR?
 * 			- one thing is that if we fake vc ctx, we never receive preemption
 * 			events.  might be a bad idea.
 * 				- in general, yeah.  faking VC and turning off events can really
 * 				muck with things
 * 				- these events aren't necessarily delivered to a VC who will
 * 				check events any time soon (might be the last one in the chain)
 * 				- the core of the issue is that we have the right amount of
 * 				workers and vcores, but that the system isn't given a chance to
 * 				stabilize itself.  also, if we have some VCs that are just
 * 				sitting around, spinning in the 2LS, if those get preempted, no
 * 				one notices or cares (when faking vc_ctx / getting no events)
 * 			- there is a slight race where we might make someone run who isn't a
 * 			lockholder.  logically, its okay.  worst case, it would act like an
 * 			extra preempt and different startcore, which shouldn't be too bad.
 *
 * 		sanity check: does throughput match latency? (2.5GHz TSC, MCS lock)
 * 			ex: 5000 locks/ms = 5 locks/us = 200ns/lock = 500 ticks / lock
 * 			500 ticks * 31 workers (queue) = 15000 ticks
 * 			avg acquire time was around 14K.  seems fine..
 * 			when our MCSPDR throughput tanks (during preempts), it's around
 * 			400-500 locks/ms, which is around 2us/lock.  
 * 				when the locker on a preempted chain shows up, it needs to
 * 				change to the next one in line. 
 * 					- though that should be in parallel with the other
 * 					lockholders letting go.  shouldn't be that bad
 * 					- no, it is probably at the head of the chain very soon,
 * 					such that it is the bottleneck for the actual lock.  2us
 * 					seems possible
 *
 * 		what does it take to get out of a preemption with (old) MCS-PDR?
 * 			- these are now called pdro locks (old)
 * 			- for a single preempt, it will take 1..n-1 changes.  avg n/2
 * 			- for multiple preempts, it's nr_pre * that (avg np/2, worst np)
 * 			- for every unlock/reacquire cycle (someone unlocks, then rejoins
 * 			the list), its nr_preempts (aka, nr_workers - nr_vcores)
 * 			- if we need to have a specific worker get out of the chain, on
 * 			average, it'd take n/2 cycles (p*n/2 changes)  worst: np
 * 			- if we want to get multiple workers out, the worst case is still
 * 			np, but as p increases, we're more likely to approach n cycles
 * 			- so the current model is np for the initial hit (to move the
 * 			offline VCs to the end of the chain) and another np to get our
 * 			specific workers out of the chain and yielding (2np)
 *
 * 			- but even with 1 preempt, we're getting 80-200 changes per
 *
 * 			- it shouldn't matter that the sys_change_to is really slow, should
 * 			be the same amount of changes.  however, the preempted ones are
 * 			never really at the tail end of the chain - they should end up right
 * 			before the lockholder often.  while the sys_change_tos are slowly
 * 			moving towards the back of the chain, the locking code is quickly
 * 			removing (online) nodes from the head and putting them on the back.
 *
 * 			- end result: based on lock hold time and lock delay time, a
 * 			preempted VC stays in the MCS chain (swaps btw VC/nodes), and when
 * 			it is inside the chain, someone is polling to make them run.  with
 * 			someone polling, it is extremely unlikely that someone outside the
 * 			chain will win the race and be able to change_to before the in-chain
 * 			poller.  to clarify:
 * 				- hold time and delay time matter, since the longer they are,
 * 				the greater the amount of time the change_to percolation has to
 * 				get the preempted VCs to the end of the chain (where no one
 * 				polls them).
 * 				- at least one vcore is getting the event to handle the
 * 				preemption of the in-chain, offline VC.  we could change it so
 * 				every VC polls the preempt_evq, or just wait til whoever is
 * 				getting the messages eventually checks their messages (VC0)
 * 				- if there is an in-chain poller, they will notice the instant
 * 				the VC map changes, and then immediately change_to (and spin on
 * 				the proclock in the kernel).  there's almost no chance of a
 * 				normal preempt event handler doing that faster.  (would require
 * 				some IRQ latency or something serious).
 * 			- adding in any hold time trashes our microbenchmark's perf, but a
 * 			little delay time actually helps: (all with no preempts going on)
 * 				- mcspdr, no delay: 4200-4400 (-w31 -l10000, no faking, etc)
 * 				- mcspdr, d = 1: 4400-4800
 * 				- mcspdr, d = 2: 4200-5200
 * 				- as you add delay, it cuts down on contention for the
 * 				lock->lock cacheline.  but if you add in too much, you'll tank
 * 				throughput (since there is no contention at all).
 * 				- as we increase the delay, we cut down on the chance of the
 * 				preempt storm / preempt-stuck-in-the-chain, though it can still
 * 				happen, even with a delay of 10us
 * 			- maybe add in the lockholder again? (removed in 73701d6bfb)
 * 				- massively cuts performance, like 2x throughput, without
 * 				preempts
 * 				- it's ability to help depends on impl:
 * 					in one version (old style), it didn't help much at all
 * 					- in another (optimized lockholder setting), i can't even
 * 					see the throughput hit, it recovered right away, with O(5)
 * 					messages
 * 					- the diff was having the lockholder assign the vcoreid
 * 					before passing off to the next in the chain, so that there
 * 					is less time with having "no lockholder".  (there's a brief
 * 					period where the lockholder says it is the next person, who
 * 					still spins.  they'll have to make sure their pred runs)
 * 			-adj workers doesn't matter either...
 * 				- the 2LS and preemption handling might be doing this
 * 				automatically, when handle_vc_preempt() does a
 * 				thread_paused() on its current_uthread.
 * 				- adj_workers isn't critical if we're using some locks
 * 				that check notif_pending.  eventually someone hears
 * 				about preempted VCs (assuming we can keep up)
 *
 * 			What about delays?  both hold and delay should make it easier to get
 * 			the preempted vcore to the end of the chain.  but do they have to be
 * 			too big to be reasonable?
 * 				- yes.  hold doesn't really help much until everything is
 * 				slower.  even with a hold of around 1.2us, we still have the
 * 				change_to-storms and lowered throughput.
 * 				- doing a combo helps too.  if you hold for 1ns (quite a bit
 * 				more actually, due to the overhead of ndelay, but sufficient to
 * 				be "doing work"), and delaying for around 7us before rejoining,
 * 				there's only about a 1/5 chance of a single preempt messing us
 * 				up
 * 					- though having multiple preempts outstanding make this less
 * 					likely to work.
 * 					- and it seems like if we get into the storm scenario, we
 * 					never really get out.  either we do quickly or never do.
 * 					depending on the workload, this could be a matter of luck
 *
 * 			So we could try tracking the lockholder, but only looking at it when
 * 			we know someone was preempted in the chain - specifically, when our
 * 			pred is offline.  when that happens, we don't change to them, we
 * 			make sure the lockholder is running.
 * 				- tracking takes us from 4200->2800 throughput or so for MCS
 * 				- 5200 -> 3700 or so for MCS in vc_ctx (__MCSPDR)
 * 				- main spike seems to be in the hold time.  bimodal distrib,
 * 				with most below 91 (the usual is everything packed below 70) and
 * 				a big spike around 320
 *
 * 	Summary:
 * 		So we need to have someone outside the chain change_to the one in the
 * 		chain o/w, someone will always be in the chain.  Right now, it's always
 * 		the next in line who is doing the changing, so a preempted vcore is
 * 		always still in the chain. 
 *
 * 		If the locking workload has some delaying, such as while holding the
 * 		lock or before reacquiring, the "change_to" storm might not be a
 * 		problem.  If it is, the only alternative I have so far is to check the
 * 		lockholder (which prevents a chain member from always ensuring their
 * 		pred runs).  This hurts the lock's scalability/performance when we
 * 		aren't being preempted.  On the otherhand, based on what you're doing
 * 		with the lock, one more cache miss might not be as big of a deal as in
 * 		lock_test.  Especially if when you get stormed, your throughput could be
 * 		terrible and never recover.
 *
 * 		Similar point: you can use spinpdr locks.  They have the PDR-benefits,
 * 		and won't induce the storm of change_tos.  However, this isn't much
 * 		better for contended locks.  They perform 2-3x worse (on c89) without
 * 		preemption.  Arguably, if you were worried about the preempt storms and
 * 		want scalability, you might want to use mcspdr with lockholders.
 *
 * 		The MCSPDRS (now just callced MCSPDR, these are default) locks can avoid
 * 		the storm, but at the cost of a little more in performance.  mcspdrs
 * 		style is about the same when not getting preempted from uth ctx compared
 * 		to mcspdr (slight drop).  When in vc ctx, it's about 10-20% perf hit
 * 		(PDRS gains little from --vc_ctx). 
 *
 * 		Turns out there is a perf hit to PDRS (and any non-stack based qnode)
 * 		when running on c89.  The issue is that after shuffling the vcores
 * 		around, they are no longer mapped nicely to pcores (VC0->PC1, VC1->PC2).
 * 		This is due to some 'false sharing' of the cachelines, caused mostly by
 * 		aggressive prefetching (notably the intel adjacent cacheline prefetcher,
 * 		which grabs two CLs at a time!).  Basically, stack-based qnodes are
 * 		qnodes that are very far apart in memory.  Cranking up the padding in
 * 		qnodes in the "qnodes-in-locks" style replicates this.
 *
 * 		For some info on the prefetching:
 * 			http://software.intel.com/en-us/articles/optimizing-application-performance-on-intel-coret-microarchitecture-using-hardware-implemented-prefetchers/
 * 			http://software.intel.com/en-us/forums/topic/341769
 *
 * 		Here's some rough numbers of the different styles for qnodes on c89.
 * 		'in order' is VCn->PC(n+1) (0->1, 1->2).  Worst order is with even VCs
 * 		on one socket, odds on the other.  the number of CLs is the size of a
 * 		qnode.  mcspdr is the new style (called mcspdrs in some places in this
 * 		document), with lock-based qnodes.  mcspdr2 is the same, but with
 * 		stack-based qnodes.  mcspdro is the old style (bad a recovery), stack
 * 		based, sometimes just called mcs-pdr
 *
 * 		with prefetchers disabled (MCS and DCU)
 * 			mcspdr   1CL  4.8-5.4 in order, 3.8-4.2 worst order
 * 			mcspdr   2CL          in order,         worst order
 * 			mcspdr   4CL  5.2-6.0 in order, 4.7-5.3 worst order
 * 			mcspdr   8CL  5.4-6.7 in order, 5.2-6.2 worst order
 * 			mcspdr  16CL  5.1-5.8 in order, 5.2-6.8 worst order
 * 			mcspdr2 stck          in order,         worst order
 * 			mcspdro stck  4-3.4.3 in order, 4.2-4.5 worst order
 * 			mcspdro-vcctx 4.8-7.0 in order, 5.3-6.7 worst order
 * 			can we see the 2 humps? 
 * 				mcspdr 1CL yes but less, varied, etc
 * 				mcspdr2 no
 *
 * 		test again with worst order with prefetchers enabled
 * 			mcspdr   1CL  3.8-4.0 in order, 2.6-2.7 worst order
 * 			mcspdr   2CL  4.2-4.4 in order, 3.8-3.9 worst order
 * 			mcspdr   4CL  4.5-5.2 in order, 4.0-4.2 worst order
 * 			mcspdr   8CL  4.4-5.1 in order, 4.3-4.7 worst order
 * 			mcspdr  16CL  4.4-4.8 in order, 4.4-5.3 worst order
 * 			mcspdr2 stck  3.0-3.0 in order, 2.9-3.0 worst order
 * 			mcspdro stck  4.2-4.3 in order, 4.2-4.4 worst order
 * 			mcspdro-vcctx 5.2-6.4 in order, 5.0-5.9 worst order
 * 			can we see the 2 humps?
 * 				mcspdrs 1CL yes, clearly
 * 				mcspdr2 no
 *
 * PROGRAM FEATURES
 * 		- verbosity?  vcoremap, preempts, the throughput and latency histograms?
 * 		- have a max workers option (0?) == max vcores
 * 		- would like to randomize (within bounds) the hold/delay times
 * 			- help avoid convoys with MCS locks
 *
 * PERFORMANCE:
 * 		pcore control?  (hyperthreading, core 0, cross socket?)
 * 			want some options for controlling which threads run where, or which
 * 			vcores are even used (like turning off hyperthreading)?
 * 		implement ticket spinlocks?  (more fair, more effects of preempts)
 * 			no simple way to do PDR either, other than 'check everyone'
 * 		MCS vs MCSPDR vs __MCSPDR
 * 			MCS seems slightly better than __MCSPDR (and it should)
 * 			MCSPDR is a bit worse than __MCSPDR
 * 				- the uth_disable/enable code seems to make a difference.
 * 				- i see why the latencies are worse, since they have extra work
 * 				to do, but the internal part that contends with other cores
 * 				shouldn't be affected, unless there's some other thing going on.
 * 				Or perhaps there isn't always someone waiting for the lock?
 * 				- faking VC ctx mostly negates the cost of MCSPDR vs __MCSPDR
 * 			things that made a big diff: CL aligning the qnodes, putting qnodes
 * 			on stacks, reading in the vcoreid once before ensuring()
 * 		both MCS CAS unlocks could use some branch prediction work
 * 		spinpdr locks are 2-3x faster than spinlocks...
 * 			test, test&set  vs the existing test&set, plus lots of asserts
 *
 * 		some delay (like 10us) lowers latency while maintaining throughput
 * 			- makes sense esp with MCS.  if you join the queue at the last
 * 			second, you'll measure lower latency than attempting right away
 * 			- also true for spinlocks
 * 			- we can probably figure out the max throughput (TP = f(delay)) for
 * 			each lock type
 *
 * 		hard to get steady numbers with MCS - different runs of the same test
 * 		will vary in throughput by around 15-30% (e.g., MCS varying from 3k-4k
 * 		L/ms)
 * 			- happens on c89 (NUMA) and hossin (UMA)
 * 			- spinlocks seem a little steadier.
 * 			- for MCS locks, the order in which they line up across the pcores
 * 			will matter.  like if on one run, i regularly hand off between cores
 * 			in the same socket and only do one cross-socket step
 * 			- run a lot of shorter ones to get a trend, for now
 * 			- might be correllated with spikes in held times (last bin)
 * 			- can't turn off legacy USB on c89 (SMM) - interferes with PXE
 *
 * PREEMPTS:
 * 		better preempt record tracking?
 * 			i just hacked some event-intercept and timestamp code together
 * 			maybe put it in the event library?
 * 			the timestamps definitely helped debugging
 *
 * 		is it true that if uthread code never spins outside a PDR lock, then it
 * 		doesn't need preemption IPIs?  (just someone checks the event at some
 * 		point). 
 * 			think so: so long as you make progress and when you aren't, you
 * 			check events (like if a uthread blocks on something and enters VC
 * 			ctx)
 * 		adjusting the number of workers, whether vcores or uthreads
 * 		- if you have more lockers than cores:
 * 			- spinpdr a worker will get starved (akaros) (without 2LS support)
 * 				- running this from uth context will cause a handle_events
 * 			- mcspdr will require the kernel to switch (akaros)
 * 			- spin (akaros) might DL (o/w nothing), (linux) poor perf
 * 			- mcs (akaros) will DL, (linux) poor perf
 * 			- poor perf (latency spikes) comes from running the wrong thread
 * 			sometimes
 * 			- deadlock comes from the lack of kernel-level context switching
 * 		- if we scale workers down to the number of active vcores:
 * 			- two things: the initial hit, and the steady state.  during the
 * 			initial hit, we can still deadlock, since we have more lockers than
 * 			cores
 * 				- non-pdr (akaros) could deadlock in the initial hit
 * 				- (akaros) steady state, everything is normal (just fewer cores)
 * 			- how can we adjust this in linux?
 * 				- if know how many cores you have, then futex wait the others
 * 				- need some way to wake them back up
 * 				- if you do this in userspace, you might need something PDR-like
 * 				to handle when the "2LS" code gets preempted
 * 			- as mentioned above, the problem in akaros is that the lock/unlock
 * 			might be happening too fast to get into the steady-state and recover
 * 			from the initial preemption
 * 		- one of our benefits is that we can adapt in userspace, with userspace
 * 		knowledge, under any circumstance.
 * 			- we have the deadlock windows (forcing PDR).
 * 			- in return, we can do this adaptation in userspace
 * 			- and (arguably) anyone who does this in userspace will need PDR
 *
 * MEASUREMENT (user/parlib/measure.c)
 * 		extract into its own library, for linux apps
 * 		print out raw TSC times?  might help sync up diff timelines
 * 		Need more latency bins, spinlocks vary too much
 * 		maybe we need better high/low too, since this hist looks bad too
 * 			or not center on the average?
 * 			for printing, its hard to know without already binning.
 * 			maybe bin once (latency?), then use that to adjust the hist?
 *
 * 		Had this on a spinlock:
 * 		[      32 -    35656] 1565231:
 * 		(less than 200 intermediate)
 * 	    [  286557 - 20404788]   65298: *
 *
 *		Samples per dot: 34782
 *		Total samples: 1640606
 *		Avg time   : 96658
 *		Stdev time : 604064.440882
 *		Coef Var   : 6.249503
 *			High coeff of var with serious outliers, adjusted bins
 *			50/75/90/99: 33079 / 33079 / 33079 / 290219 (-<860)
 *			Min / Max  : 32 / 20404788
 *		was 50/75/90 really within 860 of each other?
 *
 * 		when we are preempted and don't even attempt anything, say for 10ms, it
 * 		actually doesn't hurt our 50/75/90/99 too much.  we have a ridiculous
 * 		stddev and max, and high average, but there aren't any additional
 * 		attempts at locking to mess with the attempt-latency.  Only nr_vcores
 * 		requests are in flight during the preemption, but we can spit out around
 * 		5000 per ms when we aren't preempted.
 *
 */

const char *argp_program_version = "lock_test v0.1475263";
const char *argp_program_bug_address = "<akaros+subscribe@googlegroups.com>";

static char doc[] = "lock_test -- spinlock benchmarking";
static char args_doc[] = "-w NUM -l NUM -t LOCK";

#define OPT_VC_CTX 1
#define OPT_ADJ_WORKERS 2

static struct argp_option options[] = {
	{"workers",		'w', "NUM",	OPTION_NO_USAGE, "Number of threads/cores"},
	{0, 0, 0, 0, ""},
	{"loops",		'l', "NUM",	OPTION_NO_USAGE, "Number of loops per worker"},
	{0, 0, 0, 0, ""},
	{"type",		't', "LOCK",OPTION_NO_USAGE, "Type of lock to use.  "
	                                             "Options:\n"
	                                             "\tmcs\n"
	                                             "\tmcscas\n"
	                                             "\tmcspdr\n"
	                                             "\tmcspdro\n"
	                                             "\t__mcspdro\n"
	                                             "\tspin\n"
	                                             "\tspinpdr"},
	{0, 0, 0, 0, "Other options (not mandatory):"},
	{"adj_workers",	OPT_ADJ_WORKERS, 0,	0, "Adjust workers such that the "
	                                       "number of workers equals the "
	                                       "number of vcores"},
	{"vc_ctx",		OPT_VC_CTX, 0,	0, "Run threads in mock-vcore context"},
	{0, 0, 0, 0, ""},
	{"hold",		'h', "NSEC",	0, "nsec to hold the lock"},
	{"delay",		'd', "NSEC",	0, "nsec to delay between grabs"},
	{"print",		'p', "ROWS",	0, "Print ROWS of optional measurements"},
	{"outfile",		'o', "FILE",	0, "Print ROWS of optional measurements"},
	{ 0 }
};

struct prog_args {
	int							nr_threads;
	int							nr_loops;
	int							hold_time;
	int							delay_time;
	int							nr_print_rows;
	bool						fake_vc_ctx;
	bool						adj_workers;
	char						*outfile_path;
	void *(*lock_type)(void *arg);
};
struct prog_args pargs = {0};

/* Globals */
struct time_stamp {
	uint64_t pre;
	uint64_t acq;
	uint64_t un;
	bool valid;
};
struct time_stamp **times;
bool run_locktest = TRUE;
pthread_barrier_t start_test;

/* Locking functions.  Define globals here, init them in main (if possible), and
 * use the lock_func() macro to make your thread func. */

#define lock_func(lock_name, lock_cmd, unlock_cmd)                             \
void *lock_name##_thread(void *arg)                                            \
{                                                                              \
	long thread_id = (long)arg;                                                \
	int hold_time = ACCESS_ONCE(pargs.hold_time);                              \
	int delay_time = ACCESS_ONCE(pargs.delay_time);                            \
	int nr_loops = ACCESS_ONCE(pargs.nr_loops);                                \
	bool fake_vc_ctx = ACCESS_ONCE(pargs.fake_vc_ctx);                         \
	bool adj_workers = ACCESS_ONCE(pargs.adj_workers);                         \
	uint64_t pre_lock, acq_lock, un_lock;                                      \
	struct time_stamp *this_time;                                              \
	struct mcs_lock_qnode mcs_qnode = MCS_QNODE_INIT;                          \
	struct mcs_pdro_qnode pdro_qnode = MCSPDRO_QNODE_INIT;                     \
	int i;                                                                     \
	/* guessing a unique vcoreid for vcoreid for the __mcspdr test.  if the
	 * program gets preempted for that test, things may go nuts */             \
	pdro_qnode.vcoreid = thread_id + 1 % pargs.nr_threads;                     \
	/* Wait til all threads are created.  Ideally, I'd like to busywait unless
	 * absolutely critical to yield */                                         \
	pthread_barrier_wait(&start_test);                                         \
	if (fake_vc_ctx) {                                                         \
		/* tells the kernel / other vcores we're in vc ctx */                  \
		uth_disable_notifs();                                                  \
		/* tricks ourselves into believing we're in vc ctx */                  \
		__vcore_context = TRUE;                                                \
	}                                                                          \
	for (i = 0; i < nr_loops; i++) {                                           \
		if (!run_locktest)                                                     \
			break;                                                             \
		pre_lock = read_tsc_serialized();                                      \
                                                                               \
		lock_cmd                                                               \
                                                                               \
		acq_lock = read_tsc_serialized();                                      \
		if (hold_time)                                                         \
			ndelay(hold_time);                                                 \
                                                                               \
		unlock_cmd                                                             \
                                                                               \
		un_lock = read_tsc_serialized();                                       \
		this_time = &times[thread_id][i];                                      \
		this_time->pre = pre_lock;                                             \
		this_time->acq = acq_lock;                                             \
		this_time->un = un_lock;                                               \
		/* Can turn these on or off to control which samples we gather */      \
		this_time->valid = TRUE;                                               \
		/* this_time->valid = (num_vcores() == max_vcores());  */              \
                                                                               \
		if (delay_time)                                                        \
			ndelay(delay_time);                                                \
		/* worker thread ids are 0..n-1.  if we're one of the threads that's
		 * beyond the VC count, we yield. */                                   \
		if (adj_workers && num_vcores() < thread_id + 1) {                     \
			if (fake_vc_ctx) {                                                 \
				__vcore_context = FALSE;                                       \
				uth_enable_notifs();                                           \
			}                                                                  \
			/* we'll come back up once we have enough VCs running */           \
			pthread_yield();                                                   \
			if (fake_vc_ctx) {                                                 \
				uth_disable_notifs();                                          \
				__vcore_context = TRUE;                                        \
			}                                                                  \
		}                                                                      \
		cmb();                                                                 \
	}                                                                          \
	/* First thread to finish stops the test */                                \
	run_locktest = FALSE;                                                      \
	if (fake_vc_ctx) {                                                         \
		__vcore_context = FALSE;                                               \
		uth_enable_notifs();                                                   \
	}                                                                          \
	return (void*)(long)i;                                                     \
}

#define fake_lock_func(lock_name, x1, x2)                                      \
void *lock_name##_thread(void *arg)                                            \
{                                                                              \
	printf("Lock " #lock_name " not supported!\n");                            \
	exit(-1);                                                                  \
}

spinlock_t spin_lock = SPINLOCK_INITIALIZER;
struct mcs_lock mcs_lock = MCS_LOCK_INIT;

/* Defines locking funcs like "mcs_thread" */
lock_func(mcs,
          mcs_lock_lock(&mcs_lock, &mcs_qnode);,
          mcs_lock_unlock(&mcs_lock, &mcs_qnode);)
lock_func(mcscas,
          mcs_lock_lock(&mcs_lock, &mcs_qnode);,
          mcs_lock_unlock_cas(&mcs_lock, &mcs_qnode);)
lock_func(spin,
          spinlock_lock(&spin_lock);,
          spinlock_unlock(&spin_lock);)

#ifdef __ros__
struct spin_pdr_lock spdr_lock = SPINPDR_INITIALIZER;
struct mcs_pdr_lock mcspdr_lock;
struct mcs_pdro_lock mcspdro_lock = MCSPDRO_LOCK_INIT;

lock_func(mcspdr,
          mcs_pdr_lock(&mcspdr_lock);,
          mcs_pdr_unlock(&mcspdr_lock);)
lock_func(mcspdro,
          mcs_pdro_lock(&mcspdro_lock, &pdro_qnode);,
          mcs_pdro_unlock(&mcspdro_lock, &pdro_qnode);)
lock_func(__mcspdro,
          __mcs_pdro_lock(&mcspdro_lock, &pdro_qnode);,
          __mcs_pdro_unlock(&mcspdro_lock, &pdro_qnode);)
lock_func(spinpdr,
          spin_pdr_lock(&spdr_lock);,
          spin_pdr_unlock(&spdr_lock);)
#else

fake_lock_func(mcspdr, 0, 0);
fake_lock_func(mcspdro, 0, 0);
fake_lock_func(__mcspdro, 0, 0);
fake_lock_func(spinpdr, 0, 0);

#endif

static int get_acq_latency(void **data, int i, int j, uint64_t *sample)
{
	struct time_stamp **times = (struct time_stamp**)data;
	/* 0 for initial time means we didn't measure */
	if (times[i][j].pre == 0)
		return -1;
	/* can optionally throw out invalid times (keep this in sync with the
	 * lock_test macro, based on what you want to meaasure. */
	#if 0
	if (!times[i][j].valid)
		return -1;
	#endif
	*sample = times[i][j].acq - times[i][j].pre - get_tsc_overhead();
	return 0;
}

static int get_hld_latency(void **data, int i, int j, uint64_t *sample)
{
	struct time_stamp **times = (struct time_stamp**)data;
	/* 0 for initial time means we didn't measure */
	if (times[i][j].pre == 0)
		return -1;
	*sample = times[i][j].un - times[i][j].acq - get_tsc_overhead();
	return 0;
}

static int get_acq_timestamp(void **data, int i, int j, uint64_t *sample)
{
	struct time_stamp **times = (struct time_stamp**)data;
	/* 0 for initial time means we didn't measure */
	if (times[i][j].pre == 0)
		return -1;
	*sample = times[i][j].acq;
	return 0;
}

#ifdef __ros__

/* Lousy event intercept.  build something similar in the event library? */
#define MAX_NR_EVENT_TRACES 1000
uint64_t preempts[MAX_NR_EVENT_TRACES] = {0};
uint64_t indirs[MAX_NR_EVENT_TRACES] = {0};
atomic_t preempt_idx;
atomic_t indir_idx;
atomic_t preempt_cnt;
atomic_t indir_cnt;

static void trace_preempt(struct event_msg *ev_msg, unsigned int ev_type,
                          void *data)
{
	unsigned long my_slot = atomic_fetch_and_add(&preempt_idx, 1);
	if (my_slot < MAX_NR_EVENT_TRACES)
		preempts[my_slot] = read_tsc();
	atomic_inc(&preempt_cnt);
}

static void trace_indir(struct event_msg *ev_msg, unsigned int ev_type,
                        void *data)
{
	unsigned long my_slot = atomic_fetch_and_add(&indir_idx, 1);
	if (my_slot < MAX_NR_EVENT_TRACES)
		indirs[my_slot] = read_tsc();
	atomic_inc(&indir_cnt);
}

/* Helper, prints out the preempt trace */
static void print_preempt_trace(uint64_t starttsc, int nr_print_rows)
{
	/* reusing nr_print_rows for the nr preempt/indirs rows as well */
	int preempt_rows = MIN(MAX_NR_EVENT_TRACES, nr_print_rows);
	if (pargs.fake_vc_ctx) {
		printf("No preempt trace available when faking vc ctx\n");
		return;
	}
	printf("\n");
	printf("Nr Preempts: %d\n", atomic_read(&preempt_cnt));
	printf("Nr Indirs  : %d\n", atomic_read(&indir_cnt));
	if (preempt_rows)
		printf("Preempt/Indir events:\n-----------------\n");
	for (int i = 0; i < preempt_rows; i++) {
		if (preempts[i])
			printf("Preempt %3d at %6llu\n", i, tsc2msec(preempts[i]
			                                             - starttsc));
	}
	for (int i = 0; i < preempt_rows; i++) {
		if (indirs[i])
			printf("Indir   %3d at %6llu\n", i, tsc2msec(indirs[i]
			                                             - starttsc));
	}
}

/* Make sure we have enough VCs for nr_threads, pref 1:1 at the start */
static void os_prep_work(pthread_t *worker_threads, int nr_threads)
{
	if (nr_threads > max_vcores()) {
		printf("Too many threads (%d) requested, can't get more than %d vc\n",
		       nr_threads, max_vcores());
		exit(-1);
	}
	atomic_init(&preempt_idx, 0);
	atomic_init(&indir_idx, 0);
	atomic_init(&preempt_cnt, 0);
	atomic_init(&indir_cnt, 0);
	parlib_never_yield = TRUE;
	pthread_need_tls(FALSE);
	pthread_mcp_init();					/* gives us one vcore */
	register_ev_handler(EV_VCORE_PREEMPT, trace_preempt, 0);
	register_ev_handler(EV_CHECK_MSGS, trace_indir, 0);
	if (pargs.fake_vc_ctx) {
		/* need to disable events when faking vc ctx.  since we're looping and
		 * not handling events, we could run OOM */
		clear_kevent_q(EV_VCORE_PREEMPT);
		clear_kevent_q(EV_CHECK_MSGS);
	}
	vcore_request_total(nr_threads);
	parlib_never_vc_request = TRUE;
	for (int i = 0; i < nr_threads; i++) {
		printd("Vcore %d mapped to pcore %d\n", i,
		       __procinfo.vcoremap[i].pcoreid);
	}
}

static void os_post_work(pthread_t *worker_threads, int nr_threads)
{
}

#endif

/* Argument parsing */
static error_t parse_opt (int key, char *arg, struct argp_state *state)
{
	struct prog_args *pargs = state->input;
	switch (key) {
		case 'w':
			pargs->nr_threads = atoi(arg);
			if (pargs->nr_threads < 0) {
				printf("Negative nr_threads...\n\n");
				argp_usage(state);
			}
			break;
		case 'l':
			pargs->nr_loops = atoi(arg);
			if (pargs->nr_loops < 0) {
				printf("Negative nr_loops...\n\n");
				argp_usage(state);
			}
			break;
		case OPT_ADJ_WORKERS:
			pargs->adj_workers = TRUE;
			break;
		case OPT_VC_CTX:
			pargs->fake_vc_ctx = TRUE;
			break;
		case 'h':
			pargs->hold_time = atoi(arg);
			if (pargs->hold_time < 0) {
				printf("Negative hold_time...\n\n");
				argp_usage(state);
			}
			break;
		case 'd':
			pargs->delay_time = atoi(arg);
			if (pargs->delay_time < 0) {
				printf("Negative delay_time...\n\n");
				argp_usage(state);
			}
			break;
		case 'o':
			pargs->outfile_path = arg;
			break;
		case 'p':
			pargs->nr_print_rows = atoi(arg);
			if (pargs->nr_print_rows < 0) {
				printf("Negative print_rows...\n\n");
				argp_usage(state);
			}
			break;
		case 't':
			if (!strcmp("mcs", arg)) {
				pargs->lock_type = mcs_thread;
				break;
			}
			if (!strcmp("mcscas", arg)) {
				pargs->lock_type = mcscas_thread;
				break;
			}
			if (!strcmp("mcspdr", arg)) {
				pargs->lock_type = mcspdr_thread;
				break;
			}
			if (!strcmp("mcspdro", arg)) {
				pargs->lock_type = mcspdro_thread;
				break;
			}
			if (!strcmp("__mcspdro", arg)) {
				pargs->lock_type = __mcspdro_thread;
				break;
			}
			if (!strcmp("spin", arg)) {
				pargs->lock_type = spin_thread;
				break;
			}
			if (!strcmp("spinpdr", arg)) {
				pargs->lock_type = spinpdr_thread;
				break;
			}
			printf("Unknown locktype %s\n\n", arg);
			argp_usage(state);
			break;
		case ARGP_KEY_ARG:
			printf("Warning, extra argument %s ignored\n\n", arg);
			break;
		case ARGP_KEY_END:
			if (!pargs->nr_threads) {
				printf("Must select a number of threads.\n\n");
				argp_usage(state);
				break;
			}
			if (!pargs->nr_loops) {
				printf("Must select a number of loops.\n\n");
				argp_usage(state);
				break;
			}
			if (!pargs->lock_type) {
				printf("Must select a type of lock.\n\n");
				argp_usage(state);
				break;
			}
			break;
		default:
			return ARGP_ERR_UNKNOWN;
	}
	return 0;
}

static struct argp argp = {options, parse_opt, args_doc, doc};

int main(int argc, char** argv)
{
	pthread_t *worker_threads;
	void **loops_done;
	struct timeval start_tv = {0};
	struct timeval end_tv = {0};
	long usec_diff, total_loops = 0;
	uint64_t starttsc;
	int nr_threads, nr_loops;
	FILE *outfile;
	struct sample_stats acq_stats, hld_stats;

	argp_parse(&argp, argc, argv, 0, 0, &pargs);
	nr_threads = pargs.nr_threads;
	nr_loops = pargs.nr_loops;
	mcs_pdr_init(&mcspdr_lock);

	if (pargs.outfile_path) {
		/* RDWR, CREAT, TRUNC, O666 */
		outfile = fopen(pargs.outfile_path, "w+");
		if (!outfile) {
			perror("outfile");
			exit(-1);
		}
	}
	worker_threads = malloc(sizeof(pthread_t) * nr_threads);
	if (!worker_threads) {
		perror("pthread_t malloc failed:");
		exit(-1);
	}
	loops_done = malloc(sizeof(void*) * nr_threads);
	if (!loops_done) {
		perror("loops_done malloc failed");
		exit(-1);
	}
	printf("Making %d workers of %d loops each, %sadapting workers to vcores, "
	       "and %sfaking vcore context\n", nr_threads, nr_loops,
	       pargs.adj_workers ? "" : "not ",
	       pargs.fake_vc_ctx ? "" : "not ");
	pthread_barrier_init(&start_test, NULL, nr_threads);

	times = malloc(sizeof(struct time_stamp *) * nr_threads);
	assert(times);
	for (int i = 0; i < nr_threads; i++) {
		times[i] = malloc(sizeof(struct time_stamp) * nr_loops);
		if (!times[i]) {
			perror("Record keeping malloc");
			exit(-1);
		}
		memset(times[i], 0, sizeof(struct time_stamp) * nr_loops);
	}
	printf("Record tracking takes %ld bytes of memory\n",
	       nr_threads * nr_loops * sizeof(struct time_stamp));
	os_prep_work(worker_threads, nr_threads);	/* ensure we have enough VCs */
	/* Doing this in MCP ctx, so we might have been getting a few preempts
	 * already.  Want to read start before the threads pass their barrier */
	starttsc = read_tsc();
	/* create and join on yield */
	for (long i = 0; i < nr_threads; i++) {
		if (pthread_create(&worker_threads[i], NULL, pargs.lock_type,
		                   (void*)i))
			perror("pth_create failed");
	}
	os_post_work(worker_threads, nr_threads);
	if (gettimeofday(&start_tv, 0))
		perror("Start time error...");
	for (int i = 0; i < nr_threads; i++) {
		pthread_join(worker_threads[i], &loops_done[i]);
	}
	if (gettimeofday(&end_tv, 0))
		perror("End time error...");

	printf("Acquire times (TSC Ticks)\n---------------------------\n");
	acq_stats.get_sample = get_acq_latency;
	compute_stats((void**)times, nr_threads, nr_loops, &acq_stats);

	printf("Held times (from acq til rel done) (TSC Ticks)\n------\n");
	hld_stats.get_sample = get_hld_latency;
	compute_stats((void**)times, nr_threads, nr_loops, &hld_stats);

	usec_diff = (end_tv.tv_sec - start_tv.tv_sec) * 1000000 +
	            (end_tv.tv_usec - start_tv.tv_usec);
	printf("Time to run: %ld usec\n", usec_diff);

	printf("\nLock throughput:\n-----------------\n");
	/* throughput for the entire duration (in ms), 1ms steps.  print as many
	 * steps as they ask for (up to the end of the run). */
	print_throughput((void**)times, usec_diff / 1000 + 1, msec2tsc(1),
	                 pargs.nr_print_rows,
	                 starttsc, nr_threads,
	                 nr_loops, get_acq_timestamp);
	print_preempt_trace(starttsc, pargs.nr_print_rows);

	for (int i = 0; i < nr_threads; i++) {
		total_loops += (long)loops_done[i];
		if (!loops_done[i])
			printf("WARNING: thread %d performed 0 loops!\n", i);
	}
	printf("Average number of loops done, per thread: %ld\n",
	       total_loops / nr_threads);
	for (int i = 0; i < nr_threads; i++)
		printf("\tThread %d performed %lu loops\n", i, (long)loops_done[i]);

	if (pargs.outfile_path) {
		fprintf(outfile, "#");
		for (char **arg = argv; *arg; arg++)
			fprintf(outfile, " %s", *arg);
		fprintf(outfile, "\n");
		fprintf(outfile, "# thread_id attempt pre acq(uire) un(lock) "
		                 "tsc_overhead\n");
		fprintf(outfile, "# acquire latency: acq - pre - tsc_overhead\n");
		fprintf(outfile, "# hold time: un - acq - tsc_overhead\n");
		fprintf(outfile, "# tsc_frequency %llu\n", get_tsc_freq());
		fprintf(outfile, "# tsc_overhead is 0 on linux, hard code it with a "
		                 "value from akaros\n");
		for (int i = 0; i < nr_threads; i++) {
			for (int j = 0; j < nr_loops; j++) {
				struct time_stamp *ts = &times[i][j];
				if (!ts->pre)
					break; /* empty record */
				fprintf(outfile, "%d %d %llu %llu %llu %llu\n", i, j, ts->pre,
				        ts->acq, ts->un, get_tsc_overhead());
			}
		}
		fclose(outfile);
	}
	printf("Done, exiting\n");
}
