/*
 * Copyright (C) 2012 Fusion-io
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public
 *  License v2 as published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 *
 *  Parts of this file were imported from Jens Axboe's blktrace sources (also GPL)
 */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <inttypes.h>
#include <string.h>
#include <asm/types.h>
#include <errno.h>
#include <sys/mman.h>
#include <time.h>
#include <math.h>
#include <getopt.h>
#include <limits.h>
#include <float.h>

#include "plot.h"
#include "blkparse.h"
#include "list.h"
#include "tracers.h"
#include "mpstat.h"
#include "fio.h"

LIST_HEAD(all_traces);
LIST_HEAD(fio_traces);

static char line[1024];
static int line_len = 1024;
static int found_mpstat = 0;
static int make_movie = 0;
static int keep_movie_svgs = 0;
static int opt_graph_width = 0;
static int opt_graph_height = 0;

static int columns = 1;
static int num_xticks = 9;
static int num_yticks = 4;

static double min_time = 0;
static double max_time = DBL_MAX;
static unsigned long long min_mb = 0;
static unsigned long long max_mb = ULLONG_MAX >> 20;

int plot_io_action = 0;
int io_per_process = 0;
unsigned int longest_proc_name = 0;

/*
 * this doesn't include the IO graph,
 * but it counts the other graphs as they go out
 */
static int total_graphs_written = 1;

enum {
	IO_GRAPH_INDEX = 0,
	TPUT_GRAPH_INDEX,
	FIO_GRAPH_INDEX,
	CPU_SYS_GRAPH_INDEX,
	CPU_IO_GRAPH_INDEX,
	CPU_IRQ_GRAPH_INDEX,
	CPU_SOFT_GRAPH_INDEX,
	CPU_USER_GRAPH_INDEX,
	LATENCY_GRAPH_INDEX,
	QUEUE_DEPTH_GRAPH_INDEX,
	IOPS_GRAPH_INDEX,
	TOTAL_GRAPHS
};

enum {
	MPSTAT_SYS = 0,
	MPSTAT_IRQ,
	MPSTAT_IO,
	MPSTAT_SOFT,
	MPSTAT_USER,
	MPSTAT_GRAPHS
};

static char *graphs_by_name[] = {
	"io",
	"tput",
	"fio",
	"cpu-sys",
	"cpu-io",
	"cpu-irq",
	"cpu-soft",
	"cpu-user",
	"latency",
	"queue-depth",
	"iops",
};

enum {
	MOVIE_SPINDLE,
	MOVIE_RECT,
	NUM_MOVIE_STYLES,
};

char *movie_styles[] = {
	"spindle",
	"rect",
	NULL
};

static int movie_style = 0;

static int lookup_movie_style(char *str)
{
	int i;

	for (i = 0; i < NUM_MOVIE_STYLES; i++) {
		if (strcmp(str, movie_styles[i]) == 0)
			return i;
	}
	return -1;
}

static int active_graphs[TOTAL_GRAPHS];
static int last_active_graph = IOPS_GRAPH_INDEX;

static int label_index = 0;
static int num_traces = 0;
static int num_fio_traces = 0;
static int longest_label = 0;

static char *graph_title = "";
static char *output_filename = "trace.svg";
static char *blktrace_devices[MAX_DEVICES_PER_TRACE];
static int num_blktrace_devices = 0;
static char *blktrace_outfile = "trace";
static char *blktrace_dest_dir = ".";
static char *program_to_run = NULL;
static char *ffmpeg_codec = "libx264";

static void alloc_mpstat_gld(struct trace_file *tf)
{
	struct graph_line_data **ptr;

	if (tf->trace->mpstat_num_cpus == 0)
		return;

	ptr = calloc((tf->trace->mpstat_num_cpus + 1) * MPSTAT_GRAPHS,
		     sizeof(struct graph_line_data *));
	if (!ptr) {
		perror("Unable to allocate mpstat arrays\n");
		exit(1);
	}
	tf->mpstat_gld = ptr;
}

static void enable_all_graphs(void)
{
	int i;
	for (i = 0; i < TOTAL_GRAPHS; i++)
		active_graphs[i] = 1;
}

static void disable_all_graphs(void)
{
	int i;
	for (i = 0; i < TOTAL_GRAPHS; i++)
		active_graphs[i] = 0;
}

static int enable_one_graph(char *name)
{
	int i;
	for (i = 0; i < TOTAL_GRAPHS; i++) {
		if (strcmp(name, graphs_by_name[i]) == 0) {
			active_graphs[i] = 1;
			return 0;
		}
	}
	return -ENOENT;
}

static int disable_one_graph(char *name)
{
	int i;
	for (i = 0; i < TOTAL_GRAPHS; i++) {
		if (strcmp(name, graphs_by_name[i]) == 0) {
			active_graphs[i] = 0;
			return 0;
		}
	}
	return -ENOENT;
}

static int last_graph(void)
{
	int i;
	for (i = TOTAL_GRAPHS - 1; i >= 0; i--) {
		if (active_graphs[i]) {
			return i;
		}
	}
	return -ENOENT;
}

static int graphs_left(int cur)
{
	int i;
	int left = 0;
	for (i = cur; i < TOTAL_GRAPHS; i++) {
		if (active_graphs[i])
			left++;
	}
	return left;
}

static char * join_path(char *dest_dir, char *filename)
{
	/* alloc 2 extra bytes for '/' and '\0' */
	char *path = malloc(strlen(dest_dir) + strlen(filename) + 2);
	sprintf(path, "%s%s%s", dest_dir, "/", filename);

	return path;
}

static void add_trace_file(char *filename)
{
	struct trace_file *tf;

	tf = calloc(1, sizeof(*tf));
	if (!tf) {
		fprintf(stderr, "Unable to allocate memory\n");
		exit(1);
	}
	tf->label = "";
	tf->filename = strdup(filename);
	list_add_tail(&tf->list, &all_traces);
	tf->line_color = "black";
	num_traces++;
}

static void add_fio_trace_file(char *filename)
{
	struct trace_file *tf;

	tf = calloc(1, sizeof(*tf));
	if (!tf) {
		fprintf(stderr, "Unable to allocate memory\n");
		exit(1);
	}
	tf->label = "";
	tf->filename = strdup(filename);
	list_add_tail(&tf->list, &fio_traces);
	tf->line_color = pick_fio_color();
	tf->fio_trace = 1;
	num_fio_traces++;
}

