From patchwork Thu Jan 20 02:01:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 12718170 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 2F6B9C433EF for ; Thu, 20 Jan 2022 02:02:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4DEF06B0072; Wed, 19 Jan 2022 21:02:03 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 48F046B0073; Wed, 19 Jan 2022 21:02:03 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 356D46B0074; Wed, 19 Jan 2022 21:02:03 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (relay029.a.hostedemail.com [64.99.140.29]) by kanga.kvack.org (Postfix) with ESMTP id 273136B0072 for ; Wed, 19 Jan 2022 21:02:03 -0500 (EST) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id E3ADA222ED for ; Thu, 20 Jan 2022 02:02:02 +0000 (UTC) X-FDA: 79049014884.02.58B4029 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) by imf27.hostedemail.com (Postfix) with ESMTP id 8F5E240026 for ; Thu, 20 Jan 2022 02:02:02 +0000 (UTC) Received: by mail-yb1-f201.google.com with SMTP id k189-20020a25c6c6000000b0061274ece35eso8597317ybf.22 for ; Wed, 19 Jan 2022 18:02:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc; bh=xdUwiaSDktWd6qoicdCm7OxjVqH7uixhadYKrHDPc0M=; b=CB2aleUsk+i4qlNsdDxRBtAYQXwwyLAJicGUOKZQrShQKriQmd9u6zCneI/B61xl27 weBPN7jWK8BTv/dFYfOLwAwzLCkg5DG3IpzAFv8BuI0AidPDiuNWkUvI9KG3wTi9b2Ol Sfsv6tu3VH82Apjf/9g46UshMZxDq741k/fJABlhN/OXvjoHvl4YKg0fyUIotqCfxPbc qJGkz9sN6NaYWitGwy7DWtrqR7oPuWpi2ga9UW8NsJG+tDMsWNLaKDUgcSz6v4PZcNOL DeDA0OYcHAOkSN3SX6zvJSXoUlU1Vn34WyT/9l8oHrKE2QfE+7zI/6ERzuVVa+kJMytY YKCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=xdUwiaSDktWd6qoicdCm7OxjVqH7uixhadYKrHDPc0M=; b=jXS3M/yb2tTZjFUFnXAjiPvRM3c/KpNwv2WCFFdNRNqj9TCuqqj4N6r0Fv0EVUKTRe HiHdDghVRsO7UDTEAMWzURBib0zmf+Kd8ffI4n5ntxahtQneVifQR3Dnob2ELrqWPySJ SMW9TwJV4UNPY+66oNY9bTYc7hBYHw1SZ0UTaEgPsNj6I0P6rQiSSmrCsqQPFIzQFT6N lBNKGUjI7ZFP444Z6hTf/+7z9NRaCwkKMyfNWqhnbEKrqtrxFylFMxplkBRYLWbBoxxV 8fxuDQPZJTov6E/mXMD4rVaqQ9bawtyFrHAdxzn5aTAY3+mRmHc+FT1RuAv88TD01zOz 6C/Q== X-Gm-Message-State: AOAM533YPcjYP4TDHfNvUfohW8c9NdjlzZ4BpI5SYldNAmefnicOQPvY 3Z7yTymuXUF6OwhVw5hYkK3ReWQ= X-Google-Smtp-Source: ABdhPJxUfHuY7ew10sneL3xC7xWml/X6PZfGnYwPRFCi5To3Uz7ontNS6MTD6r4fKgz9R2UXXwpK6ng= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:200:7641:d112:dd90:7ea1]) (user=pcc job=sendgmr) by 2002:a05:6902:154f:: with SMTP id r15mr15749472ybu.242.1642644121821; Wed, 19 Jan 2022 18:02:01 -0800 (PST) Date: Wed, 19 Jan 2022 18:01:48 -0800 Message-Id: <20220120020148.1632253-1-pcc@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.34.1.703.g22d0c6ccf7-goog Subject: [PATCH v3] mm: use compare-exchange operation to set KASAN page tag From: Peter Collingbourne To: Andrey Konovalov , Andrew Morton Cc: Peter Collingbourne , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Peter Zijlstra , stable@vger.kernel.org X-Rspamd-Queue-Id: 8F5E240026 X-Stat-Signature: cwkdui68w8rcskwrzg3texmbdtwgbw91 Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=CB2aleUs; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf27.hostedemail.com: domain of 3mcLoYQMKCNYH448GG8D6.4GEDAFMP-EECN24C.GJ8@flex--pcc.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=3mcLoYQMKCNYH448GG8D6.4GEDAFMP-EECN24C.GJ8@flex--pcc.bounces.google.com X-Rspamd-Server: rspam06 X-HE-Tag: 1642644122-396479 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: 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. Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/I456b24a2b9067d93968d43b4bb3351c0cec63101 Fixes: 2813b9c02962 ("kasan, mm, arm64: tag non slab memory allocated via pagealloc") Cc: stable@vger.kernel.org Reviewed-by: Andrey Konovalov --- v3: - use try_cmpxchg() as suggested by Peter Zijlstra on another patch v2: - use READ_ONCE() include/linux/mm.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index c768a7c81b0b..87473fe52c3f 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1531,11 +1531,18 @@ static inline u8 page_kasan_tag(const struct page *page) 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)