From nobody Thu Nov 28 02:58:28 2024 Received: from out-186.mta0.migadu.com (out-186.mta0.migadu.com [91.218.175.186]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A6621DFD8B for ; Fri, 4 Oct 2024 19:42:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.186 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728070956; cv=none; b=M14IZd50Ygn73Ou7SrSgQ6xe0nW9V/bm4jUzUJ2fDbRdgj2mUisd37+oXaXn4PPvHIHUHnGuw3B4MjmsqW1TTh9jtiCkrJW3ZjkYzta4DCUANLkqpbg2vsDX6XUQgA3eASbtoSsyAU+AB3U03fNYPihWMiubl1RCRrt6pPr5NG0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728070956; c=relaxed/simple; bh=mtFbC3q1FEoZoslD6LqH4b0gJ2UmfOQQFzVByMVF2Ok=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=qOdIOEJfF7P/QF06ySDyMprrSBaxVecbrisg+BH0BlV4CJsQ3e4sgsOE4mga++tQBTpprfEfeiUYqRaX6BrYYtrJBfQIjj+pcJVkRwHh4BOtN55wAMSbzLeq4T/Cg1m0sitHOptKRKjWExCh/fYfQw+wxsoAbEDNTAMQiZW8Y+g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=nmKW5i2D; arc=none smtp.client-ip=91.218.175.186 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="nmKW5i2D" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1728070952; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zTAxN9/zmMnDPsplxNnmT42fuUHuWnOXQlHSEscsWkI=; b=nmKW5i2D+P1qcdVW0y93755NHYZ0TDQmGCCwtOGCP6ESI3Wy2aEpLk4XSDjlF73K0FfYBw NIiIxftpUyMFEYnAbYEdzHUQnwNhqDF33qFstV/BWkAuMdnjzddMoTy8QELroqIgGV/8az opv34krwACamJUI9A0eecsc/AbmERSw= From: Sui Jingfeng To: Lucas Stach , Russell King , Christian Gmeiner Cc: David Airlie , Simona Vetter , etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Sui Jingfeng Subject: [PATCH 1/3] drm/etnaviv: Track GPU VA size separately Date: Sat, 5 Oct 2024 03:42:05 +0800 Message-Id: <20241004194207.1013744-2-sui.jingfeng@linux.dev> In-Reply-To: <20241004194207.1013744-1-sui.jingfeng@linux.dev> References: <20241004194207.1013744-1-sui.jingfeng@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Etnaviv assumes that GPU page size is 4KiB, yet on some systems, the CPU page size is 16KiB. The size of etnaviv buffer objects will be aligned to CPU page size on kernel side, however, userspace still assumes the page size is 4KiB and doing allocation with 4KiB page as unit. This results in userspace allocated GPU virtual address range collision and therefore unable to be inserted to the specified hole exactly. The root cause is that kernel side BO takes up bigger address space than userspace assumes when the size of it is not CPU page size aligned. To Preserve GPU VA continuous as much as possible, track the size that userspace/GPU think of it is. Yes, we still need to overallocate to suit the CPU, but there is no need to waste GPU VA space anymore. Signed-off-by: Sui Jingfeng --- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 8 +++++--- drivers/gpu/drm/etnaviv/etnaviv_gem.h | 1 + drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 8 ++++---- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnavi= v/etnaviv_gem.c index 5c0c9d4e3be1..943fc20093e6 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c @@ -543,7 +543,7 @@ static const struct drm_gem_object_funcs etnaviv_gem_ob= ject_funcs =3D { .vm_ops =3D &vm_ops, }; =20 -static int etnaviv_gem_new_impl(struct drm_device *dev, u32 flags, +static int etnaviv_gem_new_impl(struct drm_device *dev, u32 size, u32 flag= s, const struct etnaviv_gem_ops *ops, struct drm_gem_object **obj) { struct etnaviv_gem_object *etnaviv_obj; @@ -570,6 +570,7 @@ static int etnaviv_gem_new_impl(struct drm_device *dev,= u32 flags, if (!etnaviv_obj) return -ENOMEM; =20 + etnaviv_obj->user_size =3D size; etnaviv_obj->flags =3D flags; etnaviv_obj->ops =3D ops; =20 @@ -588,11 +589,12 @@ int etnaviv_gem_new_handle(struct drm_device *dev, st= ruct drm_file *file, { struct etnaviv_drm_private *priv =3D dev->dev_private; struct drm_gem_object *obj =3D NULL; + unsigned int user_size =3D size; int ret; =20 size =3D PAGE_ALIGN(size); =20 - ret =3D etnaviv_gem_new_impl(dev, flags, &etnaviv_gem_shmem_ops, &obj); + ret =3D etnaviv_gem_new_impl(dev, user_size, flags, &etnaviv_gem_shmem_op= s, &obj); if (ret) goto fail; =20 @@ -627,7 +629,7 @@ int etnaviv_gem_new_private(struct drm_device *dev, siz= e_t size, u32 flags, struct drm_gem_object *obj; int ret; =20 - ret =3D etnaviv_gem_new_impl(dev, flags, ops, &obj); + ret =3D etnaviv_gem_new_impl(dev, size, flags, ops, &obj); if (ret) return ret; =20 diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnavi= v/etnaviv_gem.h index a42d260cac2c..c6e27b9abb0c 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h @@ -36,6 +36,7 @@ struct etnaviv_gem_object { const struct etnaviv_gem_ops *ops; struct mutex lock; =20 + u32 user_size; u32 flags; =20 struct list_head gem_node; diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnavi= v/etnaviv_mmu.c index 1661d589bf3e..6fbc62772d85 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c @@ -281,6 +281,7 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu_context = *context, { struct sg_table *sgt =3D etnaviv_obj->sgt; struct drm_mm_node *node; + unsigned int user_size; int ret; =20 lockdep_assert_held(&etnaviv_obj->lock); @@ -303,13 +304,12 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu_contex= t *context, } =20 node =3D &mapping->vram_node; + user_size =3D etnaviv_obj->user_size; =20 if (va) - ret =3D etnaviv_iommu_insert_exact(context, node, - etnaviv_obj->base.size, va); + ret =3D etnaviv_iommu_insert_exact(context, node, user_size, va); else - ret =3D etnaviv_iommu_find_iova(context, node, - etnaviv_obj->base.size); + ret =3D etnaviv_iommu_find_iova(context, node, user_size); if (ret < 0) goto unlock; =20 --=20 2.34.1 From nobody Thu Nov 28 02:58:28 2024 Received: from out-170.mta0.migadu.com (out-170.mta0.migadu.com [91.218.175.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 041701DFDB0 for ; Fri, 4 Oct 2024 19:42:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728070961; cv=none; b=WzojCzayVmUTbqVEwAzqtAjVGDolzy5sVDCRLUcV3+ZdYL+z3Jf14OxnnW6hfqEb28e8cHLIZ7oo0vVb3/02809+DsOBjgfH5frn5wSUUXxzEgcDyUWAyR5/xBzQZ2LyEYgql4MQ1N2cLcG1zGmZYHhuLbdEj+p92thWJHEJ8ZM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728070961; c=relaxed/simple; bh=LYsYnXoo3kJoUfPmbMgTjFyMWRRi33MCXZmR5eexX/g=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=fBHIyDyW5KIT8dUGIuD7zPtM8vBmN2jRTzweDjwpJ7Sol/qS9eD7fFFMEDUkHI6ObrqJyW2Jm9oda9kFaWVi/M4cV++SFIqQA2UxVk96APv0hXFUIxuR2lZjzWy9Nv9AwxVehK1+N2fPqCdCzBkbXm5BaOHcMw6uJDUsqdVFT5A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=ftNsIPXu; arc=none smtp.client-ip=91.218.175.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="ftNsIPXu" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1728070956; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2EJrsyNwIp588IXKZBIiuIXp7P16IHtnrPh4MNvjTGI=; b=ftNsIPXu5yWFK5uGKVBVxFtlhQMVwwI0ePFe+xZi3HbLkOE17uCdKrM1oX6jrWkJ0uZmqW aZ97YrwoK0+6sp0lKOurPgC0n50nFt1cHRVbeIQ2qufLOpCNCQj9mX7f50q2BqtVJpPLbb id/P7nbCsaZred0PGd95KyMoBWyAFfA= From: Sui Jingfeng To: Lucas Stach , Russell King , Christian Gmeiner Cc: David Airlie , Simona Vetter , etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Sui Jingfeng Subject: [PATCH 2/3] drm/etnaviv: Map and unmap the GPU VA range with respect to its user size Date: Sat, 5 Oct 2024 03:42:06 +0800 Message-Id: <20241004194207.1013744-3-sui.jingfeng@linux.dev> In-Reply-To: <20241004194207.1013744-1-sui.jingfeng@linux.dev> References: <20241004194207.1013744-1-sui.jingfeng@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Since the GPU VA space is compact in terms of 4KiB unit, map and/or unmap the area that doesn't belong to a context breaks the philosophy of PPAS. That results in severe errors: GPU hang and MMU fault (page not present) and such. Shrink the usuable size of etnaviv GEM buffer object to its user size, instead of the original physical size of its backing memory. Signed-off-by: Sui Jingfeng --- drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 28 +++++++++------------------ 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnavi= v/etnaviv_mmu.c index 6fbc62772d85..a52ec5eb0e3d 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c @@ -70,8 +70,10 @@ static int etnaviv_context_map(struct etnaviv_iommu_cont= ext *context, } =20 static int etnaviv_iommu_map(struct etnaviv_iommu_context *context, u32 io= va, + unsigned int user_len, struct sg_table *sgt, int prot) -{ struct scatterlist *sg; +{ + struct scatterlist *sg; unsigned int da =3D iova; unsigned int i; int ret; @@ -81,7 +83,8 @@ static int etnaviv_iommu_map(struct etnaviv_iommu_context= *context, u32 iova, =20 for_each_sgtable_dma_sg(sgt, sg, i) { phys_addr_t pa =3D sg_dma_address(sg) - sg->offset; - size_t bytes =3D sg_dma_len(sg) + sg->offset; + unsigned int phys_len =3D sg_dma_len(sg) + sg->offset; + size_t bytes =3D MIN(phys_len, user_len); =20 VERB("map[%d]: %08x %pap(%zx)", i, iova, &pa, bytes); =20 @@ -89,6 +92,7 @@ static int etnaviv_iommu_map(struct etnaviv_iommu_context= *context, u32 iova, if (ret) goto fail; =20 + user_len -=3D bytes; da +=3D bytes; } =20 @@ -104,21 +108,7 @@ static int etnaviv_iommu_map(struct etnaviv_iommu_cont= ext *context, u32 iova, static void etnaviv_iommu_unmap(struct etnaviv_iommu_context *context, u32= iova, struct sg_table *sgt, unsigned len) { - struct scatterlist *sg; - unsigned int da =3D iova; - int i; - - for_each_sgtable_dma_sg(sgt, sg, i) { - size_t bytes =3D sg_dma_len(sg) + sg->offset; - - etnaviv_context_unmap(context, da, bytes); - - VERB("unmap[%d]: %08x(%zx)", i, iova, bytes); - - BUG_ON(!PAGE_ALIGNED(bytes)); - - da +=3D bytes; - } + etnaviv_context_unmap(context, iova, len); =20 context->flush_seq++; } @@ -131,7 +121,7 @@ static void etnaviv_iommu_remove_mapping(struct etnaviv= _iommu_context *context, lockdep_assert_held(&context->lock); =20 etnaviv_iommu_unmap(context, mapping->vram_node.start, - etnaviv_obj->sgt, etnaviv_obj->base.size); + etnaviv_obj->sgt, etnaviv_obj->user_size); drm_mm_remove_node(&mapping->vram_node); } =20 @@ -314,7 +304,7 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu_context = *context, goto unlock; =20 mapping->iova =3D node->start; - ret =3D etnaviv_iommu_map(context, node->start, sgt, + ret =3D etnaviv_iommu_map(context, node->start, user_size, sgt, ETNAVIV_PROT_READ | ETNAVIV_PROT_WRITE); =20 if (ret < 0) { --=20 2.34.1 From nobody Thu Nov 28 02:58:28 2024 Received: from out-186.mta0.migadu.com (out-186.mta0.migadu.com [91.218.175.186]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D25DF1DFDBA for ; Fri, 4 Oct 2024 19:42:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.186 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728070963; cv=none; b=Mk7OgBO1OLKNkTWjlHZyATtG/9eMj76OZ0RxCl04JuelWWdXhxwIx5ppcvad65LMT4mgovtigTTwCcXnqfU1iPm245NTCsHe01MdDJNwZkvj4uC/Rgtqw1a3Ku8dUklvBIK3+2LEiDkDr0rxAHBl5hB0EJMrHbQFvSTaGpxejv8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728070963; c=relaxed/simple; bh=joHc5d6HhG9WMAEvUcuvZ4bj4d9zFNpkenhSe597ZEc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=goAD9v91WXMLTR74dCn9XqB0X9hETviGbaYJdfvmIRKyA10TRRdwAovcwW+liPFptW/ghkwltZyCD0LcoddvtdJ/9iTK4+Bf2YEm2F5kwwYanQ9ip2qevukR5mL2SwCO8UPU3BlsA6oG4QXzi3XVT1VLIS/G7tbS3llkBUrpmZ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=Gs+lwkXa; arc=none smtp.client-ip=91.218.175.186 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="Gs+lwkXa" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1728070960; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=d4HgvyzfgIepFwk/c9SOPAgoWvUuHNu+CqXfvHDy0mU=; b=Gs+lwkXaylIbGwOi83yonCCU74a+DnJS+lLO3LOg8JVomMmh3rKEfwPLFJ6I5myPUo8Yxh KR14ry7JUwenza/SPTQz8gWh1yF8sedOFXPKMcjjo4dFpIYlufLht/eQGVHoyuczOD9pP6 0Imgtt3nhEO5HL509c8EBguyuDUO0is= From: Sui Jingfeng To: Lucas Stach , Russell King , Christian Gmeiner Cc: David Airlie , Simona Vetter , etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Sui Jingfeng Subject: [PATCH 3/3] drm/etnaviv: Print an error message if inserting IOVA range fails Date: Sat, 5 Oct 2024 03:42:07 +0800 Message-Id: <20241004194207.1013744-4-sui.jingfeng@linux.dev> In-Reply-To: <20241004194207.1013744-1-sui.jingfeng@linux.dev> References: <20241004194207.1013744-1-sui.jingfeng@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Print an error message to help debug when such an issue happen, since it's not so obvious. Signed-off-by: Sui Jingfeng Reviewed-by: Lucas Stach --- v0 -> v1: Use dev_err_ratelimited() to prevent spamming the logs v0 is at https://lore.kernel.org/dri-devel/20240930221706.399139-1-sui.jing= feng@linux.dev/ --- drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnavi= v/etnaviv_mmu.c index a52ec5eb0e3d..37866ed05c13 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c @@ -300,8 +300,12 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu_context= *context, ret =3D etnaviv_iommu_insert_exact(context, node, user_size, va); else ret =3D etnaviv_iommu_find_iova(context, node, user_size); - if (ret < 0) + if (ret < 0) { + dev_err_ratelimited(context->global->dev, + "Insert iova failed: 0x%llx(0x%x)\n", + va, user_size); goto unlock; + } =20 mapping->iova =3D node->start; ret =3D etnaviv_iommu_map(context, node->start, user_size, sgt, --=20 2.34.1