From: Pekka Paalanen <pekka.paalanen@haloniitty.fi>
To: Arthur Grillo <arthurgrillo@riseup.net>
Cc: dri-devel@lists.freedesktop.org, igt-dev@lists.freedesktop.org,
"Petri Latvala" <adrinael@adrinael.net>,
"Arkadiusz Hiler" <arek@hiler.eu>,
"Kamil Konieczny" <kamil.konieczny@linux.intel.com>,
"Juha-Pekka Heikkila" <juhapekka.heikkila@gmail.com>,
"Bhanuprakash Modem" <bhanuprakash.modem@intel.com>,
"Ashutosh Dixit" <ashutosh.dixit@intel.com>,
"Louis Chauvet" <louis.chauvet@bootlin.com>,
"Rodrigo Siqueira" <rodrigosiqueiramelo@gmail.com>,
"Melissa Wen" <melissa.srw@gmail.com>,
"Maíra Canal" <mairacanal@riseup.net>,
"Haneen Mohammed" <hamohammed.sa@gmail.com>,
"Daniel Vetter" <daniel@ffwll.ch>
Subject: Re: [PATCH i-g-t] benchmarks: Add VKMS benchmark
Date: Thu, 8 Feb 2024 11:50:50 +0200 [thread overview]
Message-ID: <20240208115050.73d04796@eldfell> (raw)
In-Reply-To: <20240207-bench-v1-1-7135ad426860@riseup.net>
[-- Attachment #1: Type: text/plain, Size: 8210 bytes --]
On Wed, 07 Feb 2024 17:17:15 -0300
Arthur Grillo <arthurgrillo@riseup.net> wrote:
> Create a benchmark for the VKMS driver. Use a KMS layout with deliberate
> odd sizes to try to avoid alignment accidents and run it for FRAME_COUNT
> frames flipping framebuffers in each plane.
>
> Link: https://lore.kernel.org/all/20240202214527.1d97c881@ferris.localdomain/
> Suggested-by: Pekka Paalanen <pekka.paalanen@haloniitty.fi>
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
> This benchmark was suggested by Pekka Paalanen on [1] to better analyse
> possible performance regression on the Virtual Kernel Modesetting(VKMS)
> driver.
>
> With this benchmark I was able to determine two performance regression:
>
> - 322d716a3e8a ("drm/vkms: isolate pixel conversion functionality")
> - cc4fd2934d41 ("drm/vkms: Isolate writeback pixel conversion functions")
>
> [1]: https://lore.kernel.org/all/20240202214527.1d97c881@ferris.localdomain/
> ---
> benchmarks/meson.build | 1 +
> benchmarks/vkms_stress.c | 203 +++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 204 insertions(+)
>
> diff --git a/benchmarks/meson.build b/benchmarks/meson.build
> index c451268bc44f..3aa66d6dffe2 100644
> --- a/benchmarks/meson.build
> +++ b/benchmarks/meson.build
> @@ -20,6 +20,7 @@ benchmark_progs = [
> 'kms_vblank',
> 'prime_lookup',
> 'vgem_mmap',
> + 'vkms_stress',
> ]
>
> benchmarksdir = join_paths(libexecdir, 'benchmarks')
> diff --git a/benchmarks/vkms_stress.c b/benchmarks/vkms_stress.c
> new file mode 100644
> index 000000000000..b9128c208861
> --- /dev/null
> +++ b/benchmarks/vkms_stress.c
> @@ -0,0 +1,203 @@
> +/*
> + * Copyright © 2024 Arthur Grillo
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + * Authors:
> + * Arthur Grillo <arthurgrillo@riseup.net>
> + *
> + */
> +
> +#include "igt.h"
> +
> +#define FRAME_COUNT 100
> +
> +struct rect_t {
> + int x, y;
> + int width, height;
> +};
> +
> +struct plane_t {
> + igt_plane_t *base;
> + struct rect_t rect;
> + uint32_t format;
> + struct igt_fb fbs[2];
> +};
> +
> +struct kms_t {
> + struct plane_t primary;
> + struct plane_t overlay_a;
> + struct plane_t overlay_b;
> + struct plane_t writeback;
> +};
> +
> +struct data_t {
> + int fd;
> + igt_display_t display;
> + igt_output_t *wb_output;
> + drmModeModeInfo *mode;
> + struct kms_t kms;
> +};
> +
> +static void plane_create_fb(struct plane_t *plane, int fd, size_t index)
> +{
> + igt_create_fb(fd, plane->rect.width, plane->rect.height,
> + plane->format, DRM_FORMAT_MOD_LINEAR,
> + &plane->fbs[index]);
> +}
> +
> +static void plane_create_color_fb(struct plane_t *plane, int fd, size_t index, double r, double g,
> + double b)
> +{
> + igt_create_color_fb(fd, plane->rect.width, plane->rect.height,
> + plane->format, DRM_FORMAT_MOD_LINEAR,
> + r, g, b,
> + &plane->fbs[index]);
> +}
> +
> +static void plane_setup(struct plane_t *plane, int index)
> +{
> + igt_plane_set_size(plane->base, plane->rect.width, plane->rect.height);
> + igt_plane_set_position(plane->base, plane->rect.x, plane->rect.y);
> + igt_plane_set_fb(plane->base, &plane->fbs[index]);
> +}
> +
> +static void gen_fbs(struct data_t *data)
> +{
> + struct kms_t *kms = &data->kms;
> + drmModeModeInfo *mode = igt_output_get_mode(data->wb_output);
> +
> + for (int i = 0; i < 2; i++) {
> + plane_create_color_fb(&kms->primary, data->fd, i, !i, i, i);
> +
> + plane_create_color_fb(&kms->overlay_a, data->fd, i, i, !i, i);
> +
> + plane_create_color_fb(&kms->overlay_b, data->fd, i, i, i, !i);
> +
> + kms->writeback.rect.width = mode->hdisplay;
> + kms->writeback.rect.height = mode->vdisplay;
> + plane_create_fb(&kms->writeback, data->fd, i);
> + }
> +}
> +
> +static igt_output_t *find_wb_output(struct data_t *data)
> +{
> + for (int i = 0; i < data->display.n_outputs; i++) {
> + igt_output_t *output = &data->display.outputs[i];
> +
> + if (output->config.connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
> + continue;
> +
> + return output;
> +
> + }
> +
> + return NULL;
> +}
> +
> +static struct kms_t default_kms = {
> + .primary = {
> + .rect = {
> + .x = 101, .y = 0,
> + .width = 3639, .height = 2161,
> + },
> + .format = DRM_FORMAT_XRGB8888,
> + },
> + .overlay_a = {
> + .rect = {
> + .x = 201, .y = 199,
> + .width = 3033, .height = 1777,
> + },
> + .format = DRM_FORMAT_XRGB16161616,
> + },
> + .overlay_b = {
> + .rect = {
> + .x = 1800, .y = 250,
> + .width = 1507, .height = 1400,
> + },
> + .format = DRM_FORMAT_ARGB8888,
> + },
> + .writeback = {
> + .rect = {
> + .x = 0, .y = 0,
> + // Size is to be determined at runtime
> + },
> + .format = DRM_FORMAT_XRGB8888,
> + },
> +};
> +
> +
> +igt_simple_main
> +{
> + struct data_t data;
> + enum pipe pipe = PIPE_NONE;
> +
> + data.kms = default_kms;
> +
Hi Arthur,
all the above looks really good!
Some things below look strange to me, but I don't know the igt API.
> + data.fd = drm_open_driver_master(DRIVER_ANY);
> +
> + igt_display_require(&data.display, data.fd);
> +
> + kmstest_set_vt_graphics_mode();
> +
> + igt_display_require(&data.display, data.fd);
Are you supposed to call igt_display_require twice?
> + igt_require(data.display.is_atomic);
> +
> + igt_display_require_output(&data.display);
> +
> + igt_require(data.wb_output);
> + igt_display_reset(&data.display);
> +
> + data.wb_output = find_wb_output(&data);
Should igt_require(data.wb_output) be after find_wb_output?
> +
> + for_each_pipe(&data.display, pipe) {
> + igt_debug("Selecting pipe %s to %s\n",
> + kmstest_pipe_name(pipe),
> + igt_output_name(data.wb_output));
> + igt_output_set_pipe(data.wb_output, pipe);
Isn't this strange if there are multiple pipes?
> + }
> +
> + igt_display_commit_atomic(&data.display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
What's this commit needed for?
> +
> + gen_fbs(&data);
> +
> + data.kms.primary.base = igt_output_get_plane_type(data.wb_output, DRM_PLANE_TYPE_PRIMARY);
> + data.kms.overlay_a.base = igt_output_get_plane_type_index(data.wb_output,
> + DRM_PLANE_TYPE_OVERLAY, 0);
> + data.kms.overlay_b.base = igt_output_get_plane_type_index(data.wb_output,
> + DRM_PLANE_TYPE_OVERLAY, 1);
> +
> + for (int i = 0; i < FRAME_COUNT; i++) {
> + int fb_index = i % 2;
> +
> + plane_setup(&data.kms.primary, fb_index);
> +
> + plane_setup(&data.kms.overlay_a, fb_index);
> +
> + plane_setup(&data.kms.overlay_b, fb_index);
> +
> + igt_output_set_writeback_fb(data.wb_output, &data.kms.writeback.fbs[fb_index]);
> +
> + igt_display_commit2(&data.display, COMMIT_ATOMIC);
> + }
> +
> + igt_display_fini(&data.display);
> + drm_close_driver(data.fd);
> +}
Aside those questions, I'm already happy giving a
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Thanks,
pq
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2024-02-08 10:47 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-07 20:17 [PATCH i-g-t] benchmarks: Add VKMS benchmark Arthur Grillo
2024-02-07 21:10 ` ✓ CI.xeBAT: success for " Patchwork
2024-02-07 21:16 ` ✓ Fi.CI.BAT: " Patchwork
2024-02-08 1:29 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-02-08 9:50 ` Pekka Paalanen [this message]
2024-02-08 19:38 ` [PATCH i-g-t] " Arthur Grillo
2024-02-09 8:32 ` Pekka Paalanen
2024-02-09 17:29 ` Arthur Grillo
2024-02-12 8:43 ` Pekka Paalanen
2024-02-08 11:25 ` Kamil Konieczny
2024-02-08 12:51 ` Juha-Pekka Heikkila
2024-02-08 14:05 ` Kamil Konieczny
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=20240208115050.73d04796@eldfell \
--to=pekka.paalanen@haloniitty.fi \
--cc=adrinael@adrinael.net \
--cc=arek@hiler.eu \
--cc=arthurgrillo@riseup.net \
--cc=ashutosh.dixit@intel.com \
--cc=bhanuprakash.modem@intel.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=hamohammed.sa@gmail.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=juhapekka.heikkila@gmail.com \
--cc=kamil.konieczny@linux.intel.com \
--cc=louis.chauvet@bootlin.com \
--cc=mairacanal@riseup.net \
--cc=melissa.srw@gmail.com \
--cc=rodrigosiqueiramelo@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox