/*
 * time_in_state eBPF program
 *
 * Copyright (C) 2018 Google
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 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.
 *
 */

#include <bpf_helpers.h>

struct time_key {
    uint32_t uid;
    uint32_t freq;
};

struct bpf_map_def SEC("maps") uid_times = {
        .type = BPF_MAP_TYPE_PERCPU_HASH,
        .key_size = sizeof(struct time_key),
        .value_size = sizeof(uint64_t),
        .max_entries = 10240,
};

struct bpf_map_def SEC("maps") cpu_last_update = {
        .type = BPF_MAP_TYPE_PERCPU_ARRAY,
        .key_size = sizeof(int),
        .value_size = sizeof(uint64_t),
        .max_entries = 1,
};

struct bpf_map_def SEC("maps") cpu_freq = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(int),
        .value_size = sizeof(uint32_t),
        /* Assume max of 1024 CPUs */
        .max_entries = 1024,
};

struct switch_args {
    unsigned long long ignore;
    char prev_comm[16];
    int prev_pid;
    int prev_prio;
    long long prev_state;
    char next_comm[16];
    int next_pid;
    int next_prio;
};

SEC("tracepoint/sched/sched_switch")
int tp_sched_switch(struct switch_args* args) {
    uint32_t zero = 0;
    uint64_t* last = bpf_map_lookup_elem(&cpu_last_update, &zero);
    if (!last) return 0;
    uint64_t old_last = *last;
    uint64_t time = bpf_ktime_get_ns();
    *last = time;
    uint32_t cpu = bpf_get_smp_processor_id();
    uint32_t* freq = bpf_map_lookup_elem(&cpu_freq, &cpu);
    if (args->prev_pid && old_last && freq && *freq) {
        uint32_t uid = bpf_get_current_uid_gid();
        struct time_key key = {.uid = uid, .freq = *freq};
        uint64_t* tot_time = bpf_map_lookup_elem(&uid_times, &key);
        uint64_t delta = time - old_last;
        if (!tot_time)
            bpf_map_update_elem(&uid_times, &key, &delta, BPF_ANY);
        else
            *tot_time += delta;
    }
    return 0;
}

struct cpufreq_args {
    unsigned long long ignore;
    unsigned int state;
    unsigned int cpu_id;
};

SEC("tracepoint/power/cpu_frequency")
int tp_cpufreq(struct cpufreq_args* args) {
    unsigned int cpu = args->cpu_id;
    unsigned int new = args->state;
    bpf_map_update_elem(&cpu_freq, &cpu, &new, BPF_ANY);
    return 0;
}

char _license[] SEC("license") = "GPL";
