From patchwork Tue Jun 3 11:01:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 893857 Delivered-To: patch@linaro.org Received: by 2002:adf:a2d4:0:b0:3a4:ee3f:8f15 with SMTP id t20csp238797wra; Tue, 3 Jun 2025 04:05:51 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWeKxGe2egSt6XXZWk/0dzQ02X5ZkPnTf+NOhCLuHCIGM7lxfjE+5LdjkA6KO01xXnouZDHcA==@linaro.org X-Google-Smtp-Source: AGHT+IGuRQBGbBNoUhg58T7Ip8HywKcw9N2k92JGPDuo7KVM/18sHlbEcyx+ug+hd10koauyZaOk X-Received: by 2002:a05:622a:40cb:b0:4a4:2be2:7567 with SMTP id d75a77b69052e-4a59adf8e1cmr39923181cf.8.1748948751120; Tue, 03 Jun 2025 04:05:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1748948751; cv=none; d=google.com; s=arc-20240605; b=bgmDmAIz3ExN696fZQOd92nghoPu9MDRFs8T3KVjis7uPDk0yp7l9taZtyg9hi/nz0 IuhSsU7tbDx5yT1mR4PZmHixz12Ou0Nb1h7c7ZyFbc9szOF4gOId1wR2CFg3s5a5Rbh1 kANEVkA0JdFPYPmZTlBhLo7KAbrbeG3khDpzng19oXEsZnGjNFwN1Wh9NnxeKkWEOWzT 7vbeTumaFbMTRh8nLm8Hn4cm4Y7yPWRcugK0JOhftY+9kbkKQDdeKrokWCh7U9cVZpm2 1eY+P8aXhv9FC/xeQmhd68nMGVc+jToafxOLJ0MYjcP8h6Eqpl1m1p/iLHjJ+4YhRTkA G/EQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=wQET4a6RoFXalr9xv5iZgw1vmkbJEH7KrDKYfmPKa9w=; fh=31PGCsTZXmaW6ol/3xGO6YUc+VEXSQuoGsBK/AiDSsw=; b=QoVFKBgorL2Gj9kmx706/Fx6u8asfK/jY8ol6rmZ3Afg7bO5U7nqvJzaMOUzw0OWAM z5lgaPFMs5tKctm43V1rDNEmokmBd7YwZ37vK5rwyMdbnL4ylPOsZYcI+MIBFZgnKu12 +cVGxj0vlGwD/uLDpuOaTPeaLc2m7/Rp4C89dKlp5jyQDI0ZvFT2HOWTum4eVYI4lr0x vtYgoKJnk5vXg1g65JchX+AkFTba1KArz3xM0s7vuEQdHiN5qMS1yCKyuTf0MWAN9pu3 6ApP+b/lmRvED+lH/t0QWFALtKLhMRL2rltx8vtI15iM6djZWNGXmIxImCQ0oQigs0ju 5AJA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="KXGvUw/4"; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org; dara=neutral header.i=@linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id d75a77b69052e-4a435a91380si125963831cf.588.2025.06.03.04.05.50 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Jun 2025 04:05:51 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="KXGvUw/4"; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org; dara=neutral header.i=@linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uMPPu-0008KO-Un; Tue, 03 Jun 2025 07:02:51 -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 1uMPPQ-000840-2b for qemu-devel@nongnu.org; Tue, 03 Jun 2025 07:02:20 -0400 Received: from mail-ej1-x62e.google.com ([2a00:1450:4864:20::62e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uMPPL-0002CY-DQ for qemu-devel@nongnu.org; Tue, 03 Jun 2025 07:02:19 -0400 Received: by mail-ej1-x62e.google.com with SMTP id a640c23a62f3a-ad89d8a270fso1353025866b.1 for ; Tue, 03 Jun 2025 04:02:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1748948533; x=1749553333; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wQET4a6RoFXalr9xv5iZgw1vmkbJEH7KrDKYfmPKa9w=; b=KXGvUw/4bbA94xCTOYxnD04AE1dfoXUyyy4OziGN58JcQiIv2LubSqkIh39kc4VXX/ unDq+e3BdGbHKtRu90HgpPRnuJn00t89H/bZpmCenzzUzw1fNvnD8e8Jep5shU8Inn1Y /JhyTHGU7EL3hs0tX5tCbVX0NOYABTblyd7zlvzhUZvXN6fUh5QH9PGskHhUtVcZArwL /80HDk/q7U5H/DqbQb9I7tQ8xoNWaVKlauuRSsfMQ5pNhVkhHvc7/0H6U+UL1P712jVb ZcT2JpnDL07Qg7GX8S3VxoSuVVYHnUL27e5aQ3irvv4iRJiYGA2Fk5yNfPdzBFYo7mR2 ppRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748948533; x=1749553333; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wQET4a6RoFXalr9xv5iZgw1vmkbJEH7KrDKYfmPKa9w=; b=MYVQ1tlFOJB7RiaoW8/zQzM/XbmHzoMvVfswpuKtYj6k423koWkcQLBEPJjHqpCMTJ o/tCsAzo4qbFXslR+hPn8KVnz87r1gGrr9tByPZn5yjYtNyN5abNcc529q9c4gh/XGl0 KTcvP3APUZfAmTggumU+fq6O2YU2tvn4WcdR+hh6qFxKYQjyXtdlcfUuEtP5CdWEYSZq A4+VbHS9i1yYPO++cbBtDnLtI59/8RqOnQoTmzhyw4cnpZSfZy83Vi/YWWAv4vzWFTcl V1+9ELrE8QZZ6YiQMLSyDNbo5tvu0Ubf9iwWGnJZYU9zUapL7SgZAdS/enBAAXufK1yX rfLg== X-Gm-Message-State: AOJu0YyYyg2mSMIGdYqh64RMeXmsBjqsZ/Xupsrajj/KCJKh2CPAH3/Z Zu9ob6emIxKFFVMsh68eBHQ0pXBtbK1DqFZJWRZX1LGV4Ze0OKiLkB3bKi5D4ZTJdS4= X-Gm-Gg: ASbGnctoGO381qktNCqR8rzZ2d3Hz/Ve6DHH2xuatr/QM7Q2sZK/Wy1XOGyO/DDNw7n zwFWYgFg7k2mVCHnedstdQyz9pywJW8J+v/QTUa6whM7z8GtsPRcmWCgjtN5HO+0FWkz3bpV542 FPBFT9U+5frxolG/W19DBFj20IuiGZnP9z3q4bTQsKke1cq0zhwvqsP5pX63O29sUUZMh3YRkgE VIIhTlBcAoRUJvLqyNqhvjgBz7IP0tiZXbJmj/ish+ka2WOr4o3DtTgzKcMkDsc5BWv2x9DXx8h hgbcZZsyXSp4w0J6OYe76QgobshkLHv0jyj91JR03o5vd8V+WWEV X-Received: by 2002:a17:907:72c7:b0:ad8:91e4:a931 with SMTP id a640c23a62f3a-adde66fadf7mr201168066b.26.1748948533361; Tue, 03 Jun 2025 04:02:13 -0700 (PDT) Received: from draig.lan ([185.126.160.19]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ada5d7ff0dfsm946656466b.13.2025.06.03.04.02.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jun 2025 04:02:08 -0700 (PDT) Received: from draig.lan (localhost [IPv6:::1]) by draig.lan (Postfix) with ESMTP id BCFD75F9E3; Tue, 03 Jun 2025 12:02:05 +0100 (BST) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: Sriram Yagnaraman , Akihiko Odaki , "Michael S. Tsirkin" , Dmitry Osipenko , Paolo Bonzini , Peter Maydell , John Snow , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Pierrick Bouvier , Peter Xu , =?utf-8?q?Alex_Benn=C3=A9e?= , Fabiano Rosas , qemu-arm@nongnu.org, Thomas Huth , Alexandre Iooss , Gustavo Romero , Markus Armbruster , David Hildenbrand , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , Laurent Vivier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Manos Pitsidianakis , qemu-stable@nongnu.org Subject: [PATCH v4 09/17] hw/display: re-arrange memory region tracking Date: Tue, 3 Jun 2025 12:01:56 +0100 Message-ID: <20250603110204.838117-10-alex.bennee@linaro.org> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250603110204.838117-1-alex.bennee@linaro.org> References: <20250603110204.838117-1-alex.bennee@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::62e; envelope-from=alex.bennee@linaro.org; helo=mail-ej1-x62e.google.com X-Spam_score_int: 12 X-Spam_score: 1.2 X-Spam_bar: + X-Spam_report: (1.2 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org QOM objects can be embedded in other QOM objects and managed as part of their lifetime but this isn't the case for virtio_gpu_virgl_hostmem_region. However before we can split it out we need some other way of associating the wider data structure with the memory region. Fortunately MemoryRegion has an opaque pointer. This is passed down to MemoryRegionOps for device type regions but is unused in the memory_region_init_ram_ptr() case. Use the opaque to carry the reference and allow the final MemoryRegion object to be reaped when its reference count is cleared. Signed-off-by: Manos Pitsidianakis Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Alex Bennée Message-Id: <20250410122643.1747913-2-manos.pitsidianakis@linaro.org> Cc: qemu-stable@nongnu.org --- include/system/memory.h | 1 + hw/display/virtio-gpu-virgl.c | 23 ++++++++--------------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/include/system/memory.h b/include/system/memory.h index fc35a0dcad..90715ff44a 100644 --- a/include/system/memory.h +++ b/include/system/memory.h @@ -784,6 +784,7 @@ struct MemoryRegion { DeviceState *dev; const MemoryRegionOps *ops; + /* opaque data, used by backends like @ops */ void *opaque; MemoryRegion *container; int mapped_via_alias; /* Mapped via an alias, container might be NULL */ diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c index 145a0b3879..71a7500de9 100644 --- a/hw/display/virtio-gpu-virgl.c +++ b/hw/display/virtio-gpu-virgl.c @@ -52,17 +52,11 @@ virgl_get_egl_display(G_GNUC_UNUSED void *cookie) #if VIRGL_VERSION_MAJOR >= 1 struct virtio_gpu_virgl_hostmem_region { - MemoryRegion mr; + MemoryRegion *mr; struct VirtIOGPU *g; bool finish_unmapping; }; -static struct virtio_gpu_virgl_hostmem_region * -to_hostmem_region(MemoryRegion *mr) -{ - return container_of(mr, struct virtio_gpu_virgl_hostmem_region, mr); -} - static void virtio_gpu_virgl_resume_cmdq_bh(void *opaque) { VirtIOGPU *g = opaque; @@ -73,14 +67,12 @@ static void virtio_gpu_virgl_resume_cmdq_bh(void *opaque) static void virtio_gpu_virgl_hostmem_region_free(void *obj) { MemoryRegion *mr = MEMORY_REGION(obj); - struct virtio_gpu_virgl_hostmem_region *vmr; + struct virtio_gpu_virgl_hostmem_region *vmr = mr->opaque; VirtIOGPUBase *b; VirtIOGPUGL *gl; - vmr = to_hostmem_region(mr); - vmr->finish_unmapping = true; - b = VIRTIO_GPU_BASE(vmr->g); + vmr->finish_unmapping = true; b->renderer_blocked--; /* @@ -118,8 +110,8 @@ virtio_gpu_virgl_map_resource_blob(VirtIOGPU *g, vmr = g_new0(struct virtio_gpu_virgl_hostmem_region, 1); vmr->g = g; + mr = g_new0(MemoryRegion, 1); - mr = &vmr->mr; memory_region_init_ram_ptr(mr, OBJECT(mr), "blob", size, data); memory_region_add_subregion(&b->hostmem, offset, mr); memory_region_set_enabled(mr, true); @@ -131,7 +123,9 @@ virtio_gpu_virgl_map_resource_blob(VirtIOGPU *g, * command processing until MR is fully unreferenced and freed. */ OBJECT(mr)->free = virtio_gpu_virgl_hostmem_region_free; + mr->opaque = vmr; + vmr->mr = mr; res->mr = mr; return 0; @@ -142,16 +136,15 @@ virtio_gpu_virgl_unmap_resource_blob(VirtIOGPU *g, struct virtio_gpu_virgl_resource *res, bool *cmd_suspended) { - struct virtio_gpu_virgl_hostmem_region *vmr; VirtIOGPUBase *b = VIRTIO_GPU_BASE(g); MemoryRegion *mr = res->mr; + struct virtio_gpu_virgl_hostmem_region *vmr; int ret; if (!mr) { return 0; } - - vmr = to_hostmem_region(res->mr); + vmr = mr->opaque; /* * Perform async unmapping in 3 steps: