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 7C1982727FD; Tue, 11 Nov 2025 01:09:17 +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=1762823357; cv=none; b=K+V52j92e1M1rdhAw1lqG0xm2Gjc26FlBjeHCdq46EsNuW1Vx05ozvhX7tIAFjVh3Gs2GDHdTwSGhGvPDc9CSIDLkxQ2fgwOiDmjc8FZIidi5YGOtKuhF0Sl94VEEIhp98fOqiHUtvURJxl8a2HJ+4B3K1A4ozZ3xjv1wcRYUAk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762823357; c=relaxed/simple; bh=dEsadJjc02qVhZZcptcDA3v2fc687BoS06g4c8tgRsw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iLFsb9gzs5kSc8gY9xYfHNDyj5Wpz71orMqzrpmOX/746zX0TvSf/wn0IInigAVIaxH5TuoG3k2crzBw1PE5X7BE4YRq0ecyS4/hauZpsctMqOvmlhHZiFdiuOh4C25JF2xoKOCDUIRbPDGK7Cb53bnSpkzhTtG+kK3Fe/xhF1g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b=izrIBZS/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b="izrIBZS/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1C41EC116B1; Tue, 11 Nov 2025 01:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1762823357; bh=dEsadJjc02qVhZZcptcDA3v2fc687BoS06g4c8tgRsw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=izrIBZS/C0awsQ0CQSgRvDxqNSiKRcU070IXUFpp73carwDHxd5XEvqWUWYd59i6S 7aKrZCA7anbeSq7QvBHC3NlZPZfr9I+KU+WAfrZHbajNO7Y/OyrrAAyRC40v9wzhh5 wyl2A+ghxeXXim0sOJoNZVYCb1HTUFm6wycfFMxs= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, Kent Russell , Felix Kuehling , Alex Deucher , Sasha Levin Subject: [PATCH 6.12 226/565] drm/amdkfd: Handle lack of READ permissions in SVM mapping Date: Tue, 11 Nov 2025 09:41:22 +0900 Message-ID: <20251111004532.003153260@linuxfoundation.org> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251111004526.816196597@linuxfoundation.org> References: <20251111004526.816196597@linuxfoundation.org> User-Agent: quilt/0.69 X-stable: review X-Patchwork-Hint: ignore Precedence: bulk X-Mailing-List: patches@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 6.12-stable review patch. If anyone has any objections, please let me know. ------------------ From: Kent Russell [ Upstream commit 0ed704d058cec7643a716a21888d58c7d03f2c3e ] HMM assumes that pages have READ permissions by default. Inside svm_range_validate_and_map, we add READ permissions then add WRITE permissions if the VMA isn't read-only. This will conflict with regions that only have PROT_WRITE or have PROT_NONE. When that happens, svm_range_restore_work will continue to retry, silently, giving the impression of a hang if pr_debug isn't enabled to show the retries.. If pages don't have READ permissions, simply unmap them and continue. If they weren't mapped in the first place, this would be a no-op. Since x86 doesn't support write-only, and PROT_NONE doesn't allow reads or writes anyways, this will allow the svm range validation to continue without getting stuck in a loop forever on mappings we can't use with HMM. Signed-off-by: Kent Russell Reviewed-by: Felix Kuehling Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c index a8d4b3a3e77af..155948dc3d07a 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c @@ -1704,6 +1704,29 @@ static int svm_range_validate_and_map(struct mm_struct *mm, next = min(vma->vm_end, end); npages = (next - addr) >> PAGE_SHIFT; + /* HMM requires at least READ permissions. If provided with PROT_NONE, + * unmap the memory. If it's not already mapped, this is a no-op + * If PROT_WRITE is provided without READ, warn first then unmap + */ + if (!(vma->vm_flags & VM_READ)) { + unsigned long e, s; + + svm_range_lock(prange); + if (vma->vm_flags & VM_WRITE) + pr_debug("VM_WRITE without VM_READ is not supported"); + s = max(start, prange->start); + e = min(end, prange->last); + if (e >= s) + r = svm_range_unmap_from_gpus(prange, s, e, + KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU); + svm_range_unlock(prange); + /* If unmap returns non-zero, we'll bail on the next for loop + * iteration, so just leave r and continue + */ + addr = next; + continue; + } + WRITE_ONCE(p->svms.faulting_task, current); r = amdgpu_hmm_range_get_pages(&prange->notifier, addr, npages, readonly, owner, NULL, -- 2.51.0