static void setup_trace_file_graphs(void)
{
	struct trace_file *tf;
	int i;
	int alloc_ptrs;

	if (io_per_process)
		alloc_ptrs = 16;
	else
		alloc_ptrs = 1;

	list_for_each_entry(tf, &all_traces, list) {
		tf->tput_reads_gld = alloc_line_data(tf->min_seconds, tf->max_seconds, tf->stop_seconds);
		tf->tput_writes_gld = alloc_line_data(tf->min_seconds, tf->max_seconds, tf->stop_seconds);
		tf->latency_gld = alloc_line_data(tf->min_seconds, tf->max_seconds, tf->stop_seconds);
		tf->queue_depth_gld = alloc_line_data(tf->min_seconds, tf->max_seconds, tf->stop_seconds);

		tf->iop_gld = alloc_line_data(tf->min_seconds, tf->max_seconds, tf->stop_seconds);
		tf->gdd_writes = calloc(alloc_ptrs, sizeof(struct graph_dot_data));
		tf->gdd_reads = calloc(alloc_ptrs, sizeof(struct graph_dot_data));
		tf->io_plots_allocated = alloc_ptrs;

		if (tf->trace->mpstat_num_cpus == 0)
			continue;

		alloc_mpstat_gld(tf);
		for (i = 0; i < (tf->trace->mpstat_num_cpus + 1) * MPSTAT_GRAPHS; i++) {
			tf->mpstat_gld[i] =
				alloc_line_data(tf->mpstat_min_seconds,
						tf->mpstat_max_seconds,
						tf->mpstat_max_seconds);
			tf->mpstat_gld[i]->max = 100;
		}
	}

	list_for_each_entry(tf, &fio_traces, list) {
		if (tf->trace->fio_seconds > 0) {
			tf->fio_gld = alloc_line_data(tf->min_seconds,
						      tf->max_seconds,
						      tf->stop_seconds);
		}
	}

}

static void read_traces(void)
{
	struct trace_file *tf;
	struct trace *trace;
	u64 last_time;
	u64 ymin;
	u64 ymax;
	u64 max_bank;
	u64 max_bank_offset;
	char *path = NULL;

	list_for_each_entry(tf, &all_traces, list) {
		path = join_path(blktrace_dest_dir, tf->filename);

		trace = open_trace(path);
		if (!trace)
			exit(1);

		last_time = find_last_time(trace);
		tf->trace = trace;
		tf->max_seconds = SECONDS(last_time) + 1;
		tf->stop_seconds = SECONDS(last_time) + 1;

		find_extreme_offsets(trace, &tf->min_offset, &tf->max_offset,
				    &max_bank, &max_bank_offset);
		filter_outliers(trace, tf->min_offset, tf->max_offset, &ymin, &ymax);
		tf->min_offset = ymin;
		tf->max_offset = ymax;

		read_mpstat(trace, path);
		tf->mpstat_stop_seconds = trace->mpstat_seconds;
		tf->mpstat_max_seconds = trace->mpstat_seconds;
		if (tf->mpstat_max_seconds)
			found_mpstat = 1;

		free(path);
	}

	list_for_each_entry(tf, &fio_traces, list) {
		trace = open_fio_trace(tf->filename);
		if (!trace)
			exit(1);
		tf->trace = trace;
		tf->max_seconds = tf->trace->fio_seconds;
		tf->stop_seconds = tf->trace->fio_seconds;
	}
}

static void pick_line_graph_color(void)
{
	struct trace_file *tf;
	int i;

	list_for_each_entry(tf, &all_traces, list) {
		for (i = 0; i < tf->io_plots; i++) {
			if (tf->gdd_reads[i]) {
				tf->line_color = tf->gdd_reads[i]->color;
				tf->reads_color = tf->gdd_reads[i]->color;
			}
			if (tf->gdd_writes[i]) {
				tf->line_color = tf->gdd_writes[i]->color;
				tf->writes_color = tf->gdd_writes[i]->color;
			}
			if (tf->writes_color && tf->reads_color)
				break;
		}
		if (!tf->reads_color)
			tf->reads_color = tf->line_color;
		if (!tf->writes_color)
			tf->writes_color = tf->line_color;
	}
}

static void read_fio_events(struct trace_file *tf)
{
	u64 bw = 0;
	int time = 0;
	int dir = 0;
	int ret;

	first_fio(tf->trace);
	while (1) {
		ret = read_fio_event(tf->trace, &time, &bw, &dir);
		if (ret)
			break;

		if (dir <= 1)
			add_fio_gld(time, bw, tf->fio_gld);
		if (next_fio_line(tf->trace))
			break;
	}
}

static void read_trace_events(void)
{

	struct trace_file *tf;
	struct trace *trace;
	int ret;
	int i;
	unsigned int time;
	double user, sys, iowait, irq, soft;
	double max_user = 0, max_sys = 0, max_iowait = 0,
	       max_irq = 0, max_soft = 0;

	list_for_each_entry(tf, &fio_traces, list)
		read_fio_events(tf);

	list_for_each_entry(tf, &all_traces, list) {
		trace = tf->trace;

		first_record(trace);
		do {
			if (SECONDS(get_record_time(trace)) > tf->max_seconds)
				continue;
			check_record(trace);
			add_tput(trace, tf->tput_writes_gld, tf->tput_reads_gld);
			add_iop(trace, tf->iop_gld);
			add_io(trace, tf);
			add_pending_io(trace, tf->queue_depth_gld);
			add_completed_io(trace, tf->latency_gld);
		} while (!(ret = next_record(trace)));
	}
	list_for_each_entry(tf, &all_traces, list) {
		trace = tf->trace;

		if (trace->mpstat_num_cpus == 0)
			continue;

		first_mpstat(trace);

		for (time = 0; time < tf->mpstat_stop_seconds; time++) {
			for (i = 0; i < (trace->mpstat_num_cpus + 1) * MPSTAT_GRAPHS; i += MPSTAT_GRAPHS) {
				ret = read_mpstat_event(trace, &user, &sys,
							&iowait, &irq, &soft);
				if (ret)
					goto mpstat_done;
				if (next_mpstat_line(trace))
					goto mpstat_done;

				if (sys > max_sys)
					max_sys = sys;
				if (user > max_user)
					max_user = user;
				if (irq > max_irq)
					max_irq = irq;
				if (iowait > max_iowait)
					max_iowait = iowait;

				add_mpstat_gld(time, sys, tf->mpstat_gld[i + MPSTAT_SYS]);
				add_mpstat_gld(time, irq, tf->mpstat_gld[i + MPSTAT_IRQ]);
				add_mpstat_gld(time, soft, tf->mpstat_gld[i + MPSTAT_SOFT]);
				add_mpstat_gld(time, user, tf->mpstat_gld[i + MPSTAT_USER]);
				add_mpstat_gld(time, iowait, tf->mpstat_gld[i + MPSTAT_IO]);
			}
			if (next_mpstat(trace) == NULL)
				break;
		}
	}

mpstat_done:
	list_for_each_entry(tf, &all_traces, list) {
		trace = tf->trace;

		if (trace->mpstat_num_cpus == 0)
			continue;

		tf->mpstat_gld[MPSTAT_SYS]->max = max_sys;
		tf->mpstat_gld[MPSTAT_IRQ]->max = max_irq;
		tf->mpstat_gld[MPSTAT_SOFT]->max = max_soft;
		tf->mpstat_gld[MPSTAT_USER]->max = max_user;
		tf->mpstat_gld[MPSTAT_IO]->max = max_iowait;;
	}
	return;
}

static void set_trace_label(char *label)
{
	int cur = 0;
	struct trace_file *tf;
	int len = strlen(label);

	if (len > longest_label)
		longest_label = len;

	list_for_each_entry(tf, &all_traces, list) {
		if (cur == label_index) {
			tf->label = strdup(label);
			label_index++;
			return;
			break;
		}
		cur++;
	}
	list_for_each_entry(tf, &fio_traces, list) {
		if (cur == label_index) {
			tf->label = strdup(label);
			label_index++;
			break;
		}
		cur++;
	}
}

static void set_blktrace_outfile(char *arg)
{
	char *s = strdup(arg);
	char *last_dot = strrchr(s, '.');

	if (last_dot) {
		if (strcmp(last_dot, ".dump") == 0)
			*last_dot = '\0';
	}
	blktrace_outfile = s;
}


static void compare_minmax_tf(struct trace_file *tf, unsigned int *max_seconds,
			      u64 *min_offset, u64 *max_offset)
{
	if (tf->max_seconds > *max_seconds)
		*max_seconds = tf->max_seconds;
	if (tf->max_offset > *max_offset)
		*max_offset = tf->max_offset;
	if (tf->min_offset < *min_offset)
		*min_offset = tf->min_offset;
}

static void set_all_minmax_tf(unsigned int min_seconds,
			      unsigned int max_seconds,
			      u64 min_offset, u64 max_offset)
{
	struct trace_file *tf;
	struct list_head *traces = &all_traces;
again:
	list_for_each_entry(tf, traces, list) {
		tf->min_seconds = min_seconds;
		tf->max_seconds = max_seconds;
		if (tf->stop_seconds > max_seconds)
			tf->stop_seconds = max_seconds;
		if (tf->mpstat_max_seconds) {
			tf->mpstat_min_seconds = min_seconds;
			tf->mpstat_max_seconds = max_seconds;
			if (tf->mpstat_stop_seconds > max_seconds)
				tf->mpstat_stop_seconds = max_seconds;
		}
		tf->min_offset = min_offset;
		tf->max_offset = max_offset;
	}
	if (traces == &all_traces) {
		traces = &fio_traces;
		goto again;
	}
}

static char *create_movie_temp_dir(void)
{
	char *ret;
	char *pattern = strdup("io-movie-XXXXXX");;

	ret = mkdtemp(pattern);
	if (!ret) {
		perror("Unable to create temp directory for movie files");
		exit(1);
	}
	return ret;
}

static struct pid_plot_history *alloc_pid_plot_history(char *color)
{
	struct pid_plot_history *pph;

	pph = calloc(1, sizeof(struct pid_plot_history));
	if (!pph) {
		perror("memory allocation failed");
		exit(1);
	}
	pph->history = malloc(sizeof(double) * 4096);
	if (!pph->history) {
		perror("memory allocation failed");
		exit(1);
	}
	pph->history_len = 4096;
	pph->color = color;

	return pph;
}

static struct plot_history *alloc_plot_history(struct trace_file *tf)
{
	struct plot_history *ph = calloc(1, sizeof(struct plot_history));
	int i;

	if (!ph) {
		perror("memory allocation failed");
		exit(1);
	}
	ph->read_pid_history = calloc(tf->io_plots, sizeof(struct pid_plot_history *));
	if (!ph->read_pid_history) {
		perror("memory allocation failed");
		exit(1);
	}
	ph->write_pid_history = calloc(tf->io_plots, sizeof(struct pid_plot_history *));
	if (!ph->write_pid_history) {
		perror("memory allocation failed");
		exit(1);
	}
	ph->pid_history_count = tf->io_plots;
	for (i = 0; i < tf->io_plots; i++) {
		if (tf->gdd_reads[i])
			ph->read_pid_history[i] = alloc_pid_plot_history(tf->gdd_reads[i]->color);
		if (tf->gdd_writes[i])
			ph->write_pid_history[i] = alloc_pid_plot_history(tf->gdd_writes[i]->color);
	}
	return ph;
}

LIST_HEAD(movie_history);
int num_histories = 0;

static void free_plot_history(struct plot_history *ph)
{
	int pid;

	for (pid = 0; pid < ph->pid_history_count; pid++) {
		if (ph->read_pid_history[pid])
			free(ph->read_pid_history[pid]);
		if (ph->write_pid_history[pid])
			free(ph->write_pid_history[pid]);
	}
	free(ph->read_pid_history);
	free(ph->write_pid_history);
	free(ph);
}

static void add_history(struct plot_history *ph, struct list_head *list)
{
	struct plot_history *entry;

	list_add_tail(&ph->list, list);
	num_histories++;

	if (num_histories > 12) {
		num_histories--;
		entry = list_entry(list->next, struct plot_history, list);
		list_del(&entry->list);
		free_plot_history(entry);
	}
}

static void plot_movie_history(struct plot *plot, struct list_head *list)
{
	struct plot_history *ph;
	int pid;

	if (num_histories > 2)
		rewind_spindle_steps(num_histories - 1);

	list_for_each_entry(ph, list, list) {
		for (pid = 0; pid < ph->pid_history_count; pid++) {
			if (ph->read_pid_history[pid]) {
				if (movie_style == MOVIE_SPINDLE) {
					svg_io_graph_movie_array_spindle(plot,
						ph->read_pid_history[pid]);
				} else {
					svg_io_graph_movie_array(plot,
						ph->read_pid_history[pid]);
				}
			}
			if (ph->write_pid_history[pid]) {
				if (movie_style == MOVIE_SPINDLE) {
					svg_io_graph_movie_array_spindle(plot,
						ph->write_pid_history[pid]);
				} else {
					svg_io_graph_movie_array(plot,
						ph->write_pid_history[pid]);
				}
			}
		}
	 }
}

static void free_all_plot_history(struct list_head *head)
{
	struct plot_history *entry;

	while (!list_empty(head)) {
		entry = list_entry(head->next, struct plot_history, list);
		list_del(&entry->list);
		free_plot_history(entry);
	}
}

