cache line locking on AMD x86_64 utilising L3 CAT pseudo-locking
1#!/bin/bash
2
3set -e
4
5echo "icepick hardware support check"
6echo
7
8check_cpuid() {
9 if ! command -v cpuid &> /dev/null; then
10 echo "- cpuid command not found. install cpuid package for detailed info."
11 return 1
12 fi
13
14 echo "checking cat support via cpuid..."
15 if cpuid -1 -l 0x10 -s 0 2>/dev/null | grep -q "L3 CAT"; then
16 echo "+ l3 cat supported"
17 cpuid -1 -l 0x10 -s 1 2>/dev/null | grep -E "(ways|CLOS)" || true
18 else
19 echo "- l3 cat not supported on this cpu"
20 fi
21 echo
22}
23
24check_msr_module() {
25 echo "checking msr kernel module..."
26 if lsmod | grep -q "^msr "; then
27 echo "+ msr module loaded"
28 else
29 echo "- msr module not loaded"
30 echo " run: sudo modprobe msr"
31 fi
32
33 if [ -e /dev/cpu/0/msr ]; then
34 echo "+ /dev/cpu/0/msr exists"
35 if [ -r /dev/cpu/0/msr ]; then
36 echo "+ msr device readable"
37 else
38 echo "- msr device not readable (need root or cap_sys_rawio)"
39 fi
40 else
41 echo "- /dev/cpu/0/msr does not exist"
42 fi
43 echo
44}
45
46check_resctrl() {
47 echo "checking resctrl filesystem..."
48 if mount | grep -q "resctrl"; then
49 echo "+ resctrl mounted"
50 mount | grep resctrl
51 else
52 echo "- resctrl not mounted"
53 echo " run: sudo mount -t resctrl resctrl /sys/fs/resctrl"
54 fi
55
56 if [ -d /sys/fs/resctrl/info/L3 ]; then
57 echo
58 echo "l3 cat info from resctrl:"
59 echo " cbm mask: $(cat /sys/fs/resctrl/info/L3/cbm_mask 2>/dev/null || echo 'n/a')"
60 echo " min cbm: $(cat /sys/fs/resctrl/info/L3/min_cbm_bits 2>/dev/null || echo 'n/a')"
61 echo " num clos: $(cat /sys/fs/resctrl/info/L3/num_closids 2>/dev/null || echo 'n/a')"
62 fi
63 echo
64}
65
66check_hugepages() {
67 echo "checking huge pages..."
68 local nr_hugepages=$(cat /proc/sys/vm/nr_hugepages 2>/dev/null || echo "0")
69 local free_hugepages=$(grep HugePages_Free /proc/meminfo 2>/dev/null | awk '{print $2}' || echo "0")
70 local hugepage_size=$(grep Hugepagesize /proc/meminfo 2>/dev/null | awk '{print $2, $3}' || echo "n/a")
71
72 echo " configured: $nr_hugepages"
73 echo " free: $free_hugepages"
74 echo " size: $hugepage_size"
75
76 if [ "$free_hugepages" -gt 0 ]; then
77 echo "+ huge pages available"
78 else
79 echo "- no free huge pages"
80 echo " run: sudo sh -c 'echo 64 > /proc/sys/vm/nr_hugepages'"
81 fi
82 echo
83}
84
85cpu_info() {
86 echo "cpu information:"
87 grep -m1 "model name" /proc/cpuinfo | cut -d: -f2 | xargs echo " model:"
88
89 local vendor=$(grep -m1 "vendor_id" /proc/cpuinfo | cut -d: -f2 | xargs)
90 echo " vendor: $vendor"
91
92 if [ "$vendor" = "AuthenticAMD" ]; then
93 local family=$(grep -m1 "cpu family" /proc/cpuinfo | cut -d: -f2 | xargs)
94 local model=$(grep -m1 "^model" /proc/cpuinfo | head -1 | cut -d: -f2 | xargs)
95 echo " family: $family"
96 echo " model: $model"
97 if [ "$family" -ge 23 ]; then
98 echo "+ zen architecture (cat likely supported)"
99 fi
100 fi
101 echo
102}
103
104cpu_info
105check_cpuid
106check_msr_module
107check_resctrl
108check_hugepages
109
110echo "check complete"