Received: by 2002:aa6:c429:0:b029:98:93ff:f56f with SMTP id g9csp3390372lkq; Mon, 23 Nov 2020 04:36:38 -0800 (PST) X-Google-Smtp-Source: ABdhPJxlecp0bHXqao2kYn9NqWeL03isv6FiuqyAj8crUREh/SKW8ilqzcv7pL6sSVr1f4+6LlVM X-Received: by 2002:aa7:c904:: with SMTP id b4mr15373680edt.161.1606134998113; Mon, 23 Nov 2020 04:36:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606134998; cv=none; d=google.com; s=arc-20160816; b=lm1rpsyvHO9B+LCoNY4bRP8qKdmPNt533/AJC8xIY8gwb8bF6Gsk4SBr/wbq/ii1Iw z2BCDsUfmHmj1aU0whHWzLmuvxhIFOsq/kCDNkLm+FKg6VTs6d+n0OEsBh5MBSEa2Hv+ 7goBLRXXD6dnCwdYrlOSK+sczyREgURIxFc/lqFmBttK6Ect1+Cr4d3SYA0IKDO5++aN fyfsk3k9xJRP9WSeisOHUAL+cuS15xuowcj76dJVaWOlLVESM8uHYhijF+dOrTySB3hr Quj8/zxuX8Fi/kOpsE1e1eQh3oX4hAO6eWiOevlSNf7/gP0CxvZS7JT7Kg6TAPnvBMB3 Z1fw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=N9xGUiIgmOdeBMWtxy7E+9U0U1/uY+RF2ZZ6lH2Y17o=; b=rE2hL+dxdDwzu3+wdDgZbEujWdZVCOrX0YqAVAZoUmpeJTV+SssenF7B+BS9glZ+k6 rZyAVPDfzs6X2whlfjD1+1gPUFc7LuqOsC2YqUFUR0sWH3m3P/Ux41pg/vU3XtH89L1a fAf/vT0XwDv2P6y6MjaN4FlC77c/jiMOrutMs6uIsWe2zrnZ9SaB7DRAE1mIAOy/ZjYt VBr1F4XXLUdJAMU8QBIg2FeaySNxoGFpip6SedTWrviFsGY51dWHxcct81Bz68hoBfR4 GF1ZVGs5KcnI2gGZn2GAIsaqiueovx8fiSRGUu2Agq1OKlceMOuzN9mECiDxeJNLa1Mh V3BQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=noMXAH0n; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a9si6581190edt.530.2020.11.23.04.36.14; Mon, 23 Nov 2020 04:36:38 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=noMXAH0n; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731213AbgKWMdZ (ORCPT + 99 others); Mon, 23 Nov 2020 07:33:25 -0500 Received: from mail.kernel.org ([198.145.29.99]:44406 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731163AbgKWMdG (ORCPT ); Mon, 23 Nov 2020 07:33:06 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2094F208C3; Mon, 23 Nov 2020 12:33:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1606134785; bh=oqkeIbWPCbIgmY9+bquH2m/ZuvMZuBZj97pZZzTEU4E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=noMXAH0nI/lWbatZwnfNTiC8zJ8EAiyLZwGh1W9sU3C0EHCOWPT2BtSAOy6EPhc/k 69UoJYP9UC13lRfFYBOMYFfkh3rs+4FY9M/3/wwZajGMBIGbJFez2mirbi/budZIt5 WXEvz5Vo/FVvLXUNzWelM8VTjfgTDsk5bq4I3Q78= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Max Filippov Subject: [PATCH 4.19 82/91] xtensa: disable preemption around cache alias management calls Date: Mon, 23 Nov 2020 13:22:42 +0100 Message-Id: <20201123121813.309367717@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201123121809.285416732@linuxfoundation.org> References: <20201123121809.285416732@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Max Filippov commit 3a860d165eb5f4d7cf0bf81ef6a5b5c5e1754422 upstream. Although cache alias management calls set up and tear down TLB entries and fast_second_level_miss is able to restore TLB entry should it be evicted they absolutely cannot preempt each other because they use the same TLBTEMP area for different purposes. Disable preemption around all cache alias management calls to enforce that. Cc: stable@vger.kernel.org Signed-off-by: Max Filippov Signed-off-by: Greg Kroah-Hartman --- arch/xtensa/mm/cache.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) --- a/arch/xtensa/mm/cache.c +++ b/arch/xtensa/mm/cache.c @@ -71,8 +71,10 @@ static inline void kmap_invalidate_coher kvaddr = TLBTEMP_BASE_1 + (page_to_phys(page) & DCACHE_ALIAS_MASK); + preempt_disable(); __invalidate_dcache_page_alias(kvaddr, page_to_phys(page)); + preempt_enable(); } } } @@ -157,6 +159,7 @@ void flush_dcache_page(struct page *page if (!alias && !mapping) return; + preempt_disable(); virt = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK); __flush_invalidate_dcache_page_alias(virt, phys); @@ -167,6 +170,7 @@ void flush_dcache_page(struct page *page if (mapping) __invalidate_icache_page_alias(virt, phys); + preempt_enable(); } /* There shouldn't be an entry in the cache for this page anymore. */ @@ -200,8 +204,10 @@ void local_flush_cache_page(struct vm_ar unsigned long phys = page_to_phys(pfn_to_page(pfn)); unsigned long virt = TLBTEMP_BASE_1 + (address & DCACHE_ALIAS_MASK); + preempt_disable(); __flush_invalidate_dcache_page_alias(virt, phys); __invalidate_icache_page_alias(virt, phys); + preempt_enable(); } EXPORT_SYMBOL(local_flush_cache_page); @@ -228,11 +234,13 @@ update_mmu_cache(struct vm_area_struct * unsigned long phys = page_to_phys(page); unsigned long tmp; + preempt_disable(); tmp = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK); __flush_invalidate_dcache_page_alias(tmp, phys); tmp = TLBTEMP_BASE_1 + (addr & DCACHE_ALIAS_MASK); __flush_invalidate_dcache_page_alias(tmp, phys); __invalidate_icache_page_alias(tmp, phys); + preempt_enable(); clear_bit(PG_arch_1, &page->flags); } @@ -266,7 +274,9 @@ void copy_to_user_page(struct vm_area_st if (alias) { unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK); + preempt_disable(); __flush_invalidate_dcache_page_alias(t, phys); + preempt_enable(); } /* Copy data */ @@ -281,9 +291,11 @@ void copy_to_user_page(struct vm_area_st if (alias) { unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK); + preempt_disable(); __flush_invalidate_dcache_range((unsigned long) dst, len); if ((vma->vm_flags & VM_EXEC) != 0) __invalidate_icache_page_alias(t, phys); + preempt_enable(); } else if ((vma->vm_flags & VM_EXEC) != 0) { __flush_dcache_range((unsigned long)dst,len); @@ -305,7 +317,9 @@ extern void copy_from_user_page(struct v if (alias) { unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK); + preempt_disable(); __flush_invalidate_dcache_page_alias(t, phys); + preempt_enable(); } memcpy(dst, src, len);