cache line locking on AMD x86_64 utilising L3 CAT pseudo-locking
1#ifndef ICEPICK_INTERNAL_H
2#define ICEPICK_INTERNAL_H
3
4#include "../include/icepick.h"
5#include <stdint.h>
6#include <stdatomic.h>
7#include <pthread.h>
8
9#define MSR_IA32_PQR_ASSOC 0xC8F
10#define MSR_IA32_L3_QOS_MASK_0 0xC90
11
12#define CACHE_LINE_SIZE 64
13#define MAX_CLOS 16
14#define MAX_CCXS 16
15
16#define MONITOR_DEFAULT_PMU_POLL_NS 100000
17#define MONITOR_DEFAULT_PROBE_NS 10000
18#define MONITOR_DEFAULT_MISS_THRESH 16
19#define MONITOR_PROBE_CONFIRM_COUNT 8
20#define MONITOR_L3_LATENCY_THRESH_NS 50
21
22struct icepick_monitor;
23
24struct icepick_topology {
25 bool cat_supported;
26 unsigned l3_ways;
27 size_t l3_size;
28 size_t way_size;
29 unsigned max_clos;
30 unsigned ccx_count;
31 uint32_t default_way_mask;
32 int ccx_numa_node[MAX_CCXS];
33};
34
35struct icepick_region {
36 void *ptr;
37 size_t size;
38 unsigned clos_id;
39 int numa_node;
40 uint32_t way_mask;
41 icepick_topology_t *topo;
42 struct icepick_monitor *monitor;
43 icepick_prime_strategy_t prime_strategy;
44 icepick_access_pattern_t access_pattern;
45 size_t stride_bytes;
46 unsigned prime_iterations;
47};
48
49struct icepick_monitor {
50 icepick_region_t *region;
51 pthread_t thread;
52 int perf_fd;
53 int msr_fd;
54 int cpu;
55 atomic_bool running;
56 atomic_uint_fast64_t eviction_count;
57 atomic_uint_fast64_t reprime_count;
58 uint64_t pmu_poll_interval_ns;
59 uint64_t probe_interval_ns;
60 uint32_t miss_threshold;
61 bool degraded;
62};
63
64typedef struct {
65 bool allocated;
66 uint32_t way_mask;
67} clos_entry_t;
68
69extern clos_entry_t clos_table[MAX_CLOS];
70
71int msr_open(int cpu);
72void msr_close(int fd);
73int msr_read(int fd, uint32_t msr, uint64_t *value);
74int msr_write(int fd, uint32_t msr, uint64_t value);
75
76int clos_init(icepick_topology_t *topo);
77int clos_allocate(unsigned clos_id, uint32_t way_mask);
78int clos_release(unsigned clos_id);
79int clos_configure_mask(int msr_fd, unsigned clos_id, uint32_t way_mask);
80int clos_associate_thread(int msr_fd, unsigned clos_id);
81uint32_t clos_get_default_mask(void);
82
83int region_alloc(size_t size, int numa_node, bool huge_pages, void **out_ptr);
84void region_free(void *ptr, size_t size);
85
86uint64_t rdtsc_start(void);
87uint64_t rdtsc_end(void);
88uint64_t cycles_to_ns(uint64_t cycles);
89
90int bench_compare(icepick_topology_t *topo, size_t size, size_t iterations);
91
92void prime_region(volatile char *ptr, size_t size, unsigned iterations,
93 icepick_prime_strategy_t strategy, icepick_access_pattern_t pattern,
94 size_t stride);
95int monitor_perf_open(int cpu, bool is_amd);
96
97#endif