[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <878s3rezfq.mognet@arm.com>
Date: Thu, 03 Jun 2021 16:32:41 +0100
From: Valentin Schneider <valentin.schneider@....com>
To: Marc Zyngier <maz@...nel.org>
Cc: linux-kernel@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
Thomas Gleixner <tglx@...utronix.de>,
Lorenzo Pieralisi <lorenzo.pieralisi@....com>,
Vincenzo Frascino <vincenzo.frascino@....com>
Subject: Re: [RFC PATCH v2 00/10] irqchip/irq-gic: Optimize masking by leveraging EOImode=1
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@....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
Powered by blists - more mailing lists