Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp3537191pxb; Mon, 24 Jan 2022 11:41:13 -0800 (PST) X-Google-Smtp-Source: ABdhPJxN9RbGJX1qw/iHVQUQ3/8uYpDQKrtNK06cmdDXd52ggKf60p8XnwaQv7k3s6WMIO1Rown4 X-Received: by 2002:a17:902:7c93:b0:14a:ec87:5044 with SMTP id y19-20020a1709027c9300b0014aec875044mr15677789pll.31.1643053273315; Mon, 24 Jan 2022 11:41:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643053273; cv=none; d=google.com; s=arc-20160816; b=GKy/7SjLY07qdaycRVV1LqYqhccPQCtthIBg1XBswAcxZh9Vr7Xs8LqwM2mCj2y8yD +8IrQHXXtikmNQqkh6KbewlA5zIL5zMRRA5WpIekjzwhmBc+I9usgUF6cq3NYz4yZ4Yh QMXHLBNBQt+CJSDTBPCjmLHFCgJOEITJLoeHbTdqDh5qmby7nMvhKwL18MKlHl3irKI3 nmF4fHake3BN/F5Sj77BO3z9hKldvkWaMZMTUAV1MHU3q/W266a/r3FV17IdA/OIXwf/ eevXmzQTH1QzUSkyxLhc+MZcvqCWHEgu3w7MKdiCDa0Xb8dObNtgsKt8wg8FQxIZszg8 0Khg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=E8MQ4czb3ly2s0ZsHOR2X1HdMa1yeCdwsrvL3BnehgA=; b=VX7ttu7COZworaHo/9wVKQ2S4BDMmHCbikOwChzIihWQVAoHmUpblxxFkgcP8VKofr NbDS8qhfeS5joBk1t2tIKKrkmkm/nBTft3/HNGzffqb+xl0PYZHoxIdBNSdBXg6Zk1LH uhNr+xIyuMRqHQg+M2ntj5fOdNImlzbBweii4wgGo1KHh8PoaalECkEH2n8mlTCR4u+8 wRAcQNSDvwEPtb4109jQxCs2KgTJ2ZMhU0y+gd1PKGlv5Uag4exV+0ELmK3I/JeR4dCN ODfTshymuCxNVmKp2l1OYtlniOykqUdpWtNkee9KhKvMHXuPP4W1QiqnqI5aoUwjhEB8 RFig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=Wg2tUc+O; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m22si12279048pls.581.2022.01.24.11.41.00; Mon, 24 Jan 2022 11:41:13 -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=@gmail.com header.s=20210112 header.b=Wg2tUc+O; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244461AbiAXRWz (ORCPT + 99 others); Mon, 24 Jan 2022 12:22:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50194 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244445AbiAXRWy (ORCPT ); Mon, 24 Jan 2022 12:22:54 -0500 Received: from mail-io1-xd32.google.com (mail-io1-xd32.google.com [IPv6:2607:f8b0:4864:20::d32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 19DA7C06173B; Mon, 24 Jan 2022 09:22:54 -0800 (PST) Received: by mail-io1-xd32.google.com with SMTP id v6so20379838iom.6; Mon, 24 Jan 2022 09:22:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=E8MQ4czb3ly2s0ZsHOR2X1HdMa1yeCdwsrvL3BnehgA=; b=Wg2tUc+O43y+Z/MoAaE+dIs/RaMYZg3sY5Qr5LVg3GlCgc4PYr2PKS5NFnGiQjW4/E Xg/e0p94De6lky+3hq+TVAtuI2D+mKpdkNvAAECOKSakxmY9LtOjYTMczIv9I47a0LC1 HBjDdJc9vbqBUHUHY0DR75+K4I2j5K8eQpslOyIm1nTgTPcbtMj3NKddE4Wls/j+tgOA O8fIaLFeiXmzv4zKTd3GC1nagNriRzRL+urBT1QGxlw1swAIdBycI78zgT9zB5N1TvLn zmV0n3bSt1HC3AK81NOMCBIbYQ515Gh8IGvP1mqVXHCuT1K2x1pnh1a63Tub/P8o1R/I 87wQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=E8MQ4czb3ly2s0ZsHOR2X1HdMa1yeCdwsrvL3BnehgA=; b=N9jSq/+ZLoFnKZQspHm7O6uVybtOu4DRTHiXeL35cK93/0RxCIsGqZczEqpcr1eP2F dFWHDgJ4xpC+i0togHMp1ISR1404poS2COt9urjwlixNMZXTs5wDwRt+/qY8KadFf/xP SNq2p6h9l6NWb09THfh6X7gzvxA6lycy8gklDj7CqmJ+uHf3KAs4zsaxi3RrVfCMV60p ko88wDe6C8tTkDjQbqj5rmhhuH3SgwZygmWLaXmMLS/a1wcp8314d+8QaiPVzUOn73TV 4vI4VYxshxCCvBotxc4UbLlbR5oiwc9fde1kc33AADR1e+WaLReqwA896lsXd6fH9Zya NLRg== X-Gm-Message-State: AOAM5304ehYKzqhFCymlChTVQ7SsQRFC8DkYI7O/cUraceUoriXpbRvM 5yZ96aRC+9gWVspzYT9CmcMGTww+i+AjYKyoinpXxSIbyKk= X-Received: by 2002:a02:b382:: with SMTP id p2mr7731338jan.71.1643044973568; Mon, 24 Jan 2022 09:22:53 -0800 (PST) MIME-Version: 1.0 References: <20220120020148.1632253-1-pcc@google.com> In-Reply-To: <20220120020148.1632253-1-pcc@google.com> From: Andrey Konovalov Date: Mon, 24 Jan 2022 18:22:42 +0100 Message-ID: Subject: Re: [PATCH v3] mm: use compare-exchange operation to set KASAN page tag To: Peter Collingbourne Cc: Andrew Morton , Linux Memory Management List , LKML , Peter Zijlstra , stable@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jan 20, 2022 at 3:02 AM Peter Collingbourne wrote: > > 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 > --- > 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) > -- > 2.34.1.703.g22d0c6ccf7-goog > Reviewed-by: Andrey Konovalov FWIW, try_cmpxchg() doesn't seem to be doing annotated atomic accesses when accessing old_flags, so using READ_ONCE() in page_kasan_tag_set() seems pointless after all.