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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B50C2C4332F for ; Sat, 29 Jan 2022 21:41:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4D9ED6B0087; Sat, 29 Jan 2022 16:41:17 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 488486B0088; Sat, 29 Jan 2022 16:41:17 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 39ED96B0089; Sat, 29 Jan 2022 16:41:17 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0004.hostedemail.com [216.40.44.4]) by kanga.kvack.org (Postfix) with ESMTP id 2CE086B0087 for ; Sat, 29 Jan 2022 16:41:17 -0500 (EST) Received: from smtpin05.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id D8956998BC for ; Sat, 29 Jan 2022 21:41:16 +0000 (UTC) X-FDA: 79084645752.05.5ED6539 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by imf17.hostedemail.com (Postfix) with ESMTP id 92CDA40003 for ; Sat, 29 Jan 2022 21:41:16 +0000 (UTC) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 5D53CB827EE; Sat, 29 Jan 2022 21:41:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C4C2EC340E8; Sat, 29 Jan 2022 21:41:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linux-foundation.org; s=korg; t=1643492475; bh=HcQaM4uHbzU5KF8uZ0eERG7hSGsc2MgWgOfJIJw+SN8=; h=Date:From:To:Subject:In-Reply-To:From; b=p7TRmllIX3WRnElWKRKuTIoPXLu5lvVYgP26VDXNSzQSP1hsRr1x19MUuMQyizY/2 Rtryo8NfWkNqi7WjMeJPeRgHsaiqzz8YF7vxd8xNxbFH47KgpAYyLn4HbuuKjNeMdk 48pGOxOpWEBIgomD7+rj56pwo0a9ml6jNEXHNIBI= Date: Sat, 29 Jan 2022 13:41:14 -0800 From: Andrew Morton To: akpm@linux-foundation.org, andreyknvl@gmail.com, linux-mm@kvack.org, mm-commits@vger.kernel.org, pcc@google.com, peterz@infradead.org, stable@vger.kernel.org, torvalds@linux-foundation.org Subject: [patch 08/12] mm, kasan: use compare-exchange operation to set KASAN page tag Message-ID: <20220129214114.kH5sHZ6C3%akpm@linux-foundation.org> In-Reply-To: <20220129134026.8ccf701012f26eb2c2c269c9@linux-foundation.org> User-Agent: s-nail v14.8.16 X-Stat-Signature: pn5c6d9kippykndyo3cyjs1o61s739pq X-Rspam-User: nil Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=korg header.b=p7TRmllI; spf=pass (imf17.hostedemail.com: domain of akpm@linux-foundation.org designates 145.40.68.75 as permitted sender) smtp.mailfrom=akpm@linux-foundation.org; dmarc=none X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 92CDA40003 X-HE-Tag: 1643492476-46368 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: From: Peter Collingbourne Subject: mm, kasan: use compare-exchange operation to set KASAN page tag It has been reported that the tag setting operation on newly-allocated pages can cause the page flags to be corrupted when performed concurrently with other flag updates as a result of the use of non-atomic operations. Fix the problem by using a compare-exchange loop to update the tag. Link: https://lkml.kernel.org/r/20220120020148.1632253-1-pcc@google.com Link: https://linux-review.googlesource.com/id/I456b24a2b9067d93968d43b4bb3351c0cec63101 Fixes: 2813b9c02962 ("kasan, mm, arm64: tag non slab memory allocated via pagealloc") Signed-off-by: Peter Collingbourne Reviewed-by: Andrey Konovalov Cc: Peter Zijlstra Cc: Signed-off-by: Andrew Morton --- include/linux/mm.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) --- a/include/linux/mm.h~mm-use-compare-exchange-operation-to-set-kasan-page-tag +++ a/include/linux/mm.h @@ -1506,11 +1506,18 @@ static inline u8 page_kasan_tag(const st static inline void page_kasan_tag_set(struct page *page, u8 tag) { - if (kasan_enabled()) { - tag ^= 0xff; - page->flags &= ~(KASAN_TAG_MASK << KASAN_TAG_PGSHIFT); - page->flags |= (tag & KASAN_TAG_MASK) << KASAN_TAG_PGSHIFT; - } + unsigned long old_flags, flags; + + if (!kasan_enabled()) + return; + + tag ^= 0xff; + old_flags = READ_ONCE(page->flags); + do { + flags = old_flags; + flags &= ~(KASAN_TAG_MASK << KASAN_TAG_PGSHIFT); + flags |= (tag & KASAN_TAG_MASK) << KASAN_TAG_PGSHIFT; + } while (unlikely(!try_cmpxchg(&page->flags, &old_flags, flags))); } static inline void page_kasan_tag_reset(struct page *page) _