From patchwork Tue May 6 12:57:10 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: 887768 Delivered-To: patch@linaro.org Received: by 2002:a5d:430f:0:b0:38f:210b:807b with SMTP id h15csp2532312wrq; Tue, 6 May 2025 06:03:13 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVqMSLjdvnslELDEcNdkTrmMtQaAy1+M3AnxcM8751hd7sDD+iIKBsaOl0XiSIeKanpv3e4SA==@linaro.org X-Google-Smtp-Source: AGHT+IH3PgIAR6ywWMaKmWBKGZqSED85fAhMyiudjYLLOhnsLFeSVSDoYvXdztJykmvtMn0vJMVI X-Received: by 2002:a05:6102:1501:b0:4bb:9b46:3f92 with SMTP id ada2fe7eead31-4db1478a004mr5802336137.1.1746536593280; Tue, 06 May 2025 06:03:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1746536593; cv=none; d=google.com; s=arc-20240605; b=WLOXsi0AwAKFIB9a6wsW+NIirQV/31dVs5iC0xARntBG1PFDGNxMxprXX93tOeCqQJ LU18IrX/7l79Y/NWQLDIkzt+PrHmHQBTvu4pIZUZ/Btl4jN5WOXyuD4DmaJLDvcJ4dlH aD8Wkf1aEaSST4tRCtXIEx9GkZsiI6vrSTlx0NazVvZIAt4GW0ljswsGH5EdLggjAggD T5dJIhC34OgzuofeBpOTRy/4JmQb8cWNXQhM4bf9nnrRhieCSX1hTLAM5tF4vPERDBbH sFQgv61uVs1jTWqQalKhiQau+9BNbXhpAvy1GHrydl9UIsG1gpDjv3ODK8djqjSD7zhv qDcw== 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=prKtOm6WcF+MO/JIEf9B+KJu4Pq11tFhYp9uWEc/J/U=; fh=pBkY2umQwbyxemKEwlnphCieFL04bfu8q3GqBAwbzX0=; b=O8aIpxQJq5/ZEbb24hgYxBuo35Xz590fKwlmqr8Ynpx6DWpIYU0zTo9mQA4QNTQGme Pw4eJHsSTgdGEtNVHhm351ik/aXT2j7KEi/7RaF6uzNZf5dzyoiZ0C/3zJ5LBHrG15mp CpgoCbMsHKBSHfbpa7bZfGPeMEEC/Vqifp3hitMRpjxkVmumMe5bWci8OXIVPikHJbqU pfAWizvX6pDV+RIKiKrgJTeQ9Sn76AHmJaLbs1GlVHyiujdzBrJ71cneTM2+n9pIINlO jyqYnasMxMA5tgg9FeOswWMyG/r7q6xzHfsjpGJXWQ80qjpW2LFqBhjmRHyYr1hIG2cd dgcg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ChFyE9um; 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 ada2fe7eead31-4daf230f040si2390258137.201.2025.05.06.06.03.13 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Tue, 06 May 2025 06:03:13 -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=ChFyE9um; 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 1uCHrt-00049c-NT; Tue, 06 May 2025 08:57:53 -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 1uCHrV-0003T8-Jw for qemu-devel@nongnu.org; Tue, 06 May 2025 08:57:29 -0400 Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uCHrQ-0003rV-TZ for qemu-devel@nongnu.org; Tue, 06 May 2025 08:57:29 -0400 Received: by mail-ej1-x62f.google.com with SMTP id a640c23a62f3a-ace333d5f7bso1060081866b.3 for ; Tue, 06 May 2025 05:57:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1746536242; x=1747141042; 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=prKtOm6WcF+MO/JIEf9B+KJu4Pq11tFhYp9uWEc/J/U=; b=ChFyE9umoV2/RMMO5e5uN3BwMLVfJUGFg1+xGHOiKWjdpFxzvIazCGXmINXquySt37 2DiTfPGGBFkCdYZjcsyG987y6TBnEF5S8ZcPfEA0RB5X5IpeCvvdtpJYSgci1szK6eFb oPU/DPIJGSVnm7wdVO+Ot552SLQOrXcjS64siRCbaF1eUA0ElDdgUkzKdSeSX7HWXz5T Buv1j5jrCGf2BdEvyhd70jHIDTbg0RbHOIF3kNwe6lk8H+j/UW8vU6z3CT6ZPZ7Ojsyk sikgpn7MpSAaj6Pk/mnyP2TDoEVq5OUTVKNJBofPSHThZ/Gh7uAhHX36jJoJohxAhZcI XSyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746536242; x=1747141042; 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=prKtOm6WcF+MO/JIEf9B+KJu4Pq11tFhYp9uWEc/J/U=; b=ga8XLuV97DFPLv6mzhA48sRtprKarIjUcjoiX/S5vRWYV1ka2jP0L39BYKNE+pxX+E RH5kdPd3VrhKDDlGMs1m51UKAm7SxxatRSd7+Q1IoyAL8tvW6H/hhqmcp+mE0grHgUxB ILfvC3vQX+NWqqQjKYf9FJwuuaG7RFrP87XegGjvBTCHc7f2fFeEqoSmTNj0lMzQjPWz a0X0YR2oFOfpzJ+KWH7E2fpNQYInCHqhAGH4pC1dxO5BD0fJYrkMAjy9RVeIrcFbxF41 Y6/IM2tX4ghjCxfk8CA0/jXJsENAt9N4scYZixeC2uE0AWEDWJXah904GaDd4XjiKBob a1RQ== X-Gm-Message-State: AOJu0YwDHlrBBjxKZZOuGEMM+TNIYyN9RtG2rUSt2V/oWRZV4tBUXH2y H7oS2U3YZbfNtaFDVA2H29HE9f40XbGJtxh9iwcSTdcggNvRx3GZncI2R3M+n04= X-Gm-Gg: ASbGnctzZpROUAkf5KfAc1NeVH4RKQY280RRrHT/6EkmyQ3Sx1MgwEvCgDMw2e8fQ9g +yBaqV25rnl7qzyNHpkjahV34TtSC79x2B2F8WnmS2YzJyAbpHJbtgMfOpKOLeiFy6ORqHHaiOT CEMdX9YFGu/nQ4NW4g00fnTf3zLnXISKP6etpl0zfjVj5NpXhcHGXF4BHk9nkkrvwjMm6aptof1 +F3GDE4padXWxLA6FdZ3Wxp4rV40h1p2tKRQIeAvJByGrM2xu2yZW3WSftJXh2Ag7CngVd3UdwJ GqUIlDZ7AdmGV9kyjV5E3W1d3GhNQSXWj+99LJPG0ak= X-Received: by 2002:a17:907:9628:b0:ac7:391b:e689 with SMTP id a640c23a62f3a-ad1a4b7ec83mr940574766b.59.1746536242621; Tue, 06 May 2025 05:57:22 -0700 (PDT) Received: from draig.lan ([185.126.160.109]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5fa77b8ffcfsm7678656a12.64.2025.05.06.05.57.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 May 2025 05:57:18 -0700 (PDT) Received: from draig.lan (localhost [IPv6:::1]) by draig.lan (Postfix) with ESMTP id E7F485FAD2; Tue, 6 May 2025 13:57:15 +0100 (BST) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Hildenbrand , Akihiko Odaki , Dmitry Osipenko , Laurent Vivier , qemu-arm@nongnu.org, Mahmoud Mandour , Markus Armbruster , Pierrick Bouvier , Paolo Bonzini , Sriram Yagnaraman , =?utf-8?q?Marc-Andr?= =?utf-8?q?=C3=A9_Lureau?= , Peter Xu , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , John Snow , "Michael S. Tsirkin" , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , Fabiano Rosas , Peter Maydell , Alexandre Iooss , Manos Pitsidianakis , qemu-stable@nongnu.org Subject: [PATCH v2 09/14] hw/display: re-arrange memory region tracking Date: Tue, 6 May 2025 13:57:10 +0100 Message-Id: <20250506125715.232872-10-alex.bennee@linaro.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250506125715.232872-1-alex.bennee@linaro.org> References: <20250506125715.232872-1-alex.bennee@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::62f; envelope-from=alex.bennee@linaro.org; helo=mail-ej1-x62f.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 fbbf4cf911..b3cef1acb5 100644 --- a/include/system/memory.h +++ b/include/system/memory.h @@ -783,6 +783,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: