From 30e963631106aec2988a7295878b75f6c109fbe7 Mon Sep 17 00:00:00 2001
From: Christian Dietrich <dietrich@ibr.cs.tu-bs.de>
Date: Sat, 23 Dec 2023 00:00:00 +0000
Subject: [PATCH] Dec 23 -- Counting Presents. Fast!

Article:  https://ibr.cs.tu-bs.de/advent/23-rseq/
Workload: ~12 source-code lines
---
 23-rseq/Makefile                  |  23 ++
 23-rseq/benchmark.sh              |  11 +
 23-rseq/data.Ryzen7_PRO_5850U     | 160 +++++++++++++
 23-rseq/plot.Ryzen7_PRO_5850U.png | Bin 0 -> 71988 bytes
 23-rseq/plot.py                   |  35 +++
 23-rseq/rseq-asm.S                |  58 +++++
 23-rseq/rseq.2                    | 371 ++++++++++++++++++++++++++++++
 23-rseq/rseq.c                    | 243 +++++++++++++++++++
 8 files changed, 901 insertions(+)
 create mode 100644 23-rseq/Makefile
 create mode 100644 23-rseq/benchmark.sh
 create mode 100644 23-rseq/data.Ryzen7_PRO_5850U
 create mode 100644 23-rseq/plot.Ryzen7_PRO_5850U.png
 create mode 100644 23-rseq/plot.py
 create mode 100644 23-rseq/rseq-asm.S
 create mode 100644 23-rseq/rseq.2
 create mode 100644 23-rseq/rseq.c

