cache line locking on AMD x86_64 utilising L3 CAT pseudo-locking
1#ifndef ICEPICK_H
2#define ICEPICK_H
3
4#include <stddef.h>
5#include <stdint.h>
6#include <stdbool.h>
7
8#define ICEPICK_E_NO_CAT (-1)
9#define ICEPICK_E_PERMISSION (-2)
10#define ICEPICK_E_NO_CLOS (-3)
11#define ICEPICK_E_TOO_LARGE (-4)
12#define ICEPICK_E_NUMA (-5)
13#define ICEPICK_E_HUGEPAGE (-6)
14#define ICEPICK_E_VERIFY (-7)
15#define ICEPICK_E_INVALID (-8)
16#define ICEPICK_E_ALLOC (-9)
17#define ICEPICK_E_MSR (-10)
18#define ICEPICK_E_THREAD (-11)
19
20typedef enum {
21 ICEPICK_PRIME_TEMPORAL,
22 ICEPICK_PRIME_PREFETCHT2,
23 ICEPICK_PRIME_PREFETCHNTA,
24 ICEPICK_PRIME_NT_STORE,
25} icepick_prime_strategy_t;
26
27typedef enum {
28 ICEPICK_PATTERN_SEQUENTIAL,
29 ICEPICK_PATTERN_REVERSE,
30 ICEPICK_PATTERN_STRIDED,
31 ICEPICK_PATTERN_POINTER_CHASE,
32} icepick_access_pattern_t;
33
34typedef enum {
35 ICEPICK_CORE_ANY,
36 ICEPICK_CORE_PCORE,
37 ICEPICK_CORE_ECORE,
38} icepick_core_type_t;
39
40typedef struct icepick_topology icepick_topology_t;
41typedef struct icepick_region icepick_region_t;
42typedef struct icepick_monitor icepick_monitor_t;
43
44typedef struct {
45 size_t size;
46 unsigned clos_id;
47 int numa_node;
48 bool huge_pages;
49 bool verify;
50 bool auto_monitor;
51 uint64_t pmu_poll_interval_ns;
52 uint64_t probe_interval_ns;
53 uint32_t miss_threshold;
54 icepick_prime_strategy_t prime_strategy;
55 icepick_access_pattern_t access_pattern;
56 size_t stride_bytes;
57 unsigned prime_iterations;
58 unsigned mba_throttle;
59 icepick_core_type_t core_type;
60} icepick_config_t;
61
62typedef struct {
63 uint64_t mean_ns;
64 uint64_t stddev_ns;
65 uint64_t p50_ns;
66 uint64_t p99_ns;
67 uint64_t p999_ns;
68 uint64_t min_ns;
69 uint64_t max_ns;
70} icepick_latency_stats_t;
71
72int icepick_discover_topology(icepick_topology_t **topo);
73void icepick_free_topology(icepick_topology_t *topo);
74
75unsigned icepick_topology_l3_ways(const icepick_topology_t *topo);
76size_t icepick_topology_l3_size(const icepick_topology_t *topo);
77size_t icepick_topology_way_size(const icepick_topology_t *topo);
78unsigned icepick_topology_max_clos(const icepick_topology_t *topo);
79unsigned icepick_topology_ccx_count(const icepick_topology_t *topo);
80bool icepick_topology_cat_supported(const icepick_topology_t *topo);
81bool icepick_topology_mba_supported(const icepick_topology_t *topo);
82bool icepick_topology_mba_is_linear(const icepick_topology_t *topo);
83unsigned icepick_topology_max_mba_thrtl(const icepick_topology_t *topo);
84bool icepick_topology_is_hybrid(const icepick_topology_t *topo);
85unsigned icepick_topology_pcore_count(const icepick_topology_t *topo);
86unsigned icepick_topology_ecore_count(const icepick_topology_t *topo);
87
88int icepick_lock(icepick_topology_t *topo, const icepick_config_t *cfg, icepick_region_t **region);
89int icepick_unlock(icepick_region_t *region);
90
91void *icepick_region_ptr(const icepick_region_t *region);
92size_t icepick_region_size(const icepick_region_t *region);
93unsigned icepick_region_clos(const icepick_region_t *region);
94
95int icepick_verify(const icepick_region_t *region, icepick_latency_stats_t *stats);
96
97int icepick_bench(void *ptr, size_t size, size_t iterations,
98 icepick_latency_stats_t *stats);
99
100int icepick_monitor_start(icepick_region_t *region, icepick_monitor_t **mon);
101int icepick_monitor_start_ex(icepick_region_t *region, uint64_t pmu_poll_ns,
102 uint64_t probe_ns, uint32_t miss_thresh,
103 icepick_monitor_t **mon);
104int icepick_monitor_stop(icepick_monitor_t *mon);
105uint64_t icepick_monitor_eviction_count(const icepick_monitor_t *mon);
106uint64_t icepick_monitor_reprime_count(const icepick_monitor_t *mon);
107bool icepick_monitor_is_degraded(const icepick_monitor_t *mon);
108
109const char *icepick_strerror(int err);
110
111#endif