static int count_io_plot_types(void)
{
	struct trace_file *tf;
	int i;
	int total_io_types = 0;

	list_for_each_entry(tf, &all_traces, list) {
		for (i = 0; i < tf->io_plots; i++) {
			if (tf->gdd_reads[i])
				total_io_types++;
			if (tf->gdd_writes[i])
				total_io_types++;
		}
	}
	return total_io_types;
}

static void plot_io(struct plot *plot, unsigned int min_seconds,
		    unsigned int max_seconds, u64 min_offset, u64 max_offset)
{
	struct trace_file *tf;
	int i;

	if (active_graphs[IO_GRAPH_INDEX] == 0)
		return;

	setup_axis(plot);

	svg_alloc_legend(plot, count_io_plot_types() * 2);

	set_plot_label(plot, "Device IO");
	set_ylabel(plot, "Offset (MB)");
	set_yticks(plot, num_yticks, min_offset / (1024 * 1024),
		   max_offset / (1024 * 1024), "");
	set_xticks(plot, num_xticks, min_seconds, max_seconds);

	list_for_each_entry(tf, &all_traces, list) {
		char label[256];
		char *pos;

		if (!tf->label)
			label[0] = 0;
		else {
			strncpy(label, tf->label, 255);
			label[255] = 0;
			if (io_per_process)
				strcat(label, " ");
		}
		pos = label + strlen(label);

		for (i = 0; i < tf->io_plots; i++) {
			if (tf->gdd_writes[i]) {
				svg_io_graph(plot, tf->gdd_writes[i]);
				if (io_per_process)
					strcpy(pos, tf->gdd_writes[i]->label);
				svg_add_legend(plot, label, " Writes", tf->gdd_writes[i]->color);
			}
			if (tf->gdd_reads[i]) {
				svg_io_graph(plot, tf->gdd_reads[i]);
				if (io_per_process)
					strcpy(pos, tf->gdd_reads[i]->label);
				svg_add_legend(plot, label, " Reads", tf->gdd_reads[i]->color);
			}

		}
	}
	if (plot->add_xlabel)
		set_xlabel(plot, "Time (seconds)");
	svg_write_legend(plot);
	close_plot(plot);
}

static void plot_tput(struct plot *plot, unsigned int min_seconds,
		      unsigned int max_seconds, int with_legend)
{
	struct trace_file *tf;
	char *units;
	char line[128];
	u64 max = 0;

	if (active_graphs[TPUT_GRAPH_INDEX] == 0)
		return;

	if (with_legend)
		svg_alloc_legend(plot, num_traces * 2);

	list_for_each_entry(tf, &all_traces, list) {
		if (tf->tput_writes_gld->max > max)
			max = tf->tput_writes_gld->max;
		if (tf->tput_reads_gld->max > max)
			max = tf->tput_reads_gld->max;
	}
	list_for_each_entry(tf, &all_traces, list) {
		if (tf->tput_writes_gld->max > 0)
			tf->tput_writes_gld->max = max;
		if (tf->tput_reads_gld->max > 0)
			tf->tput_reads_gld->max = max;
	}

	setup_axis(plot);
	set_plot_label(plot, "Throughput");

	tf = list_entry(all_traces.next, struct trace_file, list);

	scale_line_graph_bytes(&max, &units, 1024);
	sprintf(line, "%sB/s", units);
	set_ylabel(plot, line);
	set_yticks(plot, num_yticks, 0, max, "");
	set_xticks(plot, num_xticks, min_seconds, max_seconds);

	list_for_each_entry(tf, &all_traces, list) {
		if (tf->tput_writes_gld->max > 0) {
			svg_line_graph(plot, tf->tput_writes_gld, tf->writes_color, 0, 0);
			if (with_legend)
				svg_add_legend(plot, tf->label, "Writes", tf->writes_color);
		}
		if (tf->tput_reads_gld->max > 0) {
			svg_line_graph(plot, tf->tput_reads_gld, tf->reads_color, 0, 0);
			if (with_legend)
				svg_add_legend(plot, tf->label, "Reads", tf->reads_color);
		}
	}

	if (plot->add_xlabel)
		set_xlabel(plot, "Time (seconds)");

	if (with_legend)
		svg_write_legend(plot);

	close_plot(plot);
	total_graphs_written++;
}

static void plot_fio_tput(struct plot *plot,
			  unsigned int min_seconds, unsigned int max_seconds)
{
	struct trace_file *tf;
	char *units;
	char line[128];
	u64 max = 0;

	if (num_fio_traces == 0 || active_graphs[FIO_GRAPH_INDEX] == 0)
		return;

	if (num_fio_traces > 1)
		svg_alloc_legend(plot, num_fio_traces);

	list_for_each_entry(tf, &fio_traces, list) {
		if (tf->fio_gld->max > max)
			max = tf->fio_gld->max;
	}

	list_for_each_entry(tf, &fio_traces, list) {
		if (tf->fio_gld->max > 0)
			tf->fio_gld->max = max;
	}

	setup_axis(plot);
	set_plot_label(plot, "Fio Throughput");

	tf = list_entry(all_traces.next, struct trace_file, list);

	scale_line_graph_bytes(&max, &units, 1024);
	sprintf(line, "%sB/s", units);
	set_ylabel(plot, line);
	set_yticks(plot, num_yticks, 0, max, "");

	set_xticks(plot, num_xticks, min_seconds, max_seconds);
	list_for_each_entry(tf, &fio_traces, list) {
		if (tf->fio_gld->max > 0) {
			svg_line_graph(plot, tf->fio_gld, tf->line_color, 0, 0);
			if (num_fio_traces > 1)
				svg_add_legend(plot, tf->label, "", tf->line_color);
		}
	}

	if (plot->add_xlabel)
		set_xlabel(plot, "Time (seconds)");

	if (num_fio_traces > 1)
		svg_write_legend(plot);
	close_plot(plot);
	total_graphs_written++;
}

