From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A7DA2C88E4D for ; Fri, 11 Sep 2026 19:26:38 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5676510F6FE; Fri, 11 Sep 2026 19:26:38 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="Zxs8J3dl"; dkim-atps=neutral Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7260B10F6F3 for ; Fri, 11 Sep 2026 19:26:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789154797; x=1820690797; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=3s4xKpRvYmteoJZMw9vUWD9OxwMlMcF2ehJvysPZk4Y=; b=Zxs8J3dlugHGHMnTeZC7EmN/ILua0Ulk6ytj2sg0m9CR4uO1AGXwI2fv 5EhX2WEhhRpUhVKnAcxK2xYgLxFIGk57lQxebVGlbsMGzTgdLejGyb1K7 AENpgLJaj+R7Pa7jLiBF09Bnl5DWQUsW0AGk2MoYqB2AdlYtIGLoh2Muh rZuAoJsUWSUb2L8NdDvF5wnKfLypVVxVI7sbQeO8X4QMuSomzoBQ0hErR Mb8T5OCkjTroLC7zO3VkWpPjH+qnOfG+gi1aAbAF2dE5R9Re8RTVnTOtR +TGMrsF9rVb1o1K5dTlZAs2vmLXRW5yqSeAOKAbLXCaZ5PurwtLcfKjub A==; X-CSE-ConnectionGUID: 2iyG7v9vQ6qjOz/UuL4juQ== X-CSE-MsgGUID: 4XSPm8oKTPmwSjQZpGDRlA== X-IronPort-AV: E=McAfee;i="6800,10657,11902"; a="89632926" X-IronPort-AV: E=Sophos;i="6.27,97,1787036400"; d="scan'208";a="89632926" Received: from orviesa007.jf.intel.com ([10.64.159.147]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Sep 2026 12:26:37 -0700 X-CSE-ConnectionGUID: dR+A2rK0QPqRUBF0z66V5Q== X-CSE-MsgGUID: afoCX0BfT2OO7HMDs/ZunQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,97,1787036400"; d="scan'208";a="271975955" Received: from unknown (HELO yadavs-z690i-a-ultra-plus.iind.intel.com) ([10.190.216.90]) by orviesa007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Sep 2026 12:26:35 -0700 From: Sanjay Yadav To: intel-xe@lists.freedesktop.org Cc: matthew.brost@intel.com, Stuart Summers Subject: [PATCH] drm/xe: Don't wedge shared engine on stale faults from torn-down VMs Date: Sat, 12 Sep 2026 00:53:01 +0530 Message-ID: <20260911192300.1561972-2-sanjay.kumar.yadav@intel.com> X-Mailer: git-send-email 2.52.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: intel-xe@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel Xe graphics driver List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-xe-bounces@lists.freedesktop.org Sender: "Intel-xe" A recoverable page fault generated by a process's completed migrate/BCS work can arrive after that process's VM has been closed and its ASID removed (abnormal exit while GPU work was in flight). xe_pagefault_service() returned an error for such faults, which is reported to the GuC/HW as an unsuccessful response. Repeated unsuccessful responses eventually escalate to an engine memory CAT error. Because the migrate/BCS engine is shared, that CAT error wedges it for unrelated processes, which then hang on their own copies. Detect stale faults whose owning VM is closed or whose ASID no longer maps to a fault-capable VM, and drain them instead of replying unsuccessful. Cc: Matthew Brost Cc: Stuart Summers Assisted-by: GitHub Copilot:claude-opus-4.8 Signed-off-by: Sanjay Yadav --- drivers/gpu/drm/xe/xe_pagefault.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_pagefault.c b/drivers/gpu/drm/xe/xe_pagefault.c index c82b8bc8bc70..2827652ab8a3 100644 --- a/drivers/gpu/drm/xe/xe_pagefault.c +++ b/drivers/gpu/drm/xe/xe_pagefault.c @@ -238,8 +238,10 @@ static struct xe_vm *xe_pagefault_asid_to_vm(struct xe_device *xe, u32 asid) vm = xa_load(&xe->usm.asid_to_vm, asid); if (vm && xe_vm_in_fault_mode(vm)) xe_vm_get(vm); - else + else if (vm) vm = ERR_PTR(-EINVAL); + else + vm = ERR_PTR(-ENOENT); up_read(&xe->usm.lock); return vm; @@ -260,13 +262,27 @@ static int xe_pagefault_service(struct xe_pagefault *pf) return -EFAULT; vm = xe_pagefault_asid_to_vm(xe, asid); - if (IS_ERR(vm)) + if (IS_ERR(vm)) { + if (PTR_ERR(vm) == -ENOENT) { + drm_info(&xe->drm, + "xe_pf_debug: drain stale fault (no VM) asid=%u addr=0x%llx\n", + asid, pf->consumer.page_addr); + xe_pagefault_set_start_addr(pf, pf->consumer.page_addr); + xe_pagefault_set_end_addr(pf, pf->consumer.page_addr); + return 0; + } return PTR_ERR(vm); + } down_read(&vm->lock); if (xe_vm_is_closed(vm)) { - err = -ENOENT; + drm_info(&xe->drm, + "xe_pf_debug: drain stale fault (closed VM) asid=%u addr=0x%llx\n", + asid, pf->consumer.page_addr); + xe_pagefault_set_start_addr(pf, pf->consumer.page_addr); + xe_pagefault_set_end_addr(pf, pf->consumer.page_addr); + err = 0; goto unlock_vm; } -- 2.52.0