diff --git a/23-rseq/Makefile b/23-rseq/Makefile
new file mode 100644
index 0000000..10c97b3
--- /dev/null
+++ b/23-rseq/Makefile
@@ -0,0 +1,23 @@
+PROG = rseq
+
+${PROG}: ${PROG}.o rseq-asm.o Makefile
+	gcc ${PROG}.o rseq-asm.o -o  $@ -Wall -g -Wno-unused-function -O3 -lpthread
+
+%.o: %.c
+	gcc -c $< -o  $@ -Wall -g -Wno-unused-function -O3
+
+%.o: %.S
+	gcc -c $< -o  $@ 
+
+run: ${PROG}
+	./${PROG} 32 regular
+	./${PROG} 32 lock
+
+clean:
+	rm -f ./${PROG} *.o
+
+man:
+	man ./rseq.2
+
+plot:
+	./plot.py data
diff --git a/23-rseq/benchmark.sh b/23-rseq/benchmark.sh
new file mode 100644
index 0000000..937608a
--- /dev/null
+++ b/23-rseq/benchmark.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+rm data
+
+for mode in rseq-atomic rseq regular lock getcpu-atomic ; do
+    for threads in `seq 1 32`; do
+        ./rseq $threads $mode 8 >> data
+    done
+done
+
+echo "Run: ./plot.py data"
diff --git a/23-rseq/data.Ryzen7_PRO_5850U b/23-rseq/data.Ryzen7_PRO_5850U
new file mode 100644
index 0000000..d0a00ba
--- /dev/null
+++ b/23-rseq/data.Ryzen7_PRO_5850U
@@ -0,0 +1,160 @@
+mode=rseq-atomic threads=1 sum=400000000 state=ok aborts=0 cputime=2.199005s per_increment=5.497513ns
+mode=rseq-atomic threads=2 sum=800000000 state=ok aborts=0 cputime=3.284306s per_increment=4.105382ns
+mode=rseq-atomic threads=3 sum=1200000000 state=ok aborts=0 cputime=4.448196s per_increment=3.706830ns
+mode=rseq-atomic threads=4 sum=1600000000 state=ok aborts=0 cputime=8.446127s per_increment=5.278830ns
+mode=rseq-atomic threads=5 sum=2000000000 state=ok aborts=0 cputime=9.053520s per_increment=4.526760ns
+mode=rseq-atomic threads=6 sum=2400000000 state=ok aborts=0 cputime=12.195459s per_increment=5.081441ns
+mode=rseq-atomic threads=7 sum=2800000000 state=ok aborts=0 cputime=11.748222s per_increment=4.195793ns
+mode=rseq-atomic threads=8 sum=3200000000 state=ok aborts=0 cputime=15.032143s per_increment=4.697545ns
+mode=rseq-atomic threads=9 sum=3600000000 state=ok aborts=0 cputime=16.116472s per_increment=4.476798ns
+mode=rseq-atomic threads=10 sum=4000000000 state=ok aborts=0 cputime=20.672133s per_increment=5.168033ns
+mode=rseq-atomic threads=11 sum=4400000000 state=ok aborts=0 cputime=23.798913s per_increment=5.408844ns
+mode=rseq-atomic threads=12 sum=4800000000 state=ok aborts=0 cputime=26.946868s per_increment=5.613931ns
+mode=rseq-atomic threads=13 sum=5200000000 state=ok aborts=0 cputime=29.666975s per_increment=5.705187ns
+mode=rseq-atomic threads=14 sum=5600000000 state=ok aborts=0 cputime=33.483891s per_increment=5.979266ns
+mode=rseq-atomic threads=15 sum=6000000000 state=ok aborts=0 cputime=37.403459s per_increment=6.233910ns
+mode=rseq-atomic threads=16 sum=6400000000 state=ok aborts=0 cputime=40.505500s per_increment=6.328984ns
+mode=rseq-atomic threads=17 sum=6800000000 state=ok aborts=0 cputime=42.792953s per_increment=6.293081ns
+mode=rseq-atomic threads=18 sum=7200000000 state=ok aborts=0 cputime=45.171370s per_increment=6.273801ns
+mode=rseq-atomic threads=19 sum=7600000000 state=ok aborts=0 cputime=47.448919s per_increment=6.243279ns
+mode=rseq-atomic threads=20 sum=8000000000 state=ok aborts=0 cputime=49.511613s per_increment=6.188952ns
+mode=rseq-atomic threads=21 sum=8400000000 state=ok aborts=0 cputime=52.517915s per_increment=6.252133ns
+mode=rseq-atomic threads=22 sum=8800000000 state=ok aborts=0 cputime=55.319380s per_increment=6.286293ns
+mode=rseq-atomic threads=23 sum=9200000000 state=ok aborts=0 cputime=57.941721s per_increment=6.298013ns
+mode=rseq-atomic threads=24 sum=9600000000 state=ok aborts=0 cputime=60.357880s per_increment=6.287279ns
+mode=rseq-atomic threads=25 sum=10000000000 state=ok aborts=0 cputime=62.908038s per_increment=6.290804ns
+mode=rseq-atomic threads=26 sum=10400000000 state=ok aborts=0 cputime=65.316597s per_increment=6.280442ns
+mode=rseq-atomic threads=27 sum=10800000000 state=ok aborts=0 cputime=68.210331s per_increment=6.315771ns
+mode=rseq-atomic threads=28 sum=11200000000 state=ok aborts=0 cputime=71.145485s per_increment=6.352275ns
+mode=rseq-atomic threads=29 sum=11600000000 state=ok aborts=0 cputime=74.014644s per_increment=6.380573ns
+mode=rseq-atomic threads=30 sum=12000000000 state=ok aborts=0 cputime=80.516616s per_increment=6.709718ns
+mode=rseq-atomic threads=31 sum=12400000000 state=ok aborts=0 cputime=78.501505s per_increment=6.330767ns
+mode=rseq-atomic threads=32 sum=12800000000 state=ok aborts=0 cputime=81.190299s per_increment=6.342992ns
+mode=rseq threads=1 sum=400000000 state=ok aborts=0 cputime=2.483927s per_increment=6.209818ns
+mode=rseq threads=2 sum=800000000 state=ok aborts=1 cputime=2.927913s per_increment=3.659891ns
+mode=rseq threads=3 sum=1200000000 state=ok aborts=0 cputime=4.631658s per_increment=3.859715ns
+mode=rseq threads=4 sum=1600000000 state=ok aborts=2 cputime=9.087390s per_increment=5.679619ns
+mode=rseq threads=5 sum=2000000000 state=ok aborts=1 cputime=7.195553s per_increment=3.597776ns
+mode=rseq threads=6 sum=2400000000 state=ok aborts=0 cputime=9.132219s per_increment=3.805091ns
+mode=rseq threads=7 sum=2800000000 state=ok aborts=0 cputime=10.669462s per_increment=3.810522ns
+mode=rseq threads=8 sum=3200000000 state=ok aborts=2 cputime=14.527707s per_increment=4.539909ns
+mode=rseq threads=9 sum=3600000000 state=ok aborts=0 cputime=15.470640s per_increment=4.297400ns
+mode=rseq threads=10 sum=4000000000 state=ok aborts=3 cputime=18.031536s per_increment=4.507884ns
+mode=rseq threads=11 sum=4400000000 state=ok aborts=1 cputime=20.358866s per_increment=4.627015ns
+mode=rseq threads=12 sum=4800000000 state=ok aborts=4 cputime=23.474872s per_increment=4.890598ns
+mode=rseq threads=13 sum=5200000000 state=ok aborts=5 cputime=29.528908s per_increment=5.678636ns
+mode=rseq threads=14 sum=5600000000 state=ok aborts=8 cputime=30.623857s per_increment=5.468546ns
+mode=rseq threads=15 sum=6000000000 state=ok aborts=11 cputime=33.960129s per_increment=5.660021ns
+mode=rseq threads=16 sum=6400000000 state=ok aborts=14 cputime=36.712009s per_increment=5.736251ns
+mode=rseq threads=17 sum=6800000000 state=ok aborts=18 cputime=38.662291s per_increment=5.685631ns
+mode=rseq threads=18 sum=7200000000 state=ok aborts=22 cputime=40.966459s per_increment=5.689786ns
+mode=rseq threads=19 sum=7600000000 state=ok aborts=24 cputime=42.702562s per_increment=5.618758ns
+mode=rseq threads=20 sum=8000000000 state=ok aborts=17 cputime=45.202435s per_increment=5.650304ns
+mode=rseq threads=21 sum=8400000000 state=ok aborts=38 cputime=48.130558s per_increment=5.729828ns
+mode=rseq threads=22 sum=8800000000 state=ok aborts=48 cputime=50.154982s per_increment=5.699430ns
+mode=rseq threads=23 sum=9200000000 state=ok aborts=61 cputime=53.364385s per_increment=5.800477ns
+mode=rseq threads=24 sum=9600000000 state=ok aborts=57 cputime=54.841167s per_increment=5.712622ns
+mode=rseq threads=25 sum=10000000000 state=ok aborts=21 cputime=56.911656s per_increment=5.691166ns
+mode=rseq threads=26 sum=10400000000 state=ok aborts=39 cputime=59.314805s per_increment=5.703347ns
+mode=rseq threads=27 sum=10800000000 state=ok aborts=58 cputime=61.900339s per_increment=5.731513ns
+mode=rseq threads=28 sum=11200000000 state=ok aborts=42 cputime=63.666270s per_increment=5.684488ns
+mode=rseq threads=29 sum=11600000000 state=ok aborts=56 cputime=66.452641s per_increment=5.728676ns
+mode=rseq threads=30 sum=12000000000 state=ok aborts=87 cputime=68.713723s per_increment=5.726144ns
+mode=rseq threads=31 sum=12400000000 state=ok aborts=48 cputime=70.797445s per_increment=5.709471ns
+mode=rseq threads=32 sum=12800000000 state=ok aborts=69 cputime=73.319152s per_increment=5.728059ns
+mode=regular threads=1 sum=400000000 state=ok aborts=0 cputime=4.445797s per_increment=11.114493ns
+mode=regular threads=2 sum=800000000 state=ok aborts=0 cputime=10.181069s per_increment=12.726336ns
+mode=regular threads=3 sum=1200000000 state=ok aborts=0 cputime=15.207685s per_increment=12.673070ns
+mode=regular threads=4 sum=1600000000 state=ok aborts=0 cputime=20.394730s per_increment=12.746707ns
+mode=regular threads=5 sum=2000000000 state=ok aborts=0 cputime=25.606271s per_increment=12.803136ns
+mode=regular threads=6 sum=2400000000 state=ok aborts=0 cputime=30.550001s per_increment=12.729167ns
+mode=regular threads=7 sum=2800000000 state=ok aborts=0 cputime=31.396464s per_increment=11.213023ns
+mode=regular threads=8 sum=3200000000 state=ok aborts=0 cputime=40.884241s per_increment=12.776325ns
+mode=regular threads=9 sum=3600000000 state=ok aborts=0 cputime=48.727290s per_increment=13.535358ns
+mode=regular threads=10 sum=4000000000 state=ok aborts=0 cputime=57.116025s per_increment=14.279006ns
+mode=regular threads=11 sum=4400000000 state=ok aborts=0 cputime=65.007191s per_increment=14.774362ns
+mode=regular threads=12 sum=4800000000 state=ok aborts=0 cputime=72.886369s per_increment=15.184660ns
+mode=regular threads=13 sum=5200000000 state=ok aborts=0 cputime=82.631048s per_increment=15.890586ns
+mode=regular threads=14 sum=5600000000 state=ok aborts=0 cputime=83.803839s per_increment=14.964971ns
+mode=regular threads=15 sum=6000000000 state=ok aborts=0 cputime=101.826165s per_increment=16.971027ns
+mode=regular threads=16 sum=6399999999 state=fail aborts=0 cputime=103.622771s per_increment=16.191058ns
+mode=regular threads=17 sum=6799999980 state=fail aborts=0 cputime=117.516558s per_increment=17.281847ns
+mode=regular threads=18 sum=7199999984 state=fail aborts=0 cputime=124.609096s per_increment=17.306819ns
+mode=regular threads=19 sum=7599999959 state=fail aborts=0 cputime=131.441945s per_increment=17.294993ns
+mode=regular threads=20 sum=7999999972 state=fail aborts=0 cputime=127.853660s per_increment=15.981708ns
+mode=regular threads=21 sum=8399999947 state=fail aborts=0 cputime=145.638661s per_increment=17.337936ns
+mode=regular threads=22 sum=8799999943 state=fail aborts=0 cputime=152.054029s per_increment=17.278867ns
+mode=regular threads=23 sum=9199999933 state=fail aborts=0 cputime=159.989756s per_increment=17.390191ns
+mode=regular threads=24 sum=9599999946 state=fail aborts=0 cputime=167.602853s per_increment=17.458631ns
+mode=regular threads=25 sum=9999999946 state=fail aborts=0 cputime=173.688899s per_increment=17.368890ns
+mode=regular threads=26 sum=10399999956 state=fail aborts=0 cputime=180.728688s per_increment=17.377759ns
+mode=regular threads=27 sum=10799999959 state=fail aborts=0 cputime=187.942425s per_increment=17.402076ns
+mode=regular threads=28 sum=11199999958 state=fail aborts=0 cputime=194.921763s per_increment=17.403729ns
+mode=regular threads=29 sum=11599999957 state=fail aborts=0 cputime=201.910554s per_increment=17.406082ns
+mode=regular threads=30 sum=11999999966 state=fail aborts=0 cputime=208.667108s per_increment=17.388926ns
+mode=regular threads=31 sum=12399999964 state=fail aborts=0 cputime=218.638442s per_increment=17.632132ns
+mode=regular threads=32 sum=12799999939 state=fail aborts=0 cputime=222.786872s per_increment=17.405224ns
+mode=lock threads=1 sum=400000000 state=ok aborts=0 cputime=9.739219s per_increment=24.348048ns
+mode=lock threads=2 sum=800000000 state=ok aborts=0 cputime=19.477206s per_increment=24.346508ns
+mode=lock threads=3 sum=1200000000 state=ok aborts=0 cputime=29.639653s per_increment=24.699711ns
+mode=lock threads=4 sum=1600000000 state=ok aborts=0 cputime=39.447133s per_increment=24.654458ns
+mode=lock threads=5 sum=2000000000 state=ok aborts=0 cputime=49.416199s per_increment=24.708099ns
+mode=lock threads=6 sum=2400000000 state=ok aborts=0 cputime=58.912073s per_increment=24.546697ns
+mode=lock threads=7 sum=2800000000 state=ok aborts=0 cputime=69.373970s per_increment=24.776418ns
+mode=lock threads=8 sum=3200000000 state=ok aborts=0 cputime=80.045758s per_increment=25.014299ns
+mode=lock threads=9 sum=3600000000 state=ok aborts=0 cputime=95.506874s per_increment=26.529687ns
+mode=lock threads=10 sum=4000000000 state=ok aborts=0 cputime=105.647129s per_increment=26.411782ns
+mode=lock threads=11 sum=4400000000 state=ok aborts=0 cputime=119.966161s per_increment=27.265037ns
+mode=lock threads=12 sum=4800000000 state=ok aborts=0 cputime=144.790100s per_increment=30.164604ns
+mode=lock threads=13 sum=5200000000 state=ok aborts=0 cputime=169.275312s per_increment=32.552945ns
+mode=lock threads=14 sum=5600000000 state=ok aborts=0 cputime=184.008284s per_increment=32.858622ns
+mode=lock threads=15 sum=6000000000 state=ok aborts=0 cputime=206.639565s per_increment=34.439927ns
+mode=lock threads=16 sum=6400000000 state=ok aborts=0 cputime=220.186430s per_increment=34.404130ns
+mode=lock threads=17 sum=6800000000 state=ok aborts=0 cputime=243.215361s per_increment=35.766965ns
+mode=lock threads=18 sum=7200000000 state=ok aborts=0 cputime=256.791891s per_increment=35.665540ns
+mode=lock threads=19 sum=7600000000 state=ok aborts=0 cputime=270.841824s per_increment=35.637082ns
+mode=lock threads=20 sum=8000000000 state=ok aborts=0 cputime=286.147054s per_increment=35.768382ns
+mode=lock threads=21 sum=8400000000 state=ok aborts=0 cputime=303.063539s per_increment=36.078993ns
+mode=lock threads=22 sum=8800000000 state=ok aborts=0 cputime=334.728624s per_increment=38.037344ns
+mode=lock threads=23 sum=9200000000 state=ok aborts=0 cputime=365.422783s per_increment=39.719868ns
+mode=lock threads=24 sum=9600000000 state=ok aborts=0 cputime=383.564521s per_increment=39.954638ns
+mode=lock threads=25 sum=10000000000 state=ok aborts=0 cputime=400.088520s per_increment=40.008852ns
+mode=lock threads=26 sum=10400000000 state=ok aborts=0 cputime=413.845634s per_increment=39.792849ns
+mode=lock threads=27 sum=10800000000 state=ok aborts=0 cputime=432.694245s per_increment=40.064282ns
+mode=lock threads=28 sum=11200000000 state=ok aborts=0 cputime=448.437452s per_increment=40.039058ns
+mode=lock threads=29 sum=11600000000 state=ok aborts=0 cputime=479.398819s per_increment=41.327484ns
+mode=lock threads=30 sum=12000000000 state=ok aborts=0 cputime=485.327195s per_increment=40.443933ns
+mode=lock threads=31 sum=12400000000 state=ok aborts=0 cputime=498.999020s per_increment=40.241856ns
+mode=lock threads=32 sum=12800000000 state=ok aborts=0 cputime=518.804851s per_increment=40.531629ns
+mode=getcpu-atomic threads=1 sum=400000000 state=ok aborts=0 cputime=4.590758s per_increment=11.476895ns
+mode=getcpu-atomic threads=2 sum=800000000 state=ok aborts=0 cputime=10.373209s per_increment=12.966511ns
+mode=getcpu-atomic threads=3 sum=1200000000 state=ok aborts=0 cputime=15.454717s per_increment=12.878931ns
+mode=getcpu-atomic threads=4 sum=1600000000 state=ok aborts=0 cputime=18.276674s per_increment=11.422921ns
+mode=getcpu-atomic threads=5 sum=2000000000 state=ok aborts=0 cputime=25.616891s per_increment=12.808445ns
+mode=getcpu-atomic threads=6 sum=2400000000 state=ok aborts=0 cputime=30.558029s per_increment=12.732512ns
+mode=getcpu-atomic threads=7 sum=2800000000 state=ok aborts=0 cputime=35.695183s per_increment=12.748280ns
+mode=getcpu-atomic threads=8 sum=3200000000 state=ok aborts=0 cputime=41.202231s per_increment=12.875697ns
+mode=getcpu-atomic threads=9 sum=3600000000 state=ok aborts=0 cputime=48.857853s per_increment=13.571626ns
+mode=getcpu-atomic threads=10 sum=4000000000 state=ok aborts=0 cputime=57.148052s per_increment=14.287013ns
+mode=getcpu-atomic threads=11 sum=4400000000 state=ok aborts=0 cputime=65.426838s per_increment=14.869736ns
+mode=getcpu-atomic threads=12 sum=4800000000 state=ok aborts=0 cputime=74.198416s per_increment=15.458003ns
+mode=getcpu-atomic threads=13 sum=5200000000 state=ok aborts=0 cputime=88.584374s per_increment=17.035457ns
+mode=getcpu-atomic threads=14 sum=5600000000 state=ok aborts=0 cputime=97.566401s per_increment=17.422572ns
+mode=getcpu-atomic threads=15 sum=6000000000 state=ok aborts=0 cputime=109.718405s per_increment=18.286401ns
+mode=getcpu-atomic threads=16 sum=6400000000 state=ok aborts=0 cputime=122.916752s per_increment=19.205742ns
+mode=getcpu-atomic threads=17 sum=6800000000 state=ok aborts=0 cputime=134.455988s per_increment=19.772939ns
+mode=getcpu-atomic threads=18 sum=7200000000 state=ok aborts=0 cputime=140.480629s per_increment=19.511198ns
+mode=getcpu-atomic threads=19 sum=7600000000 state=ok aborts=0 cputime=146.157256s per_increment=19.231218ns
+mode=getcpu-atomic threads=20 sum=8000000000 state=ok aborts=0 cputime=155.691843s per_increment=19.461480ns
+mode=getcpu-atomic threads=21 sum=8400000000 state=ok aborts=0 cputime=163.030484s per_increment=19.408391ns
+mode=getcpu-atomic threads=22 sum=8800000000 state=ok aborts=0 cputime=170.584687s per_increment=19.384623ns
+mode=getcpu-atomic threads=23 sum=9200000000 state=ok aborts=0 cputime=176.381227s per_increment=19.171873ns
+mode=getcpu-atomic threads=24 sum=9600000000 state=ok aborts=0 cputime=185.423582s per_increment=19.314956ns
+mode=getcpu-atomic threads=25 sum=10000000000 state=ok aborts=0 cputime=192.877967s per_increment=19.287797ns
+mode=getcpu-atomic threads=26 sum=10400000000 state=ok aborts=0 cputime=199.917576s per_increment=19.222844ns
+mode=getcpu-atomic threads=27 sum=10800000000 state=ok aborts=0 cputime=207.822609s per_increment=19.242834ns
+mode=getcpu-atomic threads=28 sum=11200000000 state=ok aborts=0 cputime=216.261564s per_increment=19.309068ns
+mode=getcpu-atomic threads=29 sum=11600000000 state=ok aborts=0 cputime=213.773868s per_increment=18.428782ns
+mode=getcpu-atomic threads=30 sum=12000000000 state=ok aborts=0 cputime=221.522895s per_increment=18.460241ns
+mode=getcpu-atomic threads=31 sum=12400000000 state=ok aborts=0 cputime=240.809263s per_increment=19.420102ns
+mode=getcpu-atomic threads=32 sum=12800000000 state=ok aborts=0 cputime=251.500147s per_increment=19.648449ns
diff --git a/23-rseq/plot.Ryzen7_PRO_5850U.png b/23-rseq/plot.Ryzen7_PRO_5850U.png
new file mode 100644
index 0000000000000000000000000000000000000000..3314476504cef82c5c861ef8a39bd5f0d2c3ed5a
GIT binary patch
literal 71988
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
Aod5s;