static void plot_cpu(struct plot *plot, unsigned int max_seconds, char *label,
		     int active_index, int gld_index)
{
	struct trace_file *tf;
	int max = 0;
	int i;
	unsigned int gld_i;
	char *color;
	double avg = 0;
	int ymax;
	int plotted = 0;

	if (active_graphs[active_index] == 0)
		return;

	list_for_each_entry(tf, &all_traces, list) {
		if (tf->trace->mpstat_num_cpus > max)
			max = tf->trace->mpstat_num_cpus;
	}
	if (max == 0)
		return;

	tf = list_entry(all_traces.next, struct trace_file, list);

	ymax = tf->mpstat_gld[gld_index]->max;
	if (ymax == 0)
		return;

	svg_alloc_legend(plot, num_traces * max);

	setup_axis(plot);
	set_plot_label(plot, label);

	max_seconds = tf->mpstat_max_seconds;

	set_yticks(plot, num_yticks, 0, tf->mpstat_gld[gld_index]->max, "");
	set_ylabel(plot, "Percent");
	set_xticks(plot, num_xticks, tf->mpstat_min_seconds, max_seconds);

	reset_cpu_color();
	list_for_each_entry(tf, &all_traces, list) {
		if (tf->mpstat_gld == 0)
			break;
		for (gld_i = tf->mpstat_gld[0]->min_seconds;
		     gld_i < tf->mpstat_gld[0]->stop_seconds; gld_i++) {
			if (tf->mpstat_gld[gld_index]->data[gld_i].count) {
				avg += (tf->mpstat_gld[gld_index]->data[gld_i].sum /
					tf->mpstat_gld[gld_index]->data[gld_i].count);
			}
		}
		avg /= tf->mpstat_gld[gld_index]->stop_seconds -
		       tf->mpstat_gld[gld_index]->min_seconds;
		color = pick_cpu_color();
		svg_line_graph(plot, tf->mpstat_gld[0], color, 0, 0);
		svg_add_legend(plot, tf->label, " avg", color);

		for (i = 1; i < tf->trace->mpstat_num_cpus + 1; i++) {
			struct graph_line_data *gld = tf->mpstat_gld[i * MPSTAT_GRAPHS + gld_index];
			double this_avg = 0;

			for (gld_i = gld->min_seconds;
			     gld_i < gld->stop_seconds; gld_i++) {
				if (gld->data[i].count) {
					this_avg += gld->data[i].sum /
						gld->data[i].count;
				}
			}

			this_avg /= gld->stop_seconds - gld->min_seconds;

			for (gld_i = gld->min_seconds;
			     gld_i < gld->stop_seconds; gld_i++) {
				double val;

				if (gld->data[gld_i].count == 0)
					continue;
				val = (double)gld->data[gld_i].sum /
					gld->data[gld_i].count;

				if (this_avg > avg + 30 || val > 95) {
					color = pick_cpu_color();
					svg_line_graph(plot, gld, color, avg + 30, 95);
					snprintf(line, line_len, " CPU %d\n", i - 1);
					svg_add_legend(plot, tf->label, line, color);
					plotted++;
					break;
				}

			}
		}
	}

	if (plot->add_xlabel)
		set_xlabel(plot, "Time (seconds)");

	if (!plot->no_legend) {
		svg_write_legend(plot);
		svg_free_legend(plot);
	}
	close_plot(plot);
	total_graphs_written++;
}

static void plot_queue_depth(struct plot *plot, unsigned int min_seconds,
			     unsigned int max_seconds)
{
	struct trace_file *tf;

	if (active_graphs[QUEUE_DEPTH_GRAPH_INDEX] == 0)
		return;

	setup_axis(plot);
	set_plot_label(plot, "Queue Depth");
	if (num_traces > 1)
		svg_alloc_legend(plot, num_traces);

	tf = list_entry(all_traces.next, struct trace_file, list);
	set_ylabel(plot, "Pending IO");
	set_yticks(plot, num_yticks, 0, tf->queue_depth_gld->max, "");
	set_xticks(plot, num_xticks, min_seconds, max_seconds);

	list_for_each_entry(tf, &all_traces, list) {
		svg_line_graph(plot, tf->queue_depth_gld, tf->line_color, 0, 0);
		if (num_traces > 1)
			svg_add_legend(plot, tf->label, "", tf->line_color);
	}

	if (plot->add_xlabel)
		set_xlabel(plot, "Time (seconds)");
	if (num_traces > 1)
		svg_write_legend(plot);
	close_plot(plot);
	total_graphs_written++;
}

static void convert_movie_files(char *movie_dir)
{
	fprintf(stderr, "Converting svg files in %s\n", movie_dir);
	snprintf(line, line_len, "find %s -name \\*.svg | xargs -I{} -n 1 -P 8 rsvg-convert -o {}.png {}",
		 movie_dir);
	system(line);
}

static void mencode_movie(char *movie_dir)
{
	fprintf(stderr, "Creating movie %s with ffmpeg\n", movie_dir);
	snprintf(line, line_len, "ffmpeg -r 20 -y -i %s/%%10d-%s.svg.png -b:v 250k "
		 "-vcodec %s %s", movie_dir, output_filename, ffmpeg_codec,
		 output_filename);
	system(line);
}

static void tencode_movie(char *movie_dir)
{
	fprintf(stderr, "Creating movie %s with png2theora\n", movie_dir);
	snprintf(line, line_len, "png2theora -o %s %s/%%010d-%s.svg.png",
			output_filename, movie_dir, output_filename);
	system(line);
}

static void encode_movie(char *movie_dir)
{
	char *last_dot = strrchr(output_filename, '.');

	if (last_dot &&
	    (!strncmp(last_dot, ".ogg", 4) || !strncmp(last_dot, ".ogv", 4))) {
		tencode_movie(movie_dir);
	} else
		mencode_movie(movie_dir);
}

static void cleanup_movie(char *movie_dir)
{
	if (keep_movie_svgs) {
		fprintf(stderr, "Keeping movie dir %s\n", movie_dir);
		return;
	}
	fprintf(stderr, "Removing movie dir %s\n", movie_dir);
	snprintf(line, line_len, "rm %s/*", movie_dir);
	system(line);

	snprintf(line, line_len, "rmdir %s", movie_dir);
	system(line);
}

