From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 477A94418CA for ; Tue, 31 Mar 2026 17:52:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774979543; cv=none; b=IdLpT6zfCis9t23kBAwPAZhjwrTn30KYu9E36ghphrWwn31rS2BoM4OZIG94sjJ+/qjL0+nVB6roS8SCAU+i4KIyrhjjwJ7BZBHpLktb3Lwq0mpHuTsaRNOZJfFznZVas6mjkIaE8FKWsPjMHgZDAn1E1dRqAkqvNrBCkzPckvM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774979543; c=relaxed/simple; bh=Of0GTXKirglFMgzgF6RRDjzLJyWtAKM0C3vkEsxTDSk=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=k1bQOK6Gm4VXarhYRlJZYBTJNuqL3366jyXlPv3TRmscnnp3+p8rqnjdzKx4RoPd6dQVePXGWSti/9WyEF81gDED6UIvNJ1KjzgVd9RIzf43Qa8Q8Tlwbv0XIGglE99Ekorcq/DUkqpgpgHViisJfadwg5GjcNxOUS8igjUwtZE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ER5PhQKa; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ER5PhQKa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DCC93C2BCB0; Tue, 31 Mar 2026 17:52:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774979542; bh=Of0GTXKirglFMgzgF6RRDjzLJyWtAKM0C3vkEsxTDSk=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=ER5PhQKa9vPKDJrL7fnDEquDv5LA+WfgdYLIvTgiPPoFemxtxQCa3rLFWvV+28oJg soF2iUY006pU9tA/cnadpVy75JOOJCY/QzR0oSqBlfwEZ1SZlEeGzMUXVPiYTt9pnC oGnQGr8YmELqOv/P/IKW4q++jUumAgysBWBD1bUt4M7NW26xWEmKD/kNRDYNvSHJIy sKvUwVZIx3L6rYa+SJjM42pLgfYVMOMzh4KX0hi+VqgwyzsRdioUGmBE6QqQrzdHr9 fja13eUssJ52rcZtYzrjoxU4xdMaIAC5R5AwGecmkkRaIPBGyRfSVaP5tgmEHybhBI x3XZ920CrZ+0w== Message-ID: Date: Tue, 31 Mar 2026 12:52:20 -0500 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH V2] accel/amdxdna: Support read-only user-pointer BO mappings To: Lizhi Hou , ogabbay@kernel.org, quic_jhugo@quicinc.com, dri-devel@lists.freedesktop.org, maciej.falkowski@linux.intel.com Cc: Max Zhen , linux-kernel@vger.kernel.org, sonal.santan@amd.com References: <20260331172635.3275296-1-lizhi.hou@amd.com> Content-Language: en-US From: Mario Limonciello In-Reply-To: <20260331172635.3275296-1-lizhi.hou@amd.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 3/31/26 12:26, Lizhi Hou wrote: > From: Max Zhen > > Update the amdxdna user-pointer (ubuf) BO path to support creating buffer > objects from read-only user mappings. > > Detect read-only VMAs by checking VMA permissions across all user virtual > address ranges associated with the BO. When all entries are read-only, pin > user pages without FOLL_WRITE and export the resulting dmabuf as read-only > (O_RDONLY). > > This allows userptr BOs backed by read-only mappings to be safely imported > and used without requiring write access, which was previously rejected due > to unconditional FOLL_WRITE usage. > > Signed-off-by: Max Zhen > Signed-off-by: Lizhi Hou > --- > drivers/accel/amdxdna/amdxdna_ubuf.c | 29 ++++++++++++++++++++++++++-- > 1 file changed, 27 insertions(+), 2 deletions(-) Reviewed-by: Mario Limonciello (AMD) > > diff --git a/drivers/accel/amdxdna/amdxdna_ubuf.c b/drivers/accel/amdxdna/amdxdna_ubuf.c > index 4c0647057759..3769210c55cc 100644 > --- a/drivers/accel/amdxdna/amdxdna_ubuf.c > +++ b/drivers/accel/amdxdna/amdxdna_ubuf.c > @@ -125,6 +125,26 @@ static const struct dma_buf_ops amdxdna_ubuf_dmabuf_ops = { > .vunmap = amdxdna_ubuf_vunmap, > }; > > +static int readonly_va_entry(struct amdxdna_drm_va_entry *va_ent) > +{ > + struct mm_struct *mm = current->mm; > + struct vm_area_struct *vma; > + int ret; > + > + mmap_read_lock(mm); > + > + vma = find_vma(mm, va_ent->vaddr); > + if (!vma || > + vma->vm_start > va_ent->vaddr || > + vma->vm_end - va_ent->vaddr < va_ent->len) > + ret = -ENOENT; > + else > + ret = vma->vm_flags & VM_WRITE ? 0 : 1; > + > + mmap_read_unlock(mm); > + return ret; > +} > + > struct dma_buf *amdxdna_get_ubuf(struct drm_device *dev, > u32 num_entries, void __user *va_entries) > { > @@ -134,6 +154,7 @@ struct dma_buf *amdxdna_get_ubuf(struct drm_device *dev, > struct amdxdna_ubuf_priv *ubuf; > u32 npages, start = 0; > struct dma_buf *dbuf; > + bool readonly = true; > int i, ret; > DEFINE_DMA_BUF_EXPORT_INFO(exp_info); > > @@ -172,6 +193,10 @@ struct dma_buf *amdxdna_get_ubuf(struct drm_device *dev, > ret = -EINVAL; > goto free_ent; > } > + > + /* Pin pages as writable as long as not all entries are read-only. */ > + if (readonly && readonly_va_entry(&va_ent[i]) != 1) > + readonly = false; > } > > ubuf->nr_pages = exp_info.size >> PAGE_SHIFT; > @@ -194,7 +219,7 @@ struct dma_buf *amdxdna_get_ubuf(struct drm_device *dev, > npages = va_ent[i].len >> PAGE_SHIFT; > > ret = pin_user_pages_fast(va_ent[i].vaddr, npages, > - FOLL_WRITE | FOLL_LONGTERM, > + (readonly ? 0 : FOLL_WRITE) | FOLL_LONGTERM, > &ubuf->pages[start]); > if (ret >= 0) { > start += ret; > @@ -211,7 +236,7 @@ struct dma_buf *amdxdna_get_ubuf(struct drm_device *dev, > > exp_info.ops = &amdxdna_ubuf_dmabuf_ops; > exp_info.priv = ubuf; > - exp_info.flags = O_RDWR | O_CLOEXEC; > + exp_info.flags = (readonly ? O_RDONLY : O_RDWR) | O_CLOEXEC; > > dbuf = dma_buf_export(&exp_info); > if (IS_ERR(dbuf)) {