From nobody Mon Feb 9 18:19:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1713917331; cv=none; d=zohomail.com; s=zohoarc; b=GVJKFbI1trERdpgKXP2CnjCca4Pt/0viERMAecELR/qgUIW1yuLiXz3AV0xwKOICTCALLO2BQ2X2sQYu+o28LAcMe36fD9tUMlgR1Tf/M2aq2QBCgdDxK1fOGlliDTyJnNQDnOENrGmS0qaVUDT0XOcdQR8OVp0ujBY6aqukYco= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1713917331; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=G1YWSvoGjNvhHDRlHZT21SOobUUKAazv78CQerxwuZc=; b=cknTmQ/vjsrwdq0cRyr7pvKzkevkC5F7lWGYEMjT2zG+hbd3qMfsZgfHW52dd2QLcewF82zndrF9s58siha0wq8Te/UhFlcWIOoq5WgXhFL/PBGxdQOUDK8X55KFpOzrgDjU2o/95dojeeQLsIS7csoUoylaIu8YbUEfch7EYxk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1713917331451744.7371402629453; Tue, 23 Apr 2024 17:08:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rzQAK-0002Ic-Gi; Tue, 23 Apr 2024 20:07:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rzQA3-000290-TO for qemu-devel@nongnu.org; Tue, 23 Apr 2024 20:06:55 -0400 Received: from mgamail.intel.com ([198.175.65.12]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rzQ9z-0003gl-2q for qemu-devel@nongnu.org; Tue, 23 Apr 2024 20:06:53 -0400 Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Apr 2024 17:06:39 -0700 Received: from dongwonk-z390-aorus-ultra.fm.intel.com ([10.105.129.124]) by fmviesa009.fm.intel.com with ESMTP; 23 Apr 2024 17:06:38 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1713917211; x=1745453211; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=yk3Dn0PQGdJQf1Ue1fgWZlp/8amYl9Gq5gIqFo1bbHk=; b=ZIuUJXCgEgvCmH5VlL+gSDfbuMtYSdwe2i80WZH2zzkXZGpJUHbIPkHf xfhdSJRHOvrEidfJneNxwKFp0nR/3rreGT6N3K3WEvznJ+eK50AQ7RsGp JjpEYRJFnUCJNLr3LmamS7S96aWcbFky6ZqvJSHUPOf6LSUAYy09L/APd iaynwcF/eq1VtMVhW2C9FP1w/HrjSmRrAHa9Ah1gsVwjW9Kl70eQCxjfC Z8crgBq8buinHwWtqvDa1pXZccRfJJpeIv1TmK8RULog22iqUvt+5Lbkw 3I90aXp/ZJQz6i80c0g5S11i+4yCsBEUNhTmTYd+okXu4//Xk8ZWCXsBU A==; X-CSE-ConnectionGUID: NXyQpYTVRyKLa44C/6Cnxw== X-CSE-MsgGUID: C7zG+sl7R26Wt7Q+8k/r3A== X-IronPort-AV: E=McAfee;i="6600,9927,11053"; a="20950434" X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="20950434" X-CSE-ConnectionGUID: dS6n+R5MQvCwSG+eox+atQ== X-CSE-MsgGUID: GEiwTRHkSGaUrUjNmmRsTg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="24533450" From: dongwon.kim@intel.com To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com, berrange@redhat.com, philmd@linaro.org Subject: [PATCH v11 5/6] ui/console: Use qemu_dmabuf_new() and free() helpers instead Date: Tue, 23 Apr 2024 17:02:18 -0700 Message-Id: <20240424000219.1025101-6-dongwon.kim@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240424000219.1025101-1-dongwon.kim@intel.com> References: <20240424000219.1025101-1-dongwon.kim@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=198.175.65.12; envelope-from=dongwon.kim@intel.com; helo=mgamail.intel.com X-Spam_score_int: -50 X-Spam_score: -5.1 X-Spam_bar: ----- X-Spam_report: (-5.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.67, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @intel.com) X-ZM-MESSAGEID: 1713917332668100001 From: Dongwon Kim This commit introduces utility functions for the creation and deallocation of QemuDmaBuf instances. Additionally, it updates all relevant sections of the codebase to utilize these new utility functions. v7: remove prefix, "dpy_gl_" from all helpers qemu_dmabuf_free() returns without doing anything if input is null (Daniel P. Berrang=C3=A9 ) call G_DEFINE_AUTOPTR_CLEANUP_FUNC for qemu_dmabuf_free() (Daniel P. Berrang=C3=A9 ) v8: Introduction of helpers was removed as those were already added by the previous commit v9: set dmabuf->allow_fences to 'true' when dmabuf is created in virtio_gpu_create_dmabuf()/virtio-gpu-udmabuf.c removed unnecessary spaces were accidently added in the patch, 'ui/console: Use qemu_dmabuf_new() a...' v11: Calling qemu_dmabuf_close was removed as closing dmabuf->fd will be done in qemu_dmabuf_free anyway. (Daniel P. Berrang=C3=A9 ) Suggested-by: Marc-Andr=C3=A9 Lureau Cc: Philippe Mathieu-Daud=C3=A9 Cc: Daniel P. Berrang=C3=A9 Cc: Vivek Kasireddy Signed-off-by: Dongwon Kim --- include/hw/vfio/vfio-common.h | 2 +- include/hw/virtio/virtio-gpu.h | 4 ++-- hw/display/vhost-user-gpu.c | 22 +++++++++++----------- hw/display/virtio-gpu-udmabuf.c | 24 +++++++++--------------- hw/vfio/display.c | 25 +++++++++++-------------- ui/dbus-listener.c | 28 ++++++++++++---------------- 6 files changed, 46 insertions(+), 59 deletions(-) diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index b9da6c08ef..d66e27db02 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -148,7 +148,7 @@ typedef struct VFIOGroup { } VFIOGroup; =20 typedef struct VFIODMABuf { - QemuDmaBuf buf; + QemuDmaBuf *buf; uint32_t pos_x, pos_y, pos_updates; uint32_t hot_x, hot_y, hot_updates; int dmabuf_id; diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h index ed44cdad6b..56d6e821bf 100644 --- a/include/hw/virtio/virtio-gpu.h +++ b/include/hw/virtio/virtio-gpu.h @@ -169,7 +169,7 @@ struct VirtIOGPUBaseClass { DEFINE_PROP_UINT32("yres", _state, _conf.yres, 800) =20 typedef struct VGPUDMABuf { - QemuDmaBuf buf; + QemuDmaBuf *buf; uint32_t scanout_id; QTAILQ_ENTRY(VGPUDMABuf) next; } VGPUDMABuf; @@ -238,7 +238,7 @@ struct VhostUserGPU { VhostUserBackend *vhost; int vhost_gpu_fd; /* closed by the chardev */ CharBackend vhost_chr; - QemuDmaBuf dmabuf[VIRTIO_GPU_MAX_SCANOUTS]; + QemuDmaBuf *dmabuf[VIRTIO_GPU_MAX_SCANOUTS]; bool backend_blocked; }; =20 diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c index 454e5afcff..173189ae7c 100644 --- a/hw/display/vhost-user-gpu.c +++ b/hw/display/vhost-user-gpu.c @@ -249,6 +249,7 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, VhostUse= rGpuMsg *msg) case VHOST_USER_GPU_DMABUF_SCANOUT: { VhostUserGpuDMABUFScanout *m =3D &msg->payload.dmabuf_scanout; int fd =3D qemu_chr_fe_get_msgfd(&g->vhost_chr); + uint64_t modifier =3D 0; QemuDmaBuf *dmabuf; =20 if (m->scanout_id >=3D g->parent_obj.conf.max_outputs) { @@ -261,27 +262,26 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, VhostU= serGpuMsg *msg) =20 g->parent_obj.enable =3D 1; con =3D g->parent_obj.scanout[m->scanout_id].con; - dmabuf =3D &g->dmabuf[m->scanout_id]; - qemu_dmabuf_close(dmabuf); + dmabuf =3D g->dmabuf[m->scanout_id]; dpy_gl_release_dmabuf(con, dmabuf); + g_clear_pointer(&dmabuf, qemu_dmabuf_free); if (fd =3D=3D -1) { dpy_gl_scanout_disable(con); break; } - *dmabuf =3D (QemuDmaBuf) { - .fd =3D fd, - .width =3D m->fd_width, - .height =3D m->fd_height, - .stride =3D m->fd_stride, - .fourcc =3D m->fd_drm_fourcc, - .y0_top =3D m->fd_flags & VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP, - }; if (msg->request =3D=3D VHOST_USER_GPU_DMABUF_SCANOUT2) { VhostUserGpuDMABUFScanout2 *m2 =3D &msg->payload.dmabuf_scanou= t2; - dmabuf->modifier =3D m2->modifier; + modifier =3D m2->modifier; } =20 + dmabuf =3D qemu_dmabuf_new(m->fd_width, m->fd_height, + m->fd_stride, 0, 0, 0, 0, + m->fd_drm_fourcc, modifier, + fd, false, m->fd_flags & + VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP); + dpy_gl_scanout_dmabuf(con, dmabuf); + g->dmabuf[m->scanout_id] =3D dmabuf; break; } case VHOST_USER_GPU_DMABUF_UPDATE: { diff --git a/hw/display/virtio-gpu-udmabuf.c b/hw/display/virtio-gpu-udmabu= f.c index c90eba281e..c02ec6d37d 100644 --- a/hw/display/virtio-gpu-udmabuf.c +++ b/hw/display/virtio-gpu-udmabuf.c @@ -162,7 +162,8 @@ static void virtio_gpu_free_dmabuf(VirtIOGPU *g, VGPUDM= ABuf *dmabuf) struct virtio_gpu_scanout *scanout; =20 scanout =3D &g->parent_obj.scanout[dmabuf->scanout_id]; - dpy_gl_release_dmabuf(scanout->con, &dmabuf->buf); + dpy_gl_release_dmabuf(scanout->con, dmabuf->buf); + g_clear_pointer(&dmabuf->buf, qemu_dmabuf_free); QTAILQ_REMOVE(&g->dmabuf.bufs, dmabuf, next); g_free(dmabuf); } @@ -181,17 +182,10 @@ static VGPUDMABuf } =20 dmabuf =3D g_new0(VGPUDMABuf, 1); - dmabuf->buf.width =3D r->width; - dmabuf->buf.height =3D r->height; - dmabuf->buf.stride =3D fb->stride; - dmabuf->buf.x =3D r->x; - dmabuf->buf.y =3D r->y; - dmabuf->buf.backing_width =3D fb->width; - dmabuf->buf.backing_height =3D fb->height; - dmabuf->buf.fourcc =3D qemu_pixman_to_drm_format(fb->format); - dmabuf->buf.fd =3D res->dmabuf_fd; - dmabuf->buf.allow_fences =3D true; - dmabuf->buf.draw_submitted =3D false; + dmabuf->buf =3D qemu_dmabuf_new(r->width, r->height, fb->stride, + r->x, r->y, fb->width, fb->height, + qemu_pixman_to_drm_format(fb->format), + 0, res->dmabuf_fd, true, false); dmabuf->scanout_id =3D scanout_id; QTAILQ_INSERT_HEAD(&g->dmabuf.bufs, dmabuf, next); =20 @@ -217,11 +211,11 @@ int virtio_gpu_update_dmabuf(VirtIOGPU *g, old_primary =3D g->dmabuf.primary[scanout_id]; } =20 - width =3D qemu_dmabuf_get_width(&new_primary->buf); - height =3D qemu_dmabuf_get_height(&new_primary->buf); + width =3D qemu_dmabuf_get_width(new_primary->buf); + height =3D qemu_dmabuf_get_height(new_primary->buf); g->dmabuf.primary[scanout_id] =3D new_primary; qemu_console_resize(scanout->con, width, height); - dpy_gl_scanout_dmabuf(scanout->con, &new_primary->buf); + dpy_gl_scanout_dmabuf(scanout->con, new_primary->buf); =20 if (old_primary) { virtio_gpu_free_dmabuf(g, old_primary); diff --git a/hw/vfio/display.c b/hw/vfio/display.c index 7784502b53..34e1969370 100644 --- a/hw/vfio/display.c +++ b/hw/vfio/display.c @@ -241,14 +241,11 @@ static VFIODMABuf *vfio_display_get_dmabuf(VFIOPCIDev= ice *vdev, =20 dmabuf =3D g_new0(VFIODMABuf, 1); dmabuf->dmabuf_id =3D plane.dmabuf_id; - dmabuf->buf.width =3D plane.width; - dmabuf->buf.height =3D plane.height; - dmabuf->buf.backing_width =3D plane.width; - dmabuf->buf.backing_height =3D plane.height; - dmabuf->buf.stride =3D plane.stride; - dmabuf->buf.fourcc =3D plane.drm_format; - dmabuf->buf.modifier =3D plane.drm_format_mod; - dmabuf->buf.fd =3D fd; + dmabuf->buf =3D qemu_dmabuf_new(plane.width, plane.height, + plane.stride, 0, 0, plane.width, + plane.height, plane.drm_format, + plane.drm_format_mod, fd, false, false); + if (plane_type =3D=3D DRM_PLANE_TYPE_CURSOR) { vfio_display_update_cursor(dmabuf, &plane); } @@ -261,8 +258,8 @@ static void vfio_display_free_one_dmabuf(VFIODisplay *d= py, VFIODMABuf *dmabuf) { QTAILQ_REMOVE(&dpy->dmabuf.bufs, dmabuf, next); =20 - qemu_dmabuf_close(&dmabuf->buf); - dpy_gl_release_dmabuf(dpy->con, &dmabuf->buf); + dpy_gl_release_dmabuf(dpy->con, dmabuf->buf); + g_clear_pointer(&dmabuf->buf, qemu_dmabuf_free); g_free(dmabuf); } =20 @@ -298,13 +295,13 @@ static void vfio_display_dmabuf_update(void *opaque) return; } =20 - width =3D qemu_dmabuf_get_width(&primary->buf); - height =3D qemu_dmabuf_get_height(&primary->buf); + width =3D qemu_dmabuf_get_width(primary->buf); + height =3D qemu_dmabuf_get_height(primary->buf); =20 if (dpy->dmabuf.primary !=3D primary) { dpy->dmabuf.primary =3D primary; qemu_console_resize(dpy->con, width, height); - dpy_gl_scanout_dmabuf(dpy->con, &primary->buf); + dpy_gl_scanout_dmabuf(dpy->con, primary->buf); free_bufs =3D true; } =20 @@ -318,7 +315,7 @@ static void vfio_display_dmabuf_update(void *opaque) if (cursor && (new_cursor || cursor->hot_updates)) { bool have_hot =3D (cursor->hot_x !=3D 0xffffffff && cursor->hot_y !=3D 0xffffffff); - dpy_gl_cursor_dmabuf(dpy->con, &cursor->buf, have_hot, + dpy_gl_cursor_dmabuf(dpy->con, cursor->buf, have_hot, cursor->hot_x, cursor->hot_y); cursor->hot_updates =3D 0; } else if (!cursor && new_cursor) { diff --git a/ui/dbus-listener.c b/ui/dbus-listener.c index 62d1e2d3f9..f46f53cd76 100644 --- a/ui/dbus-listener.c +++ b/ui/dbus-listener.c @@ -442,28 +442,24 @@ static void dbus_scanout_texture(DisplayChangeListene= r *dcl, trace_dbus_scanout_texture(tex_id, backing_y_0_top, backing_width, backing_height, x, y, w, h); #ifdef CONFIG_GBM - QemuDmaBuf dmabuf =3D { - .width =3D w, - .height =3D h, - .y0_top =3D backing_y_0_top, - .x =3D x, - .y =3D y, - .backing_width =3D backing_width, - .backing_height =3D backing_height, - }; + int fd; + uint32_t stride, fourcc; + uint64_t modifier; + QemuDmaBuf *dmabuf; =20 assert(tex_id); - dmabuf.fd =3D egl_get_fd_for_texture( - tex_id, (EGLint *)&dmabuf.stride, - (EGLint *)&dmabuf.fourcc, - &dmabuf.modifier); - if (dmabuf.fd < 0) { + fd =3D egl_get_fd_for_texture(tex_id, (EGLint *)&stride, (EGLint *)&fo= urcc, + &modifier); + if (fd < 0) { error_report("%s: failed to get fd for texture", __func__); return; } + dmabuf =3D qemu_dmabuf_new(w, h, stride, x, y, backing_width, + backing_height, fourcc, modifier, fd, + false, backing_y_0_top); =20 - dbus_scanout_dmabuf(dcl, &dmabuf); - close(dmabuf.fd); + dbus_scanout_dmabuf(dcl, dmabuf); + qemu_dmabuf_close(dmabuf); #endif =20 #ifdef WIN32 --=20 2.34.1