static void plot_io_movie(struct plot *plot)
{
	struct trace_file *tf;
	char *movie_dir = create_movie_temp_dir();
	int i, pid;
	struct plot_history *history;
	int batch_i;
	int movie_len = 30;
	int movie_frames_per_sec = 20;
	int total_frames = movie_len * movie_frames_per_sec;
	int rows, cols;
	int batch_count;
	int graph_width_factor = 5;
	int orig_y_offset;

	get_graph_size(&cols, &rows);
	batch_count = cols / total_frames;

	if (batch_count == 0)
		batch_count = 1;

	list_for_each_entry(tf, &all_traces, list) {
		char label[256];
		char *pos;

		if (!tf->label)
			label[0] = 0;
		else {
			strcpy(label, tf->label);
			if (io_per_process)
				strcat(label, " ");
		}
		pos = label + strlen(label);

		i = 0;
		while (i < cols) {
			snprintf(line, line_len, "%s/%010d-%s.svg", movie_dir, i, output_filename);
			set_plot_output(plot, line);
			set_plot_title(plot, graph_title);
			orig_y_offset = plot->start_y_offset;

			plot->no_legend = 1;

			set_graph_size(cols / graph_width_factor, rows / 8);
			plot->timeline = i / graph_width_factor;

			plot_tput(plot, tf->min_seconds, tf->max_seconds, 0);

			plot_cpu(plot, tf->max_seconds,
				   "CPU System Time", CPU_SYS_GRAPH_INDEX, MPSTAT_SYS);

			plot->direction = PLOT_ACROSS;
			plot_queue_depth(plot, tf->min_seconds, tf->max_seconds);

			/* movie graph starts here */
			plot->start_y_offset = orig_y_offset;
			set_graph_size(cols - cols / graph_width_factor, rows);
			plot->no_legend = 0;
			plot->timeline = 0;
			plot->direction = PLOT_DOWN;;

			if (movie_style == MOVIE_SPINDLE)
				setup_axis_spindle(plot);
			else
				setup_axis(plot);

			svg_alloc_legend(plot, count_io_plot_types() * 2);

			history = alloc_plot_history(tf);
			history->col = i;

			for (pid = 0; pid < tf->io_plots; pid++) {
				if (tf->gdd_reads[pid]) {
					if (io_per_process)
						strcpy(pos, tf->gdd_reads[pid]->label);
					svg_add_legend(plot, label, " Reads", tf->gdd_reads[pid]->color);
				}
				if (tf->gdd_writes[pid]) {
					if (io_per_process)
						strcpy(pos, tf->gdd_writes[pid]->label);
					svg_add_legend(plot, label, " Writes", tf->gdd_writes[pid]->color);
				}
			}

			batch_i = 0;
			while (i < cols && batch_i < batch_count) {
				for (pid = 0; pid < tf->io_plots; pid++) {
					if (tf->gdd_reads[pid]) {
						svg_io_graph_movie(tf->gdd_reads[pid],
								   history->read_pid_history[pid],
								   i);
					}
					if (tf->gdd_writes[pid]) {
						svg_io_graph_movie(tf->gdd_writes[pid],
								   history->write_pid_history[pid],
								   i);
					}
				}
				i++;
				batch_i++;
			}

			add_history(history, &movie_history);

			plot_movie_history(plot, &movie_history);

			svg_write_legend(plot);
			close_plot(plot);
			close_plot(plot);

			close_plot_file(plot);
		}
		free_all_plot_history(&movie_history);
	}
	convert_movie_files(movie_dir);
	encode_movie(movie_dir);
	cleanup_movie(movie_dir);
	free(movie_dir);
}

static void plot_latency(struct plot *plot, unsigned int min_seconds,
			 unsigned int max_seconds)
{
	struct trace_file *tf;
	char *units;
	char line[128];
	u64 max = 0;

	if (active_graphs[LATENCY_GRAPH_INDEX] == 0)
		return;

	if (num_traces > 1)
		svg_alloc_legend(plot, num_traces);

	list_for_each_entry(tf, &all_traces, list) {
		if (tf->latency_gld->max > max)
			max = tf->latency_gld->max;
	}

	list_for_each_entry(tf, &all_traces, list)
		tf->latency_gld->max = max;

	setup_axis(plot);
	set_plot_label(plot, "IO Latency");

	tf = list_entry(all_traces.next, struct trace_file, list);

	scale_line_graph_time(&max, &units);
	sprintf(line, "latency (%ss)", units);
	set_ylabel(plot, line);
	set_yticks(plot, num_yticks, 0, max, "");
	set_xticks(plot, num_xticks, min_seconds, max_seconds);

	list_for_each_entry(tf, &all_traces, list) {
		svg_line_graph(plot, tf->latency_gld, tf->line_color, 0, 0);
		if (num_traces > 1)
			svg_add_legend(plot, tf->label, "", tf->line_color);
	}

	if (plot->add_xlabel)
		set_xlabel(plot, "Time (seconds)");
	if (num_traces > 1)
		svg_write_legend(plot);
	close_plot(plot);
	total_graphs_written++;
}

static void plot_iops(struct plot *plot, unsigned int min_seconds,
		      unsigned int max_seconds)
{
	struct trace_file *tf;
	char *units;
	u64 max = 0;

	if (active_graphs[IOPS_GRAPH_INDEX] == 0)
		return;

	list_for_each_entry(tf, &all_traces, list) {
		if (tf->iop_gld->max > max)
			max = tf->iop_gld->max;
	}

	list_for_each_entry(tf, &all_traces, list)
		tf->iop_gld->max = max;

	setup_axis(plot);
	set_plot_label(plot, "IOPs");
	if (num_traces > 1)
		svg_alloc_legend(plot, num_traces);

	tf = list_entry(all_traces.next, struct trace_file, list);

	scale_line_graph_bytes(&max, &units, 1000);
	set_ylabel(plot, "IO/s");

	set_yticks(plot, num_yticks, 0, max, units);
	set_xticks(plot, num_xticks, min_seconds, max_seconds);

	list_for_each_entry(tf, &all_traces, list) {
		svg_line_graph(plot, tf->iop_gld, tf->line_color, 0, 0);
		if (num_traces > 1)
			svg_add_legend(plot, tf->label, "", tf->line_color);
	}

	if (plot->add_xlabel)
		set_xlabel(plot, "Time (seconds)");
	if (num_traces > 1)
		svg_write_legend(plot);

	close_plot(plot);
	total_graphs_written++;
}

static void check_plot_columns(struct plot *plot, int index)
{
	int count;

	if (columns > 1 && (total_graphs_written == 0 ||
	    total_graphs_written % columns != 0)) {
		count = graphs_left(index);
		if (plot->direction == PLOT_DOWN) {
			plot->start_x_offset = 0;
			if (count <= columns)
				plot->add_xlabel = 1;
		}
		plot->direction = PLOT_ACROSS;

	} else {
		plot->direction = PLOT_DOWN;
		if (index == last_active_graph)
			plot->add_xlabel = 1;
	}

}

enum {
	HELP_LONG_OPT = 1,
};

char *option_string = "F:T:t:o:l:r:O:N:d:D:p:m::h:w:c:x:y:a:C:PK";
static struct option long_options[] = {
	{"columns", required_argument, 0, 'c'},
	{"fio-trace", required_argument, 0, 'F'},
	{"title", required_argument, 0, 'T'},
	{"trace", required_argument, 0, 't'},
	{"output", required_argument, 0, 'o'},
	{"label", required_argument, 0, 'l'},
	{"rolling", required_argument, 0, 'r'},
	{"no-graph", required_argument, 0, 'N'},
	{"only-graph", required_argument, 0, 'O'},
	{"device", required_argument, 0, 'd'},
	{"blktrace-destination", required_argument, 0, 'D'},
	{"prog", required_argument, 0, 'p'},
	{"movie", optional_argument, 0, 'm'},
	{"codec", optional_argument, 0, 'C'},
	{"keep-movie-svgs", no_argument, 0, 'K'},
	{"width", required_argument, 0, 'w'},
	{"height", required_argument, 0, 'h'},
	{"xzoom", required_argument, 0, 'x'},
	{"yzoom", required_argument, 0, 'y'},
	{"io-plot-action", required_argument, 0, 'a'},
	{"per-process-io", no_argument, 0, 'P'},
	{"help", no_argument, 0, HELP_LONG_OPT},
	{0, 0, 0, 0}
};

static void print_usage(void)
{
	fprintf(stderr, "iowatcher usage:\n"
		"\t-d (--device): device for blktrace to trace\n"
		"\t-D (--blktrace-destination): destination for blktrace\n"
		"\t-t (--trace): trace file name (more than one allowed)\n"
		"\t-F (--fio-trace): fio bandwidth trace (more than one allowed)\n"
		"\t-l (--label): trace label in the graph\n"
		"\t-o (--output): output file name (SVG only)\n"
		"\t-p (--prog): program to run while blktrace is run\n"
		"\t-K (--keep-movie-svgs keep svgs generated for movie mode\n"
		"\t-m (--movie [=spindle|rect]): create IO animations\n"
		"\t-C (--codec): ffmpeg codec. Use ffmpeg -codecs to list\n"
		"\t-r (--rolling): number of seconds in the rolling averge\n"
		"\t-T (--title): graph title\n"
		"\t-N (--no-graph): skip a single graph (io, tput, latency, queue_depth, \n"
		"\t\t\tiops, cpu-sys, cpu-io, cpu-irq cpu-soft cpu-user)\n"
		"\t-O (--only-graph): add a single graph to the output\n"
		"\t-h (--height): set the height of each graph\n"
		"\t-w (--width): set the width of each graph\n"
		"\t-c (--columns): numbers of columns in graph output\n"
		"\t-x (--xzoom): limit processed time to min:max\n"
		"\t-y (--yzoom): limit processed sectors to min:max\n"
		"\t-a (--io-plot-action): plot given action (one of Q,D,C) in IO graph\n"
		"\t-P (--per-process-io): distinguish between processes in IO graph\n"
	       );
	exit(1);
}

static int parse_double_range(char *str, double *min, double *max)
{
	char *end;

	/* Empty lower bound - leave original value */
	if (str[0] != ':') {
		*min = strtod(str, &end);
		if (*min == HUGE_VAL || *min == -HUGE_VAL)
			return -ERANGE;
		if (*end != ':')
			return -EINVAL;
	} else
		end = str;
	/* Empty upper bound - leave original value */
	if (end[1]) {
		*max = strtod(end+1, &end);
		if (*max == HUGE_VAL || *max == -HUGE_VAL)
			return -ERANGE;
		if (*end != 0)
			return -EINVAL;
	}
	if (*min > *max)
		return -EINVAL;
	return 0;
}

static int parse_ull_range(char *str, unsigned long long *min,
			   unsigned long long *max)
{
	char *end;

	/* Empty lower bound - leave original value */
	if (str[0] != ':') {
		*min = strtoull(str, &end, 10);
		if (*min == ULLONG_MAX && errno == ERANGE)
			return -ERANGE;
		if (*end != ':')
			return -EINVAL;
	} else
		end = str;
	/* Empty upper bound - leave original value */
	if (end[1]) {
		*max = strtoull(end+1, &end, 10);
		if (*max == ULLONG_MAX && errno == ERANGE)
			return -ERANGE;
		if (*end != 0)
			return -EINVAL;
	}
	if (*min > *max)
		return -EINVAL;
	return 0;
}

static int parse_options(int ac, char **av)
{
	int c;
	int disabled = 0;

	while (1) {
		// int this_option_optind = optind ? optind : 1;
		int option_index = 0;

		c = getopt_long(ac, av, option_string,
				long_options, &option_index);

		if (c == -1)
			break;

		switch(c) {
		case 'T':
			graph_title = strdup(optarg);
			break;
		case 't':
			add_trace_file(optarg);
			set_blktrace_outfile(optarg);
			break;
		case 'F':
			add_fio_trace_file(optarg);
			break;
		case 'o':
			output_filename = strdup(optarg);
			break;
		case 'l':
			set_trace_label(optarg);
			break;
		case 'r':
			set_rolling_avg(atoi(optarg));
			break;
		case 'O':
			if (!disabled) {
				disable_all_graphs();
				disabled = 1;
			}
			enable_one_graph(optarg);
			break;
		case 'N':
			disable_one_graph(optarg);
			break;
		case 'd':
			if (num_blktrace_devices == MAX_DEVICES_PER_TRACE - 1) {
				fprintf(stderr, "Too many blktrace devices provided\n");
				exit(1);
			}
			blktrace_devices[num_blktrace_devices++] = strdup(optarg);
			break;
		case 'D':
			blktrace_dest_dir = strdup(optarg);
			if (!strcmp(blktrace_dest_dir, "")) {
				fprintf(stderr, "Need a directory\n");
				print_usage();
			}
			break;
		case 'p':
			program_to_run = strdup(optarg);
			break;
		case 'K':
			keep_movie_svgs = 1;
			break;
		case 'm':
			make_movie = 1;
			if (optarg) {
				movie_style = lookup_movie_style(optarg);
				if (movie_style < 0) {
					fprintf(stderr, "Unknown movie style %s\n", optarg);
					print_usage();
				}
			}
			fprintf(stderr, "Using movie style: %s\n",
				movie_styles[movie_style]);
			break;
		case 'C':
			ffmpeg_codec = strdup(optarg);
			break;
		case 'h':
			opt_graph_height = atoi(optarg);
			break;
		case 'w':
			opt_graph_width = atoi(optarg);
			break;
		case 'c':
			columns = atoi(optarg);
			break;
		case 'x':
			if (parse_double_range(optarg, &min_time, &max_time)
			    < 0) {
				fprintf(stderr, "Cannot parse time range %s\n",
					optarg);
				exit(1);
			}
			break;
		case 'y':
			if (parse_ull_range(optarg, &min_mb, &max_mb)
			    < 0) {
				fprintf(stderr,
					"Cannot parse offset range %s\n",
					optarg);
				exit(1);
			}
			if (max_mb > ULLONG_MAX >> 20) {
				fprintf(stderr,
					"Upper range limit too big."
					" Maximum is %llu.\n", ULLONG_MAX >> 20);
				exit(1);
			}
			break;
		case 'a':
			if (strlen(optarg) != 1) {
action_err:
				fprintf(stderr, "Action must be one of Q, D, C.");
				exit(1);
			}
			plot_io_action = action_char_to_num(optarg[0]);
			if (plot_io_action < 0)
				goto action_err;
			break;
		case 'P':
			io_per_process = 1;
			break;
		case '?':
		case HELP_LONG_OPT:
			print_usage();
			break;
		default:
			break;
		}
	}
	return 0;
}

