From nobody Tue Apr 7 12:53:41 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (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 3FD9139D6F9 for ; Fri, 13 Mar 2026 15:11:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773414679; cv=pass; b=hbJ+Y7anqmxdIyZADnTxC6FGfjNGQNbtVADuwKcxXB1MSVD6Qm6t/0C4C+EZ80xmybV2tLqsDGZWIxXO41ItTQHUY55549ouFeyxy+RGV0P8HfEW8elozOGHz6rl0ygLkiKGOyMyuLnsZjwnKzqsAq/Mf/FIquFotr0MGS6B+iU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773414679; c=relaxed/simple; bh=ZzMlV8pu3VT2c+3yuV46DtFuKECGS8oVPcadeEgas74=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ClBITyG5A7twBvPxmnA4PH0kz8+sQb1hzd0yflbJeMHtjvr4rVA89MWeI7I8X5hr8EW2ylh9VjbGdxQ0RDYDRNKf1P6CLDpM9K+aBkYCJkZEwGwIt6OHYEe9DpZpbslvXoFj6iWMMgd6VBX32pfflC7Fh4Oji9Lt0TJkyzeS72A= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b=iC9QR2v4; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b="iC9QR2v4" ARC-Seal: i=1; a=rsa-sha256; t=1773414662; cv=none; d=zohomail.com; s=zohoarc; b=jJsKd0Za7cKVGDYgfssDVwiuAw1FvAgfCGnwce48ejgDaje8MIhYqx5ITI1PlzaiuCiSefhXMGuWXhYHMtIPLSnC8pFqT7I4MVFhOWo9QKI9zwuAXQHgsaJkoHvBmOrryDSvzWl3lFcmIKKAhI8icj4x2ntRNCQF7wfpk5qOoS0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773414662; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=NLgkhCEcGm8XnL5NKaz5gxvh9IYzBqsDM7CURVbgAc4=; b=YaZI+zloirCQe+1qrLy8zQg9Q9QSt/Ubhxd+ChLRCLY40M3+7YTZXng7ajJ7I3Y/3UdZHwgy5OuhfqhfBVjRhAk5esj6wBAjqBCwYhYSALTSy/NQ2w99NOMoQCCh7lVgQ1Cbi8RJ8oESCRdgwYzHI5eZpzRNeycuWhcSCfy88Gs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=adrian.larumbe@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1773414662; s=zohomail; d=collabora.com; i=adrian.larumbe@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=NLgkhCEcGm8XnL5NKaz5gxvh9IYzBqsDM7CURVbgAc4=; b=iC9QR2v4pv6RQNB6LevA7HE5y7LyIBLfne9HP7xeCjnRgZPLuAOoU3PSiieqYlpO 12PN0MHYfkHCLjBRI45bkmr6GHin6xzRFRjB/LfBcNcIy4zWrH1soH04wMdrS9CZMMO 6mTIxzAxzTl6lzv1MhRvI8vnbZKJ/1OAMwAfAEvs= Received: by mx.zohomail.com with SMTPS id 1773414660569482.8627229381509; Fri, 13 Mar 2026 08:11:00 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Steven Price , Boris Brezillon , Janne Grunau , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Caterina Shablia , Danilo Krummrich , Matthew Brost , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Alice Ryhl , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Subject: [PATCH v5 04/11] drm/gpuvm: Add a helper to check if two VA can be merged Date: Fri, 13 Mar 2026 15:09:41 +0000 Message-ID: <20260313150956.1618635-5-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260313150956.1618635-1-adrian.larumbe@collabora.com> References: <20260313150956.1618635-1-adrian.larumbe@collabora.com> 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 Content-Type: text/plain; charset="utf-8" From: Boris Brezillon We are going to add flags/properties that will impact the VA merging ability. Instead of sprinkling tests all over the place in __drm_gpuvm_sm_map(), let's add a helper aggregating all these checks can call it for every existing VA we walk through in the __drm_gpuvm_sm_map() loop. Signed-off-by: Boris Brezillon Signed-off-by: Caterina Shablia --- drivers/gpu/drm/drm_gpuvm.c | 46 +++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c index 3c2b6102e818..4af7b71abcb4 100644 --- a/drivers/gpu/drm/drm_gpuvm.c +++ b/drivers/gpu/drm/drm_gpuvm.c @@ -2378,16 +2378,47 @@ op_unmap_cb(const struct drm_gpuvm_ops *fn, void *p= riv, return fn->sm_step_unmap(&op, priv); } =20 +static bool can_merge(struct drm_gpuvm *gpuvm, const struct drm_gpuva *va, + const struct drm_gpuva_op_map *new_map) +{ + struct drm_gpuva_op_map existing_map =3D { + .va.addr =3D va->va.addr, + .va.range =3D va->va.range, + .gem.offset =3D va->gem.offset, + .gem.obj =3D va->gem.obj, + }; + const struct drm_gpuva_op_map *a =3D new_map, *b =3D &existing_map; + + /* Only GEM-based mappings can be merged, and they must point to + * the same GEM object. + */ + if (a->gem.obj !=3D b->gem.obj || !a->gem.obj) + return false; + + /* Order VAs for the rest of the checks. */ + if (a->va.addr > b->va.addr) + swap(a, b); + + /* We assume the caller already checked that VAs overlap or are + * contiguous. + */ + if (drm_WARN_ON(gpuvm->drm, b->va.addr > a->va.addr + a->va.range)) + return false; + + /* We intentionally ignore u64 underflows because all we care about + * here is whether the VA diff matches the GEM offset diff. + */ + return b->va.addr - a->va.addr =3D=3D b->gem.offset - a->gem.offset; +} + static int __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, const struct drm_gpuvm_ops *ops, void *priv, const struct drm_gpuvm_map_req *req, bool madvise) { - struct drm_gem_object *req_obj =3D req->map.gem.obj; const struct drm_gpuvm_map_req *op_map =3D madvise ? NULL : req; struct drm_gpuva *va, *next; - u64 req_offset =3D req->map.gem.offset; u64 req_range =3D req->map.va.range; u64 req_addr =3D req->map.va.addr; u64 req_end =3D req_addr + req_range; @@ -2402,15 +2433,12 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, u64 addr =3D va->va.addr; u64 range =3D va->va.range; u64 end =3D addr + range; - bool merge =3D !!va->gem.obj; + bool merge =3D can_merge(gpuvm, va, &req->map); =20 if (madvise && obj) continue; =20 if (addr =3D=3D req_addr) { - merge &=3D obj =3D=3D req_obj && - offset =3D=3D req_offset; - if (end =3D=3D req_end) { ret =3D op_unmap_cb(ops, priv, va, merge, madvise); if (ret) @@ -2455,8 +2483,6 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, }; struct drm_gpuva_op_unmap u =3D { .va =3D va }; =20 - merge &=3D obj =3D=3D req_obj && - offset + ls_range =3D=3D req_offset; u.keep =3D merge; =20 if (end =3D=3D req_end) { @@ -2506,10 +2532,6 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, break; } } else if (addr > req_addr) { - merge &=3D obj =3D=3D req_obj && - offset =3D=3D req_offset + - (addr - req_addr); - if (end =3D=3D req_end) { ret =3D op_unmap_cb(ops, priv, va, merge, madvise); if (ret) --=20 2.53.0