aboutsummaryrefslogtreecommitdiffstats
path: root/hw_vars
blob: 8731cefb9f57207f4e003eee426f4abe2499bf56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/bin/sh

if [ -n "$runtime" ]; then
	USEMEM="$CMD ./usemem --runtime $runtime"
else
	USEMEM="$CMD ./usemem"
fi

[ -n "$SYNC_RW" ] && USEMEM="$USEMEM -y"
[ -n "$SYNC_FREE" ] && USEMEM="$USEMEM -x"
[ -n "$BIND_CPU" ] && USEMEM="$USEMEM -b $BIND_CPU"
[ -n "$REPEAT_COUNT" ] && USEMEM="$USEMEM -r $REPEAT_COUNT"
[ -n "$DELAY" ] && USEMEM="$USEMEM -e $DELAY"

TMPFS_MNT=/tmp/vm-scalability-tmp
SHM_FILE=$TMPFS_MNT/sparse-${0#*case-}

SPARSE_ROOT=${SPARSE_ROOT:-$TMPFS_MNT/vm-scalability}
SPARSE_FILE=$SPARSE_ROOT/sparse-${0#*case-}
# SPARSE_FSTYPE=$(/usr/bin/stat -fc %T $SPARSE_ROOT)
# [ $SPARSE_FSTYPE = tmpfs ] && echo "$SPARSE_ROOT is tmpfs, sparse files won't eat memory." && exit 1
# [ $SPARSE_FSTYPE = nfs ] && echo "$SPARSE_ROOT is nfs, sparse file reads will be slow." && exit 1

PIDFILE=$SPARSE_ROOT/${0#*case-}.pid

mount_tmpfs()
{
	if [ -d "$TMPFS_MNT" ]; then
		mountpoint -q $TMPFS_MNT && umount $TMPFS_MNT
	else
		mkdir $TMPFS_MNT
	fi
	$CMD mount -t tmpfs -o size=100% vm-scalability-tmp $TMPFS_MNT

	shm_size=$(/usr/bin/stat -f -c "%b*%S" $TMPFS_MNT)
	export shm_size=$(($shm_size))
}

create_loop_devices()
{
	local i

	modprobe loop 2>/dev/null
	[ -e "/dev/loop0" ] || modprobe loop 2>/dev/null

	for i in $(seq 0 8)
	do
		[ -e "/dev/loop$i" ] && continue
		mknod /dev/loop$i b 7 $i
	done
}

# sparse files won't work as expected on tmpfs/nfs
create_sparse_root () {
	$CMD truncate -s $((mem)) $SPARSE_ROOT.img
	case ${fs:-xfs} in
		btrfs)
			$CMD mkfs.btrfs $SPARSE_ROOT.img > /dev/null
			;;
		ext4)
			$CMD mkfs.ext4 -q -F $SPARSE_ROOT.img
			;;
		xfs)
			$CMD mkfs.xfs -q $SPARSE_ROOT.img
			;;
	esac
	[ -d "$SPARSE_ROOT" ] || mkdir $SPARSE_ROOT

	# check if already mounted
	if mountpoint -q $SPARSE_ROOT; then
		echo "$SPARSE_ROOT already mounted"
	else
		create_loop_devices
		$CMD mount -o loop $SPARSE_ROOT.img $SPARSE_ROOT 2>/dev/null || {
			local loop_dev=$(losetup -f --show $SPARSE_ROOT.img)
			[ -n "$loop_dev" ] || {
				grep -q loop /proc/devices || echo 'No loop block device!' >&2
				lsmod | grep -q loop || echo 'No loop module' >&2
				LOOPDEV_DEBUG=1 losetup -f --show $SPARSE_ROOT.img
				exit
			}
			mount $loop_dev $SPARSE_ROOT
		}
	fi
}

remove_tmpfs()
{
	$CMD umount $TMPFS_MNT
}

remove_sparse_root () {
	$CMD umount $SPARSE_ROOT || {
		df
		lsof $SPARSE_ROOT
	}
	# rmdir $SPARSE_ROOT
	$CMD rm $SPARSE_ROOT.img
}

create_sparse_file () {
	name=$1
	size=$2
	# echo "$name is of size $size"
	$CMD truncate $name -s $size
	# dd if=/dev/zero of=$name bs=1k count=1 seek=$((size >> 10)) 2>/dev/null
	# ls $SPARSE_ROOT
	# ls /tmp/vm-scalability/*
}


pagesize=$(getconf PAGESIZE)

nr_cpu=$(grep -c processor /proc/cpuinfo)
nr_node=$(echo /sys/devices/system/node/node* | wc -w)

nr_task=${nr_task:-$nr_cpu}

while read key val; do
	[ -n "${val}" ] || continue
	[ -z "${val##*[0-9]}" -a -z "${val%%[0-9]*}" ] || {
		echo "invalid vmstat line: $key $val" >&2
		break
	}
	eval "$key=$val"
done < /proc/vmstat

reclaimable=$((nr_free_pages + nr_file_pages))
reclaimable=$((reclaimable * pagesize))

while read key val unit; do
	key=${key%%:}
	key=${key%%)}
	[ "${key#*(}" != "$key" ] &&
	key=${key%(*}_${key#*(}
	eval $key=$val
done < /proc/meminfo

mem=$((MemTotal << 10))
mem_avail=$((MemAvailable << 10))
hugepagesize=$((Hugepagesize << 10))

ROTATE_BYTES=$((1<<42))

# Documentation/x86/x86_64/mm.txt
# 0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
AS_LIMIT=$((1<<46))

# prevent OOM: limit pagetable pages to half available memory
# $mem_avail / 2 / 4K = upper_limit_nr_page_table_pages
# every PTE maps 2M space, so
# $upper_limit_nr_page_table_pages * 2M = upper_limit_test_size = PTE_LIMIT
# PTE_LIMIT = 256 * $mem_tail
PTE_LIMIT=$((mem_avail << 8))

[ "$ROTATE_BYTES" -gt $PTE_LIMIT ] && ROTATE_BYTES=$PTE_LIMIT