All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: kvm@vger.kernel.org
Cc: pbonzini@redhat.com
Subject: Re: [PATCH v2] x86: add HPET counter read micro benchmark and enable/disable torture tests
Date: Fri, 18 Jul 2025 17:58:43 +0200	[thread overview]
Message-ID: <20250718175843.316cb351@fedora> (raw)
In-Reply-To: <20250714145055.1487738-1-imammedo@redhat.com>

On Mon, 14 Jul 2025 16:50:55 +0200
Igor Mammedov <imammedo@redhat.com> wrote:

> test is to be used for benchmarking/validating HPET main counter reading

ignore this one as well, I've just sent v3 with a few fixes

> 
> how to run:
>    QEMU=/foo/qemu-system-x86_64 x86/run x86/hpet_read_test.flat -smp X
> where X is desired (max) number of logical CPUs on host
> 
> it will 1st execute concurrent read benchmark
> and after that it will run torture test enabling/disabling HPET counter,
> while running readers in parallel. Goal is to verify counter that always
> goes up.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> v2:
>    * fix broken timer going backwards check
>    * report # of fails
>    * warn if number of vcpus is not sufficient for torture test and skip
>      it
>    * style fixups
> ---
>  x86/Makefile.common  |  2 ++
>  x86/hpet_read_test.c | 73 ++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 75 insertions(+)
>  create mode 100644 x86/hpet_read_test.c
> 
> diff --git a/x86/Makefile.common b/x86/Makefile.common
> index 5663a65d..ef0e09a6 100644
> --- a/x86/Makefile.common
> +++ b/x86/Makefile.common
> @@ -101,6 +101,8 @@ tests-common += $(TEST_DIR)/realmode.$(exe) \
>  realmode_bits := $(if $(call cc-option,-m16,""),16,32)
>  endif
>  
> +tests-common += $(TEST_DIR)/hpet_read_test.$(exe)
> +
>  test_cases: $(tests-common) $(tests)
>  
>  $(TEST_DIR)/%.o: CFLAGS += -std=gnu99 -ffreestanding -I $(SRCDIR)/lib -I $(SRCDIR)/lib/x86 -I lib
> diff --git a/x86/hpet_read_test.c b/x86/hpet_read_test.c
> new file mode 100644
> index 00000000..a14194e6
> --- /dev/null
> +++ b/x86/hpet_read_test.c
> @@ -0,0 +1,73 @@
> +#include "libcflat.h"
> +#include "smp.h"
> +#include "asm/barrier.h"
> +#include "x86/atomic.h"
> +
> +#define HPET_ADDR         0xFED00000L
> +#define HPET_COUNTER_ADDR ((uint8_t *)HPET_ADDR + 0xF0UL)
> +#define HPET_CONFIG_ADDR  ((uint8_t *)HPET_ADDR + 0x10UL)
> +#define HPET_ENABLE_BIT   0x01UL
> +#define HPET_CLK_PERIOD   10
> +
> +static atomic_t fail;
> +
> +static void hpet_reader(void *data)
> +{
> +	uint64_t old_counter = 0, new_counter;
> +	long cycles = (long)data;
> +
> +	while (cycles--) {
> +		new_counter = *(volatile uint64_t *)HPET_COUNTER_ADDR;
> +		if (new_counter < old_counter) {
> +			atomic_inc(&fail);
> +		}
> +		old_counter = new_counter;
> +	}
> +}
> +
> +static void hpet_writer(void *data)
> +{
> +	int i;
> +	long cycles = (long)data;
> +
> +	for (i = 0; i < cycles; ++i)
> +		if (i % 2)
> +			*(volatile uint64_t *)HPET_CONFIG_ADDR |= HPET_ENABLE_BIT;
> +		else
> +			*(volatile uint64_t *)HPET_CONFIG_ADDR &= ~HPET_ENABLE_BIT;
> +}
> +
> +int main(void)
> +{
> +	long cycles = 100000;
> +	int i;
> +	int ncpus;
> +	uint64_t start, end, time_ns;
> +
> +	ncpus = cpu_count();
> +	do {
> +		printf("* starting concurrent read bench on %d cpus\n", ncpus);
> +		*(volatile uint64_t *)HPET_CONFIG_ADDR |= HPET_ENABLE_BIT;
> +		start = *(volatile uint64_t *)HPET_COUNTER_ADDR;
> +		on_cpus(hpet_reader, (void *)cycles);
> +		end = (*(volatile uint64_t *)HPET_COUNTER_ADDR);
> +		time_ns = (end - start) * HPET_CLK_PERIOD;
> +		report(time_ns && !atomic_read(&fail),
> +			"read test took %lu ms, avg read: %lu ns\n", time_ns/1000000,  time_ns/cycles);
> +	} while (0);
> +
> +	do {
> +		printf("* starting enable/disable with concurent readers torture\n");
> +		if (ncpus > 2) {
> +			for (i = 2; i < ncpus; i++)
> +			    on_cpu_async(i, hpet_reader, (void *)cycles);
> +
> +			on_cpu(1, hpet_writer, (void *)cycles);
> +			report(!atomic_read(&fail), "torture test, fails: %u\n", atomic_read(&fail));
> +		} else {
> +			printf("SKIP: torture test: '-smp X' should be greater than 2\n");
> +	}
> +	} while (0);
> +
> +	return report_summary();
> +}


      reply	other threads:[~2025-07-18 15:58 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-14 14:50 [PATCH v2] x86: add HPET counter read micro benchmark and enable/disable torture tests Igor Mammedov
2025-07-18 15:58 ` Igor Mammedov [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250718175843.316cb351@fedora \
    --to=imammedo@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.