From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 490C940927D for ; Thu, 30 Jul 2026 11:13:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785410005; cv=none; b=gHAgowYs7f6A85A/yDk89COVQ2Mk+NOSS11NBKPoZocxFjbIpPE+o6XPUVYpz9qR/iu0YGZ1SLOJXImtPwKk1FkTZU5SDAP3lB/QCkN/kxJzeDYbsDetuG9sjIJVZzNh4zfCqPfPE2mdiGjM03Z7k6qUvaE6licZnH9P9FXKRaE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785410005; c=relaxed/simple; bh=Yz19kxDy4hBWPYLGm1MpQ+OTeT4yXf3BHA1EAE6E+aM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mBgfis2IQVV+5HU3TLXChvrXkYd0LVcqrHWk39Sy0ces5SvcB3wgUTaZSpHPwsSYbZ43Jp/l0sBI7lBlgT7Kt8M1lt5yjJpJHJMZsEabOUN/hgnMmi9TWUh1Hszo3Y9tmtU3m2+1UynVm+dJuhZze1DKCTbka7yLo+/X7c7rgGs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=eDBttxaN; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="eDBttxaN" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 940981BCA; Thu, 30 Jul 2026 04:13:18 -0700 (PDT) Received: from e142334-100.cambridge.arm.com (e142334-100.cambridge.arm.com [10.2.198.93]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id ECB6A3F763; Thu, 30 Jul 2026 04:13:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1785410002; bh=Yz19kxDy4hBWPYLGm1MpQ+OTeT4yXf3BHA1EAE6E+aM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eDBttxaNVfbAlEczMtR6/OuatIUJob58ROmHcsoAZGFU3mShxPK2E3zjpexlH/mX8 witwDnE4yp5QTGz+GM4aOUooSAMVRuHCzn9o+fQWuI11fJy4JOV1gS9ZcyckHFEDle FhmGIIiJvnDq6l7wucPPZNxltledxPEyieRr9bFk= From: Muhammad Usama Anjum To: Dimitri Sivanich , Arnd Bergmann , Greg Kroah-Hartman , linux-kernel@vger.kernel.org Cc: Muhammad Usama Anjum Subject: [PATCH 2/3] misc: sgi-gru: remove obsolete atomic fault-handling state Date: Thu, 30 Jul 2026 12:12:51 +0100 Message-ID: <20260730111316.3672672-3-usama.anjum@arm.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260730111316.3672672-1-usama.anjum@arm.com> References: <20260730111316.3672672-1-usama.anjum@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit After interrupt faults are sent directly to user polling mode, only the process-context call path remains. Remove the atomic flag passed through the fault-handling interfaces and the related dead code. No functional change. Signed-off-by: Muhammad Usama Anjum --- Only build tested. --- drivers/misc/sgi-gru/grufault.c | 68 +++++++++++++-------------------- 1 file changed, 26 insertions(+), 42 deletions(-) diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index 5a87c12f444a3..e43fdea01cb6f 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c @@ -31,7 +31,6 @@ /* Return codes for vtop functions */ #define VTOP_SUCCESS 0 #define VTOP_INVALID -1 -#define VTOP_RETRY -2 /* @@ -188,7 +187,7 @@ static int non_atomic_pte_lookup(struct vm_area_struct *vma, } static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr, - int write, int atomic, unsigned long *gpa, int *pageshift) + int write, unsigned long *gpa, int *pageshift) { struct mm_struct *mm = gts->ts_mm; struct vm_area_struct *vma; @@ -199,9 +198,6 @@ static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr, if (!vma) goto inval; - if (atomic) - goto upm; - /* Order the caller's ms_range_active check before loading PTEs. */ rmb(); if (non_atomic_pte_lookup(vma, vaddr, write, &paddr, &ps)) @@ -215,8 +211,6 @@ static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr, inval: return VTOP_INVALID; -upm: - return VTOP_RETRY; } @@ -240,7 +234,7 @@ static void gru_flush_cache_cbe(struct gru_control_block_extended *cbe) * the end of the bcopy tranfer, whichever is smaller. */ static void gru_preload_tlb(struct gru_state *gru, - struct gru_thread_state *gts, int atomic, + struct gru_thread_state *gts, unsigned long fault_vaddr, int asid, int write, unsigned char tlb_preload_count, struct gru_tlb_fault_handle *tfh, @@ -262,13 +256,13 @@ static void gru_preload_tlb(struct gru_state *gru, vaddr = min(vaddr, fault_vaddr + tlb_preload_count * PAGE_SIZE); while (vaddr > fault_vaddr) { - ret = gru_vtop(gts, vaddr, write, atomic, &gpa, &pageshift); + ret = gru_vtop(gts, vaddr, write, &gpa, &pageshift); if (ret || tfh_write_only(tfh, gpa, GAA_RAM, vaddr, asid, write, GRU_PAGESIZE(pageshift))) return; gru_dbg(grudev, - "%s: gid %d, gts 0x%p, tfh 0x%p, vaddr 0x%lx, asid 0x%x, rw %d, ps %d, gpa 0x%lx\n", - atomic ? "atomic" : "non-atomic", gru->gs_gid, gts, tfh, + "gid %d, gts 0x%p, tfh 0x%p, vaddr 0x%lx, asid 0x%x, rw %d, ps %d, gpa 0x%lx\n", + gru->gs_gid, gts, tfh, vaddr, asid, write, pageshift, gpa); vaddr -= PAGE_SIZE; STAT(tlb_preload_page); @@ -276,13 +270,13 @@ static void gru_preload_tlb(struct gru_state *gru, } /* - * Drop a TLB entry into the GRU. The fault is described by info in an TFH. - * Input: - * cb Address of user CBR. Null if not running in user context - * Return: - * 0 = dropin, exception, or switch to UPM successful - * 1 = range invalidate active - * < 0 = error code + * Drop a TLB entry into the GRU. The fault is described by info in a TFH. + * Input: + * cbk Address of the user CBR + * Return: + * 0 = dropin, exception, or switch to UPM successful + * 1 = retry required + * < 0 = error code * */ static int gru_try_dropin(struct gru_state *gru, @@ -292,7 +286,7 @@ static int gru_try_dropin(struct gru_state *gru, { struct gru_control_block_extended *cbe = NULL; unsigned char tlb_preload_count = gts->ts_tlb_preload_count; - int pageshift = 0, asid, write, ret, atomic = !cbk, indexway; + int pageshift = 0, asid, write, ret, indexway; unsigned long gpa = 0, vaddr = 0; /* @@ -324,7 +318,7 @@ static int gru_try_dropin(struct gru_state *gru, } if (tfh->state == TFHSTATE_IDLE) goto failidle; - if (tfh->state == TFHSTATE_MISS_FMM && cbk) + if (tfh->state == TFHSTATE_MISS_FMM) goto failfmm; write = (tfh->cause & TFHCAUSE_TLB_MOD) != 0; @@ -343,22 +337,20 @@ static int gru_try_dropin(struct gru_state *gru, if (atomic_read(>s->ts_gms->ms_range_active)) goto failactive; - ret = gru_vtop(gts, vaddr, write, atomic, &gpa, &pageshift); + ret = gru_vtop(gts, vaddr, write, &gpa, &pageshift); if (ret == VTOP_INVALID) goto failinval; - if (ret == VTOP_RETRY) - goto failupm; if (!(gts->ts_sizeavail & GRU_SIZEAVAIL(pageshift))) { gts->ts_sizeavail |= GRU_SIZEAVAIL(pageshift); - if (atomic || !gru_update_cch(gts)) { + if (!gru_update_cch(gts)) { gts->ts_force_cch_reload = 1; goto failupm; } } if (unlikely(cbe) && pageshift == PAGE_SHIFT) { - gru_preload_tlb(gru, gts, atomic, vaddr, asid, write, tlb_preload_count, tfh, cbe); + gru_preload_tlb(gru, gts, vaddr, asid, write, tlb_preload_count, tfh, cbe); gru_flush_cache_cbe(cbe); } @@ -367,9 +359,9 @@ static int gru_try_dropin(struct gru_state *gru, tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write, GRU_PAGESIZE(pageshift)); gru_dbg(grudev, - "%s: gid %d, gts 0x%p, tfh 0x%p, vaddr 0x%lx, asid 0x%x, indexway 0x%x," + "gid %d, gts 0x%p, tfh 0x%p, vaddr 0x%lx, asid 0x%x, indexway 0x%x," " rw %d, ps %d, gpa 0x%lx\n", - atomic ? "atomic" : "non-atomic", gru->gs_gid, gts, tfh, vaddr, asid, + gru->gs_gid, gts, tfh, vaddr, asid, indexway, write, pageshift, gpa); STAT(tlb_dropin); return 0; @@ -378,15 +370,12 @@ static int gru_try_dropin(struct gru_state *gru, /* No asid (delayed unload). */ STAT(tlb_dropin_fail_no_asid); gru_dbg(grudev, "FAILED no_asid tfh: 0x%p, vaddr 0x%lx\n", tfh, vaddr); - if (!cbk) - tfh_user_polling_mode(tfh); - else - gru_flush_cache(tfh); + gru_flush_cache(tfh); gru_flush_cache_cbe(cbe); return -EAGAIN; failupm: - /* Atomic failure switch CBR to UPM */ + /* CCH update failure switches the CBR back to UPM. */ tfh_user_polling_mode(tfh); gru_flush_cache_cbe(cbe); STAT(tlb_dropin_fail_upm); @@ -405,8 +394,7 @@ static int gru_try_dropin(struct gru_state *gru, /* TFH status did not show exception pending */ gru_flush_cache(tfh); gru_flush_cache_cbe(cbe); - if (cbk) - gru_flush_cache(cbk); + gru_flush_cache(cbk); STAT(tlb_dropin_fail_no_exception); gru_dbg(grudev, "FAILED non-exception tfh: 0x%p, status %d, state %d\n", tfh, tfh->status, tfh->state); @@ -416,14 +404,13 @@ static int gru_try_dropin(struct gru_state *gru, /* TFH state was idle - no miss pending */ gru_flush_cache(tfh); gru_flush_cache_cbe(cbe); - if (cbk) - gru_flush_cache(cbk); + gru_flush_cache(cbk); STAT(tlb_dropin_fail_idle); gru_dbg(grudev, "FAILED idle tfh: 0x%p, state %d\n", tfh, tfh->state); return 0; failinval: - /* All errors (atomic & non-atomic) switch CBR to EXCEPTION state */ + /* Invalid translations switch the CBR to EXCEPTION state. */ tfh_exception(tfh); gru_flush_cache_cbe(cbe); STAT(tlb_dropin_fail_invalid); @@ -431,11 +418,8 @@ static int gru_try_dropin(struct gru_state *gru, return -EFAULT; failactive: - /* Range invalidate active. Switch to UPM iff atomic */ - if (!cbk) - tfh_user_polling_mode(tfh); - else - gru_flush_cache(tfh); + /* Retry after the active range invalidation completes. */ + gru_flush_cache(tfh); gru_flush_cache_cbe(cbe); STAT(tlb_dropin_fail_range_active); gru_dbg(grudev, "FAILED range active: tfh 0x%p, vaddr 0x%lx\n", -- 2.47.3