Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Martin Krastev (VMware)" <martinkrastev768@gmail.com>
To: igt-dev@lists.freedesktop.org
Cc: krastevm@vmware.com, banackm@vmware.com, mombasawalam@vmware.com
Subject: Re: [igt-dev] [PATCH i-g-t v2 7/8] igt/vmwgfx: Add reference counting tests
Date: Thu, 16 Mar 2023 16:22:18 +0200	[thread overview]
Message-ID: <5a4fa5cc-7f6a-e9b9-761b-8dfbb5ce4795@gmail.com> (raw)
In-Reply-To: <DM6PR05MB70999D64A5D5DC1B22771866AEBC9@DM6PR05MB7099.namprd05.prod.outlook.com>

From: Martin Krastev <krastevm@vmware.com>


LGTM

Reviewed-by: Martin Krastev <krastevm@vmware.com>


Regards,

Martin


On 16.03.23 г. 14:55 ч., Martin Krastev wrote:
> From: Maaz Mombasawala <mombasawalam@vmware.com>
>
> This test checks reference counting functionality for several permutations
> of prime transfers and copies of mobs and surfaces in vmwgfx.
>
> Signed-off-by: Zack Rusin <zackr@vmware.com>
> Signed-off-by: Maaz Mombasawala <mombasawalam@vmware.com>
> ---
>   tests/vmwgfx/meson.build |   3 +-
>   tests/vmwgfx/ref_count.c | 312 +++++++++++++++++++++++++++++++++++++++
>   2 files changed, 314 insertions(+), 1 deletion(-)
>   create mode 100644 tests/vmwgfx/ref_count.c
>
> diff --git a/tests/vmwgfx/meson.build b/tests/vmwgfx/meson.build
> index c84dcc28..5995b18c 100644
> --- a/tests/vmwgfx/meson.build
> +++ b/tests/vmwgfx/meson.build
> @@ -3,7 +3,8 @@ vmwgfx_progs = [
>          'tri',
>          'execution_buffer',
>          'surface_copy',
> -       'mob_stress'
> +       'mob_stress',
> +       'ref_count'
>   ]
>   vmwgfx_deps = test_deps
>
> diff --git a/tests/vmwgfx/ref_count.c b/tests/vmwgfx/ref_count.c
> new file mode 100644
> index 00000000..f216dcc9
> --- /dev/null
> +++ b/tests/vmwgfx/ref_count.c
> @@ -0,0 +1,312 @@
> +// SPDX-License-Identifier: GPL-2.0 OR MIT
> +/**********************************************************
> + * Copyright 2021-2022 VMware, Inc.
> + *
> + * 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 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.
> + *
> + **********************************************************/
> +
> +#include "igt_vmwgfx.h"
> +
> +IGT_TEST_DESCRIPTION("Perform tests related to vmwgfx's ref_count codepaths.");
> +
> +static uint32 data[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
> +
> +static void write_to_mob(int fd, struct vmw_mob *mob)
> +{
> +       void *write_data;
> +
> +       write_data = vmw_ioctl_mob_map(fd, mob);
> +       memcpy(write_data, data, sizeof(data));
> +       vmw_ioctl_mob_unmap(mob);
> +}
> +
> +static bool verify_mob_data(int fd, struct vmw_mob *mob)
> +{
> +       uint32 *read_data;
> +       void *readback;
> +       uint32 i;
> +       bool data_is_equal = true;
> +
> +       read_data = malloc(mob->size);
> +
> +       readback = vmw_ioctl_mob_map(fd, mob);
> +       memcpy(read_data, readback, sizeof(data));
> +       vmw_ioctl_mob_unmap(mob);
> +
> +       for (i = 0; i < ARRAY_SIZE(data); i++) {
> +               if (read_data[i] != data[i]) {
> +                       data_is_equal = false;
> +                       break;
> +               }
> +       }
> +
> +       free(read_data);
> +       return data_is_equal;
> +}
> +
> +static struct vmw_surface *
> +create_and_write_shareable_surface(int32 fd, SVGA3dSize surface_size)
> +{
> +       struct vmw_mob mob = { 0 };
> +       struct vmw_surface *surface;
> +
> +       surface = vmw_ioctl_create_surface_full(
> +               fd, SVGA3D_SURFACE_HINT_RENDERTARGET, SVGA3D_BUFFER, 0,
> +               SVGA3D_MS_PATTERN_NONE, SVGA3D_MS_QUALITY_NONE,
> +               SVGA3D_TEX_FILTER_NONE, 1, 1, surface_size, NULL,
> +               drm_vmw_surface_flag_shareable);
> +
> +       mob.handle = surface->base.buffer_handle;
> +       mob.map_handle = surface->base.buffer_map_handle;
> +       mob.size = surface->base.buffer_size;
> +
> +       write_to_mob(fd, &mob);
> +
> +       return surface;
> +}
> +
> +static bool ref_surface_and_check_contents(int32 fd, uint32 surface_handle)
> +{
> +       struct vmw_surface surface;
> +       struct vmw_mob mob = { 0 };
> +
> +       surface = vmw_ioctl_surface_ref(fd, surface_handle,
> +                                       DRM_VMW_HANDLE_LEGACY);
> +
> +       mob.handle = surface.base.handle;
> +       mob.size = surface.base.buffer_size;
> +       mob.map_handle = surface.base.buffer_map_handle;
> +
> +       return verify_mob_data(fd, &mob);
> +}
> +
> +igt_main
> +{
> +       int32 fd1, fd2;
> +       const uint32 size = sizeof(data);
> +       SVGA3dSize surface_size = { .width = size, .height = 1, .depth = 1 };
> +
> +       igt_fixture
> +       {
> +               fd1 = drm_open_driver_render(DRIVER_VMWGFX);
> +               fd2 = drm_open_driver_render(DRIVER_VMWGFX);
> +               igt_require(fd1 != -1);
> +               igt_require(fd2 != -1);
> +       }
> +
> +       igt_subtest("surface_prime_transfer_explicit_mob")
> +       {
> +               struct vmw_mob *mob;
> +               struct vmw_surface *surface;
> +               int32 surface_fd;
> +               uint32 surface_handle;
> +
> +               mob = vmw_ioctl_mob_create(fd1, size);
> +               surface = vmw_ioctl_create_surface_full(
> +                       fd1, SVGA3D_SURFACE_HINT_RENDERTARGET, SVGA3D_BUFFER, 0,
> +                       SVGA3D_MS_PATTERN_NONE, SVGA3D_MS_QUALITY_NONE,
> +                       SVGA3D_TEX_FILTER_NONE, 1, 1, surface_size, mob,
> +                       drm_vmw_surface_flag_shareable);
> +
> +               write_to_mob(fd1, mob);
> +
> +               surface_fd =
> +                       prime_handle_to_fd_for_mmap(fd1, surface->base.handle);
> +
> +               vmw_ioctl_mob_close_handle(fd1, mob);
> +               vmw_ioctl_surface_unref(fd1, surface);
> +
> +               surface_handle = prime_fd_to_handle(fd2, surface_fd);
> +               close(surface_fd);
> +
> +               igt_assert(ref_surface_and_check_contents(fd2, surface_handle));
> +       }
> +
> +       igt_subtest("surface_prime_transfer_implicit_mob")
> +       {
> +               struct vmw_surface *surface;
> +               int32 surface_fd;
> +               uint32 surface_handle;
> +
> +               surface = create_and_write_shareable_surface(fd1, surface_size);
> +
> +               surface_fd =
> +                       prime_handle_to_fd_for_mmap(fd1, surface->base.handle);
> +
> +               vmw_ioctl_surface_unref(fd1, surface);
> +
> +               surface_handle = prime_fd_to_handle(fd2, surface_fd);
> +               close(surface_fd);
> +
> +               igt_assert(ref_surface_and_check_contents(fd2, surface_handle));
> +       }
> +
> +       igt_subtest("surface_prime_transfer_fd_dup")
> +       {
> +               int32 surface_fd1, surface_fd2;
> +               uint32 surface_handle;
> +               struct vmw_surface *surface;
> +
> +               surface = create_and_write_shareable_surface(fd1, surface_size);
> +
> +               surface_fd1 =
> +                       prime_handle_to_fd_for_mmap(fd1, surface->base.handle);
> +               vmw_ioctl_surface_unref(fd1, surface);
> +
> +               surface_fd2 = dup(surface_fd1);
> +               close(surface_fd1);
> +
> +               surface_handle = prime_fd_to_handle(fd2, surface_fd2);
> +               close(surface_fd2);
> +
> +               igt_assert(ref_surface_and_check_contents(fd2, surface_handle));
> +       }
> +
> +       igt_subtest("surface_prime_transfer_two_surfaces")
> +       {
> +               int32 surface_fd;
> +               uint32 surface_handle1, surface_handle2;
> +               struct vmw_surface *surface1, *surface2;
> +
> +               surface1 =
> +                       create_and_write_shareable_surface(fd1, surface_size);
> +               surface2 =
> +                       create_and_write_shareable_surface(fd1, surface_size);
> +
> +               surface_fd =
> +                       prime_handle_to_fd_for_mmap(fd1, surface1->base.handle);
> +               vmw_ioctl_surface_unref(fd1, surface1);
> +
> +               surface_handle1 = prime_fd_to_handle(fd2, surface_fd);
> +               close(surface_fd);
> +
> +               surface_fd =
> +                       prime_handle_to_fd_for_mmap(fd1, surface2->base.handle);
> +               vmw_ioctl_surface_unref(fd1, surface2);
> +
> +               surface_handle2 = prime_fd_to_handle(fd2, surface_fd);
> +               close(surface_fd);
> +
> +               igt_assert(
> +                       ref_surface_and_check_contents(fd2, surface_handle1));
> +               igt_assert(
> +                       ref_surface_and_check_contents(fd2, surface_handle2));
> +       }
> +
> +       igt_subtest("surface_prime_transfer_single_surface_multiple_handle")
> +       {
> +               int32 surface_fd;
> +               uint32 surface_handle_old;
> +               uint32 surface_handle1, surface_handle2, surface_handle3;
> +               struct vmw_surface *surface;
> +
> +               surface = create_and_write_shareable_surface(fd1, surface_size);
> +               surface_handle_old = surface->base.handle;
> +
> +               surface_fd =
> +                       prime_handle_to_fd_for_mmap(fd1, surface->base.handle);
> +               vmw_ioctl_surface_unref(fd1, surface);
> +
> +               surface_handle1 = prime_fd_to_handle(fd1, surface_fd);
> +               surface_handle2 = prime_fd_to_handle(fd2, surface_fd);
> +               surface_handle3 = prime_fd_to_handle(fd2, surface_fd);
> +               close(surface_fd);
> +
> +               igt_assert_eq_u32(surface_handle_old, surface_handle1);
> +               igt_assert_eq_u32(surface_handle2, surface_handle3);
> +
> +               igt_assert(
> +                       ref_surface_and_check_contents(fd1, surface_handle1));
> +               igt_assert(
> +                       ref_surface_and_check_contents(fd2, surface_handle2));
> +       }
> +
> +       igt_subtest("mob_repeated_unref")
> +       {
> +               struct vmw_mob *mob;
> +               int i = 0;
> +
> +               mob = vmw_ioctl_mob_create(fd1, size);
> +               write_to_mob(fd1, mob);
> +
> +               /* Shouldn't crash on multiple invocations */
> +               for (i = 0; i < 3; i++) {
> +                       int ret;
> +                       struct drm_vmw_handle_close_arg arg = {
> +                               .handle = mob->handle
> +                       };
> +                       ret = drmCommandWrite(fd1, DRM_VMW_HANDLE_CLOSE, &arg,
> +                                             sizeof(arg));
> +                       igt_assert_eq(ret, 0);
> +               }
> +               free(mob);
> +       }
> +
> +       igt_subtest("surface_repeated_unref")
> +       {
> +               struct vmw_surface *surface;
> +               int i = 0;
> +
> +               surface = vmw_ioctl_create_surface_full(
> +                       fd1, SVGA3D_SURFACE_HINT_RENDERTARGET, SVGA3D_BUFFER, 0,
> +                       SVGA3D_MS_PATTERN_NONE, SVGA3D_MS_QUALITY_NONE,
> +                       SVGA3D_TEX_FILTER_NONE, 1, 1, surface_size, NULL,
> +                       drm_vmw_surface_flag_shareable);
> +
> +               /* Shouldn't crash on multiple invocations */
> +               for (i = 0; i < 3; i++) {
> +                       struct drm_vmw_surface_arg s_arg = {
> +                               .sid = surface->base.handle,
> +                               .handle_type = DRM_VMW_HANDLE_LEGACY
> +                       };
> +                       drmCommandWrite(fd1, DRM_VMW_UNREF_SURFACE, &s_arg,
> +                                       sizeof(s_arg));
> +               }
> +               free(surface);
> +       }
> +
> +       igt_subtest("surface_alloc_ref_unref")
> +       {
> +               struct vmw_surface *surface;
> +               struct vmw_surface ref_surface;
> +               struct vmw_mob readback_mob = { 0 };
> +
> +               surface = create_and_write_shareable_surface(fd1, surface_size);
> +
> +               ref_surface = vmw_ioctl_surface_ref(fd1, surface->base.handle,
> +                                                   DRM_VMW_HANDLE_LEGACY);
> +
> +               vmw_ioctl_surface_unref(fd1, surface);
> +
> +               readback_mob.handle = ref_surface.base.handle;
> +               readback_mob.size = ref_surface.base.buffer_size;
> +               readback_mob.map_handle = ref_surface.base.buffer_map_handle;
> +
> +               igt_assert(verify_mob_data(fd1, &readback_mob));
> +       }
> +
> +       igt_fixture
> +       {
> +               close(fd1);
> +               close(fd2);
> +       }
> +}
> --
> 2.38.1
>

  parent reply	other threads:[~2023-03-16 14:22 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-16  2:26 [igt-dev] [PATCH i-g-t v2 0/8] Add vmwgfx support Zack Rusin
2023-03-16  2:26 ` [igt-dev] [PATCH i-g-t v2 1/8] igt/vmwgfx: Add generated headers for svga device Zack Rusin
     [not found]   ` <DM6PR05MB7099753BF0C4C180B50FE6F5AEBC9@DM6PR05MB7099.namprd05.prod.outlook.com>
2023-03-16 13:03     ` Martin Krastev (VMware)
2023-03-20 17:08       ` Kamil Konieczny
2023-03-17 16:52   ` Kamil Konieczny
2023-03-17 19:34     ` Zack Rusin
2023-04-03 12:57       ` Kamil Konieczny
2023-03-16  2:26 ` [igt-dev] [PATCH i-g-t v2 2/8] igt/vmwgfx: Add vmwgfx support Zack Rusin
     [not found]   ` <DM6PR05MB7099CE80747EDA8D25FA1B80AEBC9@DM6PR05MB7099.namprd05.prod.outlook.com>
2023-03-16 13:17     ` Martin Krastev (VMware)
2023-03-17  8:12   ` Petri Latvala
2023-03-16  2:26 ` [igt-dev] [PATCH i-g-t v2 3/8] igt/vmwgfx: Add triangle test Zack Rusin
     [not found]   ` <DM6PR05MB7099906944F388E2AF52683CAEBC9@DM6PR05MB7099.namprd05.prod.outlook.com>
2023-03-16 13:37     ` Martin Krastev (VMware)
2023-03-17 16:58   ` Kamil Konieczny
2023-03-16  2:26 ` [igt-dev] [PATCH i-g-t v2 4/8] igt/vmwgfx: Add execution buffer test Zack Rusin
     [not found]   ` <DM6PR05MB7099387153CDB475DEC7D7A4AEBC9@DM6PR05MB7099.namprd05.prod.outlook.com>
2023-03-16 13:55     ` Martin Krastev (VMware)
2023-03-16  2:26 ` [igt-dev] [PATCH i-g-t v2 5/8] igt/vmwgfx: Add surface copy test Zack Rusin
     [not found]   ` <DM6PR05MB7099EFBC41B5FCEE66C80C44AEBC9@DM6PR05MB7099.namprd05.prod.outlook.com>
2023-03-16 14:08     ` Martin Krastev (VMware)
2023-03-16  2:26 ` [igt-dev] [PATCH i-g-t v2 6/8] igt/vmwgfx: Add mob stress test Zack Rusin
     [not found]   ` <DM6PR05MB70993CAD6D2EF2959A0522F8AEBC9@DM6PR05MB7099.namprd05.prod.outlook.com>
2023-03-16 14:13     ` Martin Krastev (VMware)
2023-03-16  2:26 ` [igt-dev] [PATCH i-g-t v2 7/8] igt/vmwgfx: Add reference counting tests Zack Rusin
     [not found]   ` <DM6PR05MB70999D64A5D5DC1B22771866AEBC9@DM6PR05MB7099.namprd05.prod.outlook.com>
2023-03-16 14:22     ` Martin Krastev (VMware) [this message]
2023-03-16  2:26 ` [igt-dev] [PATCH i-g-t v2 8/8] lib/igt_kms: vmwgfx returns 8 crtc Zack Rusin
     [not found]   ` <DM6PR05MB70990327C01C62C72489C001AEBC9@DM6PR05MB7099.namprd05.prod.outlook.com>
2023-03-16 14:25     ` Martin Krastev (VMware)
2023-03-16 17:39   ` Maaz Mombasawala (VMware)
2023-03-16  3:07 ` [igt-dev] ✓ Fi.CI.BAT: success for Add vmwgfx support (rev2) Patchwork
2023-03-16  8:19 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork

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=5a4fa5cc-7f6a-e9b9-761b-8dfbb5ce4795@gmail.com \
    --to=martinkrastev768@gmail.com \
    --cc=banackm@vmware.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=krastevm@vmware.com \
    --cc=mombasawalam@vmware.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