static void dest_mkdir(char *dir)
{
	int ret;

	ret = mkdir(dir, 0777);
	if (ret && errno != EEXIST) {
		fprintf(stderr, "failed to mkdir error %s\n", strerror(errno));
		exit(errno);
	}
}

int main(int ac, char **av)
{
	struct plot *plot;
	unsigned int min_seconds = 0;
	unsigned int max_seconds = 0;
	u64 max_offset = 0;
	u64 min_offset = ~(u64)0;
	struct trace_file *tf;
	int ret;
	int rows, cols;

	init_io_hash_table();
	init_process_hash_table();

	enable_all_graphs();

	parse_options(ac, av);

	last_active_graph = last_graph();
	if (make_movie) {
		set_io_graph_scale(256);
		if (movie_style == MOVIE_SPINDLE)
			set_graph_size(750, 550);
		else
			set_graph_size(700, 400);

		/*
		 * the plots in the movie don't have a seconds
		 * line yet, this makes us skip it
		 */
		last_active_graph = TOTAL_GRAPHS + 1;
	}
	if (opt_graph_height)
		set_graph_height(opt_graph_height);

	if (opt_graph_width)
		set_graph_width(opt_graph_width);

	if (list_empty(&all_traces) && list_empty(&fio_traces)) {
		fprintf(stderr, "No traces found, exiting\n");
		exit(1);
	}

	if (num_blktrace_devices) {
		char *path;

		dest_mkdir(blktrace_dest_dir);
		if (num_blktrace_devices > 1) {
			snprintf(line, line_len, "%s/%s", blktrace_dest_dir,
				 blktrace_outfile);
			dest_mkdir(line);
		}

		path = join_path(blktrace_dest_dir, blktrace_outfile);

		snprintf(line, line_len, "%s.dump", path);
		unlink(line);

		ret = start_blktrace(blktrace_devices, num_blktrace_devices,
				     blktrace_outfile, blktrace_dest_dir);
		if (ret) {
			fprintf(stderr, "exiting due to blktrace failure\n");
			exit(1);
		}

		start_mpstat(path);
		if (program_to_run) {
			ret = run_program(program_to_run);
			if (ret) {
				fprintf(stderr, "failed to run %s\n",
					program_to_run);
				exit(1);
			}
			wait_for_tracers();
		} else {
			/* no program specified, just wait for
			 * blktrace to exit
			 */
			wait_for_tracers();
		}
		free(path);
	}

	/* step one, read all the traces */
	read_traces();

	/* step two, find the maxes for time and offset */
	list_for_each_entry(tf, &all_traces, list)
		compare_minmax_tf(tf, &max_seconds, &min_offset, &max_offset);
	list_for_each_entry(tf, &fio_traces, list)
		compare_minmax_tf(tf, &max_seconds, &min_offset, &max_offset);
	min_seconds = min_time;
	if (max_seconds > max_time)
		max_seconds = ceil(max_time);
	if (min_offset < min_mb << 20)
		min_offset = min_mb << 20;
	if (max_offset > max_mb << 20)
		max_offset = max_mb << 20;

	/* push the max we found into all the tfs */
	set_all_minmax_tf(min_seconds, max_seconds, min_offset, max_offset);

	/* alloc graphing structs for all the traces */
	setup_trace_file_graphs();

	/* run through all the traces and read their events */
	read_trace_events();

	pick_line_graph_color();

	plot = alloc_plot();

	if (make_movie) {
		set_legend_width(longest_label + longest_proc_name + 1 + strlen("writes"));
		plot_io_movie(plot);
		exit(0);
	}

	set_plot_output(plot, output_filename);

	if (active_graphs[IO_GRAPH_INDEX] || found_mpstat)
		set_legend_width(longest_label + longest_proc_name + 1 + strlen("writes"));
	else if (num_traces >= 1 || num_fio_traces >= 1)
		set_legend_width(longest_label);
	else
		set_legend_width(0);

	get_graph_size(&cols, &rows);
	if (columns > 1)
		plot->add_xlabel = 1;
	set_plot_title(plot, graph_title);

	check_plot_columns(plot, IO_GRAPH_INDEX);
	plot_io(plot, min_seconds, max_seconds, min_offset, max_offset);
	plot->add_xlabel = 0;

	if (columns > 1) {
		set_graph_size(cols / columns, rows);
		num_xticks /= columns;
		if (num_xticks < 2)
			num_xticks = 2;
	}
	if (rows <= 50)
		num_yticks--;

	check_plot_columns(plot, TPUT_GRAPH_INDEX);
	plot_tput(plot, min_seconds, max_seconds, 1);

	check_plot_columns(plot, FIO_GRAPH_INDEX);
	plot_fio_tput(plot, min_seconds, max_seconds);

	check_plot_columns(plot, CPU_IO_GRAPH_INDEX);
	plot_cpu(plot, max_seconds, "CPU IO Wait Time",
		 CPU_IO_GRAPH_INDEX, MPSTAT_IO);

	check_plot_columns(plot, CPU_SYS_GRAPH_INDEX);
	plot_cpu(plot, max_seconds, "CPU System Time",
		 CPU_SYS_GRAPH_INDEX, MPSTAT_SYS);

	check_plot_columns(plot, CPU_IRQ_GRAPH_INDEX);
	plot_cpu(plot, max_seconds, "CPU IRQ Time",
		 CPU_IRQ_GRAPH_INDEX, MPSTAT_IRQ);

	check_plot_columns(plot, CPU_SOFT_GRAPH_INDEX);
	plot_cpu(plot, max_seconds, "CPU SoftIRQ Time",
		 CPU_SOFT_GRAPH_INDEX, MPSTAT_SOFT);

	check_plot_columns(plot, CPU_USER_GRAPH_INDEX);
	plot_cpu(plot, max_seconds, "CPU User Time",
		 CPU_USER_GRAPH_INDEX, MPSTAT_USER);

	check_plot_columns(plot, LATENCY_GRAPH_INDEX);
	plot_latency(plot, min_seconds, max_seconds);

	check_plot_columns(plot, QUEUE_DEPTH_GRAPH_INDEX);
	plot_queue_depth(plot, min_seconds, max_seconds);

	check_plot_columns(plot, IOPS_GRAPH_INDEX);
	plot_iops(plot, min_seconds, max_seconds);

	/* once for all */
	close_plot(plot);
	close_plot_file(plot);
	return 0;
}
