Messages in this thread | | | From | Valentin Schneider <> | Subject | Re: [RFC PATCH v2 00/10] irqchip/irq-gic: Optimize masking by leveraging EOImode=1 | Date | Thu, 03 Jun 2021 16:32:41 +0100 |
| |
On 01/06/21 11:25, Valentin Schneider wrote: > On 27/05/21 12:17, Marc Zyngier wrote: >> On Tue, 25 May 2021 18:32:45 +0100, >> Valentin Schneider <valentin.schneider@arm.com> wrote: >>> Benchmark >>> +++++++++ >>> >>> Finding a benchmark that leverages a force-threaded IRQ has proved to be >>> somewhat of a pain, so I crafted my own. It's a bit daft, but so are most >>> benchmarks (though this one might win a prize). >> >> I love it (and wrote similar hacks in my time)! :D > > Yay! > >> Can you put that up >> somewhere so that I can run the same test on my own zoo and find out >> how it fares? >> > > The setup part is really fugly and I was too ashamed of it to link it in > the cover letter; for ACPI I could simply use acpi_register_gsi() since > that uses the right domain by default, but for DT I ended up adding a DT > entry and a match table. > > I'll see about unifying this and I'll send it out your way.
Scratch the unification, but at least I cleaned up some of the initialization horrors. Patches + benchmark module are at:
https://git.gitlab.arm.com/linux-arm/linux-vs.git -b mainline/irq/eoimodness-v2
Note: I re-ran that on Juno/eMAG to make sure I didn't bust anything, and while the eMAG improvements are still there, now I get pretty much zilch on the Juno :/
I use the below script to drive the testing
--- #!/bin/bash
get_irq_count () { cat /proc/interrupts | grep irq-prod | awk '{ print $2; }' }
for f in $(find /sys/devices/system/cpu/cpufreq/ -name "policy*"); do echo "performance" > "$f"/scaling_governor done
KTHREAD_PID=$(ps -aux | grep irq-prod/ | head -n 1 | awk '{ print $2; }') taskset -pc 0 $KTHREAD_PID
for ((i=0; i < 20; i++)); do base_val=$(get_irq_count)
now=$(date +%s%3N) echo 1 > /sys/kernel/irq_prod/active sleep 5 echo 0 > /sys/kernel/irq_prod/active end=$(date +%s%3N)
end_val=$(get_irq_count) delta=$((end_val - base_val)) duration=$((end - now))
echo $((delta / (duration / 1000))) > $1/$i done ---
This gives you a file per iteration with irqs/sec in it, and you can collate that however you wish - I use python + pandas:
--- #!/usr/bin/env python3
import pandas as pd
keys = ["tip", "patch"] data = {k : [] for k in keys}
for i in range(20): for k in keys: with open("/path/to/results/{}/{}".format(k, i), "r") as fh: data[k].append(int(fh.read()))
df = pd.DataFrame(data) df_stats = df.describe(percentiles=[.5, .9, .99]) df_stats["delta"] = (df_stats["patch"] - df_stats["tip"]) / df_stats["tip"] print(df_stats) ---
i.e.
<load tip/irq/core> ./bench_irq.sh tip <load series> ./bench_irq.sh patch
./compare.py
| |