literal 0
HcmV?d00001

diff --git a/23-rseq/plot.py b/23-rseq/plot.py
new file mode 100644
index 0000000..c1681ec
--- /dev/null
+++ b/23-rseq/plot.py
@@ -0,0 +1,35 @@
+#!/usr/bin/python3
+
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+
+def read_log(fn):
+    with open(fn) as fd:
+        lines = fd.readlines()
+        rows = []
+        for line in lines:
+            line = line.strip().split(" ")
+            header = [x.split("=")[0] for x in line]
+            data = [x.split("=")[1].rstrip("ns") for x in line]
+            rows.append(data)
+        df = pd.DataFrame(
+            columns=header,
+            data=rows)
+        for x in "threads sum aborts cputime per_increment".split():
+            df[x] = df[x].apply(float)
+        return df
+
+if __name__ == "__main__":
+    import sys
+    if len(sys.argv) < 2:
+        sys.exit("usage: %s [LOGFILE]" % sys.argv[0])
+    df = read_log(sys.argv[1])
+
+    per_inc = df.set_index(["mode", "threads"]).per_increment.unstack().T
+
+    ax = per_inc.plot(marker='x', grid=True,figsize=(10,10))
+    ax.set_ylim((0, None))
+    ax.set_ylabel("Per Increment [ns]")
+    ax.get_figure().savefig('plot.png')
+
diff --git a/23-rseq/rseq-asm.S b/23-rseq/rseq-asm.S
new file mode 100644
index 0000000..6a15529
--- /dev/null
+++ b/23-rseq/rseq-asm.S
@@ -0,0 +1,58 @@
+// int operation_rseq(struct rseq * rseq, struct cacheline *counters) {
+// According to the Calling Convention the arguments come in registers:
+//     rseq:    %rdi
+//     counter: %rsi
+.p2align 4
+.globl	operation_rseq
+.type	operation_rseq, @function
+operation_rseq:
+.cfi_startproc
+        // We will return the number of aborts in %eax. Initialize
+        // eax with zero
+        xor	%eax, %eax    // %eax = 0
+
+        // We inform the kernel that we are now within a restartable
+        // sequence by moving a pointer to operation_rseq_cs (see below)
+        // to the kernel-registered rseq object.
+        // After an abort, we also jump to this label (restart_ip)
+.restart_ip:
+        // FIXME: Update rseq->rseq_cs
+
+        // The restartable sequence
+        // Implements: [rseq->cpu_id].counter ++;
+.start_ip: // Start of restartable sequence
+        // HINT: Structure of rseq is documented in /usr/include/linux/rseq.h
+        // HINT: rseq->cpu_id == 4(%rdi)
+        // HINT: Each counter-cache-line is 64 bytes lon
+.end_ip: // End of restartable sequence
+	ret
+
+        // The abort trampoline
+
+        // Before the abort label, the kernel will check if a specific
+        // signature is present. We hide this signature in a
+        // well-crafted assembler instruction.
+        // ud1 <sig>(%rip),%edi
+	.byte 0x0f, 0xb9, 0x3d
+	.long 0x53053053       // RSEQ_SIG
+.abort_ip: // On abort, the kernel will jump here
+        // FIXME: count aborts in %eax
+	jmp .restart_ip
+
+// } End of operation_rseq()
+.cfi_endproc
+.size	operation_rseq, .-operation_rseq
+
+// struct rseq_cs operation_rseq_cs -- descriptor for our rseq
+.section        .data.rel.local,"aw"
+.align 32
+.type   operation_rseq_cs, @object
+.size   operation_rseq_cs, 32
+operation_rseq_cs:
+        .long   0   // __u32 version
+        .long   0   // __u32 flags
+        .quad   .start_ip            // __u64 start_ip
+        .quad   .end_ip - .start_ip  // __u64 post_commit_offset
+        .quad   .abort_ip            // __u64 abort_ip
+
+.section        .note.GNU-stack,"",@progbits
diff --git a/23-rseq/rseq.2 b/23-rseq/rseq.2
new file mode 100644
index 0000000..8882e1c
--- /dev/null
+++ b/23-rseq/rseq.2
@@ -0,0 +1,371 @@
+.\" Copyright 2015-2020 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+.\"
+.\" %%%LICENSE_START(VERBATIM)
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date.  The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein.  The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\" %%%LICENSE_END
+.\"
+.TH RSEQ 2 2020-06-05 "Linux" "Linux Programmer's Manual"
+.SH NAME
+rseq \- Restartable sequences and cpu number cache
+.SH SYNOPSIS
+.nf
+.B #include <linux/rseq.h>
+.sp
+.BI "int rseq(struct rseq * " rseq ", uint32_t " rseq_len ", int " flags ", uint32_t " sig ");
+.sp
+.SH DESCRIPTION
+
+A restartable sequence is a sequence of instructions guaranteed to be executed
+atomically with respect to other threads and signal handlers on the current
+CPU. If its execution does not complete atomically, the kernel changes the
+execution flow by jumping to an abort handler defined by user-space for that
+restartable sequence.
+
+Using restartable sequences requires to register a
+.BR __rseq_abi
+thread-local storage data structure (struct rseq) through the
+.BR rseq ()
+system call. Only one
+.BR __rseq_abi
+can be registered per thread, so user-space libraries and applications must
+follow a user-space ABI defining how to share this resource.  The ABI defining
+how to share this resource between applications and libraries is defined by the
+C library.
+
+The
+.BR __rseq_abi
+contains a
+.I rseq_cs
+field which points to the currently executing critical section. For each
+thread, a single rseq critical section can run at any given point. Each
+critical section need to be implemented in assembly.
+
+The
+.BR rseq ()
+ABI accelerates user-space operations on per-cpu data by defining a
+shared data structure ABI between each user-space thread and the kernel.
+
+It allows user-space to perform update operations on per-cpu data
+without requiring heavy-weight atomic operations.
+
+The term CPU used in this documentation refers to a hardware execution
+context. For instance, each CPU number returned by
+.BR sched_getcpu ()
+is a CPU. The current CPU means to the CPU on which the registered thread is
+running.
+
+Restartable sequences are atomic with respect to preemption (making it
+atomic with respect to other threads running on the same CPU), as well
+as signal delivery (user-space execution contexts nested over the same
+thread). They either complete atomically with respect to preemption on
+the current CPU and signal delivery, or they are aborted.
+
+Restartable sequences are suited for update operations on per-cpu data.
+
+Restartable sequences can be used on data structures shared between threads
+within a process, and on data structures shared between threads across
+different processes.
+
+.PP
+Some examples of operations that can be accelerated or improved
+by this ABI:
+.IP \[bu] 2
+Memory allocator per-cpu free-lists,
+.IP \[bu] 2
+Querying the current CPU number,
+.IP \[bu] 2
+Incrementing per-CPU counters,
+.IP \[bu] 2
+Modifying data protected by per-CPU spinlocks,
+.IP \[bu] 2
+Inserting/removing elements in per-CPU linked-lists,
+.IP \[bu] 2
+Writing/reading per-CPU ring buffers content.
+.IP \[bu] 2
+Accurately reading performance monitoring unit counters
+with respect to thread migration.
+
+.PP
+Restartable sequences must not perform system calls. Doing so may result
+in termination of the process by a segmentation fault.
+
+.PP
+The
+.I rseq
+argument is a pointer to the thread-local rseq structure to be shared
+between kernel and user-space.
+
+.PP
+The layout of
+.B struct rseq
+is as follows:
+.TP
+.B Structure alignment
+This structure is aligned on 32-byte boundary.
+.TP
+.B Structure size
+This structure is fixed-size (32 bytes). Its size is passed as parameter to the
+rseq system call.
+.PP
+.in +8n
+.EX
+struct rseq {
+    __u32 cpu_id_start;
+    __u32 cpu_id;
+    union {
+        /* Edited out for conciseness. [...] */
+    } rseq_cs;
+    __u32 flags;
+} __attribute__((aligned(32)));
+.EE
+.TP
+.B Fields
+
+.TP
+.in +4n
+.I cpu_id_start
+Optimistic cache of the CPU number on which the registered thread is
+running. Its value is guaranteed to always be a possible CPU number,
+even when rseq is not registered. Its value should always be confirmed by
+reading the cpu_id field before user-space performs any side-effect (e.g.
+storing to memory).
+
+This field is an optimistic cache in the sense that it is always
+guaranteed to hold a valid CPU number in the range [ 0 ..
+nr_possible_cpus - 1 ]. It can therefore be loaded by user-space and
+used as an offset in per-cpu data structures without having to
+check whether its value is within the valid bounds compared to the
+number of possible CPUs in the system.
+
+Initialized by user-space to a possible CPU number (e.g., 0), updated
+by the kernel for threads registered with rseq.
+
+For user-space applications executed on a kernel without rseq support,
+the cpu_id_start field stays initialized at 0, which is indeed a valid
+CPU number. It is therefore valid to use it as an offset in per-cpu data
+structures, and only validate whether it's actually the current CPU
+number by comparing it with the cpu_id field within the rseq critical
+section. If the kernel does not provide rseq support, that cpu_id field
+stays initialized at -1, so the comparison always fails, as intended.
+
+It is up to user-space to implement a fall-back mechanism for scenarios where
+rseq is not available.
+.in
+.TP
+.in +4n
+.I cpu_id
+Cache of the CPU number on which the registered thread is running. Initialized
+by user-space to -1, updated by the kernel for threads registered with rseq.
+.in
+.TP
+.in +4n
+.I rseq_cs
+The rseq_cs field is a pointer to a struct rseq_cs. Is is NULL when no
+rseq assembly block critical section is active for the registered thread.
+Setting it to point to a critical section descriptor (struct rseq_cs)
+marks the beginning of the critical section.
+
+Initialized by user-space to NULL.
+
+Updated by user-space, which sets the address of the currently
+active rseq_cs at the beginning of assembly instruction sequence
+block, and set to NULL by the kernel when it restarts an assembly
+instruction sequence block, as well as when the kernel detects that
+it is preempting or delivering a signal outside of the range
+targeted by the rseq_cs. Also needs to be set to NULL by user-space
+before reclaiming memory that contains the targeted struct rseq_cs.
+
+Read and set by the kernel.
+.in
+.TP
+.in +4n
+.I flags
+Flags indicating the restart behavior for the registered thread. This is
+mainly used for debugging purposes. Can be a combination of:
+.IP \[bu]
+RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT: Inhibit instruction sequence block restart
+on preemption for this thread.
+.IP \[bu]
+RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL: Inhibit instruction sequence block restart
+on signal delivery for this thread.
+.IP \[bu]
+RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE: Inhibit instruction sequence block restart
+on migration for this thread.
+.in
+
+Initialized by user-space, used by the kernel.
+
+.PP
+The layout of
+.B struct rseq_cs
+version 0 is as follows:
+.TP
+.B Structure alignment
+This structure is aligned on 32-byte boundary.
+.TP
+.B Structure size
+This structure has a fixed size of 32 bytes.
+.PP
+.in +8n
+.EX
+struct rseq_cs {
+    __u32   version;
+    __u32   flags;
+    __u64   start_ip;
+    __u64   post_commit_offset;
+    __u64   abort_ip;
+} __attribute__((aligned(32)));
+.EE
+.TP
+.B Fields
+
+.TP
+.in +4n
+.I version
+Version of this structure. Should be initialized to 0.
+.in
+.TP
+.in +4n
+.I flags
+Flags indicating the restart behavior of this structure. Can be a combination
+of:
+.IP \[bu]
+RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT: Inhibit instruction sequence block restart
+on preemption for this critical section.
+.IP \[bu]
+RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL: Inhibit instruction sequence block restart
+on signal delivery for this critical section.
+.IP \[bu]
+RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE: Inhibit instruction sequence block restart
+on migration for this critical section.
+.TP
+.in +4n
+.I start_ip
+Instruction pointer address of the first instruction of the sequence of
+consecutive assembly instructions.
+.in
+.TP
+.in +4n
+.I post_commit_offset
+Offset (from start_ip address) of the address after the last instruction
+of the sequence of consecutive assembly instructions.
+.in
+.TP
+.in +4n
+.I abort_ip
+Instruction pointer address where to move the execution flow in case of
+abort of the sequence of consecutive assembly instructions.
+.in
+
+.PP
+The
+.I rseq_len
+argument is the size of the
+.I struct rseq
+to register.
+
+.PP
+The
+.I flags
+argument is 0 for registration, and
+.IR RSEQ_FLAG_UNREGISTER
+for unregistration.
+
+.PP
+The
+.I sig
+argument is the 32-bit signature to be expected before the abort
+handler code.
+
+.PP
+A single library per process should keep the rseq structure in a
+thread-local storage variable.
+The
+.I cpu_id
+field should be initialized to -1, and the
+.I cpu_id_start
+field should be initialized to a possible CPU value (typically 0).
+
+.PP
+Each thread is responsible for registering and unregistering its rseq
+structure. No more than one rseq structure address can be registered
+per thread at a given time.
+
+.PP
+Reclaim of rseq object's memory must only be done after either an
+explicit rseq unregistration is performed or after the thread exits.
+
+.PP
+In a typical usage scenario, the thread registering the rseq
+structure will be performing loads and stores from/to that structure. It
+is however also allowed to read that structure from other threads.
+The rseq field updates performed by the kernel provide relaxed atomicity
+semantics (atomic store, without memory ordering), which guarantee that other
+threads performing relaxed atomic reads (atomic load, without memory ordering)
+of the cpu number cache will always observe a consistent value.
+
+.SH RETURN VALUE
+A return value of 0 indicates success. On error, \-1 is returned, and
+.I errno
+is set appropriately.
+
+.SH ERRORS
+.TP
+.B EINVAL
+Either
+.I flags
+contains an invalid value, or
+.I rseq
+contains an address which is not appropriately aligned, or
+.I rseq_len
+contains an incorrect size.
+.TP
+.B ENOSYS
+The
+.BR rseq ()
+system call is not implemented by this kernel.
+.TP
+.B EFAULT
+.I rseq
+is an invalid address.
+.TP
+.B EBUSY
+Restartable sequence is already registered for this thread.
+.TP
+.B EPERM
+The
+.I sig
+argument on unregistration does not match the signature received
+on registration.
+
+.SH VERSIONS
+The
+.BR rseq ()
+system call was added in Linux 4.18.
+
+.SH CONFORMING TO
+.BR rseq ()
+is Linux-specific.
+
+.in
+.SH SEE ALSO
+.BR sched_getcpu (3) ,
+.BR membarrier (2)
\ No newline at end of file
diff --git a/23-rseq/rseq.c b/23-rseq/rseq.c
new file mode 100644
index 0000000..18ab560
--- /dev/null
+++ b/23-rseq/rseq.c
@@ -0,0 +1,243 @@
+#define _GNU_SOURCE
+#include <pthread.h>
+#include <unistd.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <sys/syscall.h>
+#include <stdatomic.h>
+#include <string.h>
+#include <sys/sysinfo.h>
+#include <stdbool.h>
+#include <malloc.h>
+
+#define die(msg) do { perror(msg); exit(EXIT_FAILURE); } while(0)
+
+// With modern glibc versions (>2.35), the glibc already registers
+// a rseq area for each thread that is started with
+// pthread_create. In that case, we derive this pointer from the
+// thread_pointer(). For details, see
+// https://www.gnu.org/software/libc/manual/html_node/Restartable-Sequences.html
+#if __has_include ("sys/rseq.h")
+#include <sys/rseq.h>
+
+#if RSEQ_SIG != 0x53053053
+#error "glibc defined RSEQ_SIG differently"
+#endif
+
+static struct rseq * rseq_register() {
+    return __builtin_thread_pointer() + __rseq_offset;
+}
+
+#else
+#include <linux/rseq.h>
+#define RSEQ_SIG   0x53053053
+
+// The rseq(2) syscall has no glibc wrapper. Therefore, we define our
+// own. Please run `make man` to see the man page rseq(2).
+int sys_rseq(struct rseq * rseq, uint32_t rseq_len, int flags, uint32_t sig) {
+    return syscall(SYS_rseq, rseq, rseq_len, flags, RSEQ_SIG);
+}
+
+struct rseq *rseq_register() {
+    struct rseq *ret = memalign(sizeof(struct rseq), sizeof(struct rseq));
+    memset(ret, 0, sizeof(struct rseq));
+    ret->cpu_id_start = -1;
+    ret->cpu_id       = -1;
+    if (sys_rseq(ret, sizeof(struct rseq), 0, 0) < 0)
+        die("rseq");
+    return ret;
+}
+
+#endif
+
+
+
+// This data structure is exactly one cache-line wide (assuming that a
+// cache line is 64 bytes). Thereby, we can allocate an array of
+// cpu-local counters, where each CPU only operates on a single cache
+// line. Thereby, we can avoid most side effects of cache-line
+// transfers.
+struct cacheline {
+    union {
+        char data[64];
+        struct {
+            uint64_t        counter;
+            pthread_mutex_t mutex;   // Used in the lock variant
+        };
+    };
+};
+
+// We will define multiple operation_t functions that all implement
+// the same behavior: They increment a cpu-local counter by 1.
+typedef int (*operation_t)(struct rseq *_, struct cacheline *);
+
+// The simplest variant of a CPU-local counter is to get the cpuid
+// with getcpu() and increment the counter. However, due to the
+// read-update-write cycle, this variant is racy and will produce
+// incorrect results.
+int operation_regular(struct rseq*_, struct cacheline *counters) {
+    unsigned int cpu_id;
+
+    getcpu(&cpu_id, NULL);
+    counters[cpu_id].counter += 1;
+
+    return 0;
+}
+
+// A correct, but slow variant uses the cache-line--local pthread
+// mutex to lock the counter for the time of the operation.
+int operation_lock(struct rseq*_, struct cacheline *counters) {
+    unsigned int cpu_id;
+
+    getcpu(&cpu_id, NULL);
+
+    pthread_mutex_lock(&counters[cpu_id].mutex);
+    counters[cpu_id].counter += 1;
+    pthread_mutex_unlock(&counters[cpu_id].mutex);
+
+    return 0;
+}
+
+// Variant that uses getcpu() + atomic_fetch_add
+int operation_atomic(struct rseq* _, struct cacheline *counters) {
+    // FIXME: Implement variant
+
+    return 0;
+}
+
+// Variant without getcpu: Like operation_atomic, but uses the
+// restartable sequence to retrieve the cpu id.
+// Please look at /usr/include/linux/rseq.h for the documentation of struct rseq
+int operation_rseq_atomic(struct rseq* rs, struct cacheline *counters) {
+    // FIXME: Implement variant
+
+    return 0;
+}
+
+
+// Variant that uses no atomic operations and fully relies on rseq
+// This variant is implemented in assembler (see rseq.S)
+extern int operation_rseq(struct rseq *, struct cacheline*);
+// FIXME: Implement counter_rseq in rseq.S
+
+
+////////////////////////////////////////////////////////////////
+// The Benchmarking code
+//
+// We start NTHREADS threads and each thread executes
+// ROUNDS_PER_THREAD cpu-local increments
+
+int  ROUNDS_PER_THREAD = 50000000;
+
+struct thread_args {
+    operation_t         operation;
+    struct cacheline    *counters;
+};
+
+
+void* thread_handler(void* data) {
+    struct thread_args *args = data;
+
+    // Register rseq area or use glibc's rseq
+    struct rseq *rseq = rseq_register();
+    printf("rseq: %p\n", rseq);
+    
+    // Execute the given operation ROUNDS_PER_THREAD times and count
+    // the number of aborts (only != 0 for rseq)
+    uint64_t aborts = 0;
+    for (uint64_t i = 0; i < ROUNDS_PER_THREAD; i++) {
+        aborts += args->operation(rseq, args->counters);
+    }
+
+    // Return the number of rseq aborts
+    return (void*) aborts;
+}
+
+// Print usage and exit.
+static void usage(char *argv0) {
+    fprintf(stderr, "usage: %s <threads> <regular|lock|getcpu-atomic|rseq-atomic|rseq> [rounds]\n", argv0);
+    exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[]) {
+    // Parameter Parsing. This is boring
+    if (argc < 3) usage(argv[0]);
+    if (argc == 4)
+        ROUNDS_PER_THREAD *= atoi(argv[3]);
+
+    int CPUS     = get_nprocs();
+    int NTHREADS = atoi(argv[1]);
+    char *MODE   = argv[2];
+
+    struct thread_args args;
+    if      (!strcmp(MODE, "rseq"))          args.operation = operation_rseq;
+    else if (!strcmp(MODE, "getcpu-atomic")) args.operation = operation_atomic;
+    else if (!strcmp(MODE, "rseq-atomic"))   args.operation = operation_rseq_atomic;
+    else if (!strcmp(MODE, "regular"))       args.operation = operation_regular;
+    else if (!strcmp(MODE, "lock"))          args.operation = operation_lock;
+    else      usage(argv[0]);
+
+    // Initialize the CPU-local counters. Each CPU gets an struct
+    // cache-line on its own. We use aligned_alloc(3) to get
+    // cache-line-aligned memory from the allocator.
+
+    args.counters = aligned_alloc(sizeof(struct cacheline), CPUS * sizeof(struct cacheline));
+    if (!args.counters) die("calloc");
+
+
+    // Initialize locks for the lock variant
+    for (uint32_t i = 0; i < CPUS; i++) {
+        pthread_mutex_init(&args.counters[i].mutex, NULL);
+    }
+
+
+    // The actual benchmarking code
+    ////////////////////////////////////////////////////////////////
+    struct timespec start, end;
+    // Start Time. We use the CLOCK_PROCESS_CPUTIME_ID to get the
+    // number of CPU-seconds spent. 
+    if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start) < 0)
+        die("clock_gettime");
+
+    // Create NTHREADS threads
+    pthread_t threads[NTHREADS];
+    for (uint32_t i = 0; i < NTHREADS; i++) {
+        pthread_create(&threads[i], NULL, thread_handler, (void*)&args);
+    }
+
+    // Wait for all threads to complete and accumulate the number of aborts
+    uint64_t aborts = 0;
+    for (uint32_t i = 0; i < NTHREADS; i++) {
+        uint64_t thread_aborts;
+        pthread_join(threads[i], (void**)&thread_aborts);
+        aborts += thread_aborts;
+    }
+
+    // End Time
+    if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end) < 0)
+        die("clock_gettime");
+
+    // Calculate the time delta between both points in time.
+    double delta = end.tv_sec - start.tv_sec;
+    delta += (end.tv_nsec - start.tv_nsec) / 1e9;
+
+    // Print out the cpu-local counters. With this output and a low
+    // number of threads you can see the thread migration.
+    uint64_t sum = 0;
+    for (uint32_t i = 0; i < CPUS; i++) {
+        fprintf(stderr, "counter[cpu=%d] = %ld\n", i, args.counters[i].counter);
+        sum += args.counters[i].counter;
+    }
+
+    // Print out the result. We also check that the threads actually
+    // counted correctly (state)
+    printf("mode=%s threads=%d sum=%ld state=%s aborts=%ld cputime=%fs per_increment=%fns\n",
+           MODE, NTHREADS,
+           sum, (sum % ROUNDS_PER_THREAD) == 0 ? "ok" : "fail",
+           aborts,
+           delta,            // total cpu time that was spent
+           delta * 1e9 / sum // nanoseconds per increment
+        );
+}
-- 
GitLab