Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp728236pxb; Fri, 14 Jan 2022 15:09:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJzYbqM7L2yKoKcOwvo+rflemo1Qp0KWmKQJNMQa2l+gos+lwT4sk7+JVy9KRvBQN3SeQ3Kj X-Received: by 2002:a17:902:e8c2:b0:149:fdf8:270 with SMTP id v2-20020a170902e8c200b00149fdf80270mr11678906plg.167.1642201742706; Fri, 14 Jan 2022 15:09:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642201742; cv=none; d=google.com; s=arc-20160816; b=QLu7InNxl1LGCmXOG8EYlxaysModkV8ze0Lb5QepQkb65clMmoDtmxl5kVOWrNG4Kx oIYosN9N9AMUYlgQ7KNc/lCYM9K0Bl0o6PfQTGAJaI4yFLrlUbbYAHMQwT4G/B0A0hrW SknZneniLw9hp+mQKz5Z2uJ1IA00xgGRoK1uV5D+yBnfSo3Djcbkc0gV1ZWu7x+KuR2E 2F8a+nfteLN3hvRERBn0YGmhM6ALAbkK7EXLUPUXvXeMwqPdjob8Pnww2MzckLINHwpE zM6a9km0T9Af8kcjrJRmZ5waRAd6ONMJSfvaDfBwx3a+/jREgFYE2Qq95I3LI7SVZOOR pMvg== 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=gmfAhubjEyaVBPWv1g0ex2hEpije68c3WmxI7HlJuIk=; b=FrnylJpmc1X9gdPSCjeIaApTFGs+vMLUe7HatENfbZ7cryYmjCxTdm1PBhcBi7prve GGazd5hXs/oSOYfJ/UgwseyMCYZRyM0rSFqTloW01YUh0BGBYn3xCFLpJLRlVHQtD+fc J2qLbCuCb2JuE8RFNtryI7baa/SVR3os55zgogNeDGm/2xaDZITCqNDHqbriFGMhQ5DF dcA1z8LCLQywZwKyn9DdaOaTKcokuHK4eAbBQ6PAadmcUsuemY8NTbNFPpzd9ojASj73 blFogHJvkLR6ZaSotPOXnaGNudvdnc1V12Iyz5hGew/XmVD4GAc3wUqr1K66VNGGEJL3 gl1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=QnmdCE3N; 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 e11si2097951plc.40.2022.01.14.15.08.51; Fri, 14 Jan 2022 15:09:02 -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=QnmdCE3N; 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 S230041AbiANV65 (ORCPT + 99 others); Fri, 14 Jan 2022 16:58:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40854 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229980AbiANV64 (ORCPT ); Fri, 14 Jan 2022 16:58:56 -0500 Received: from mail-il1-x12b.google.com (mail-il1-x12b.google.com [IPv6:2607:f8b0:4864:20::12b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9F459C061574; Fri, 14 Jan 2022 13:58:56 -0800 (PST) Received: by mail-il1-x12b.google.com with SMTP id h30so9478519ila.12; Fri, 14 Jan 2022 13:58:56 -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=gmfAhubjEyaVBPWv1g0ex2hEpije68c3WmxI7HlJuIk=; b=QnmdCE3NJISxA+/1AWG4v/lMA6X1fAvApupya0G6ju2+yMwnUKhXgkISyblOky7wCH Iawa8V9VAsNgx7S12bZLNY6lIb2W7w9QALKSGmIeeDreHrmlrikiu3u5BRvdhqJ/6/Jo 9xXq6H4H1OaymlUbwKpuC0Ak27BK0BjWEQNSuOnL4s0wNNsAVbkErr42oLIC4obma8EK SD+CzfoXgDV6Ckt2IPEvXWoMtxq/tE/IfTBCZM+JeocTf7KLSeXDK1GCPWowiCK9HmyK 4HeERsvOmOvdEmNj2k2Tz2D3aXW35vtBPVw0DbFiTyBWSR018gqvECgwFQa9qLjl9bx7 NEMw== 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=gmfAhubjEyaVBPWv1g0ex2hEpije68c3WmxI7HlJuIk=; b=ESNX34cPkRJ9r300RgCIz28xpuKjbaJKIQvd/h8HqM4/nCFd7pvIDG/GFZXnQeMomm hXQPSQFxPpUdnRCrU67ejJmane9CK9MmK1l4J7YjUtGhfe4ndJoHJp1a9T/LX7UH1rTP KXxgHsuxTJN9DtVsvlZfk3u1jfIabfDa3BZKQJU178/xgO/7x07R7E1stzynLIjeTXUN upHmQhoA3OcFx0dSF4kxj3VmDkbNFFjs5ud0autA2iULOK1bFlo7HYXdmR+mv8aKh6Kd ImGHGZ3Du8XPWZea0lNv3o/S7CU2D5d1I+8/Hh34fF82RIdrDB88/vrT2b6hZfWD8cvk bwSA== X-Gm-Message-State: AOAM531/Qq/MAt/B6wZXTZQo4I2z6BiNVf6O+Ulr0MDHgwjQrC2kjjSW 4EJHMjzWmjHV7Yz5h8xuo/iFNhu2SbHFXAETv5M= X-Received: by 2002:a92:1e0a:: with SMTP id e10mr5942316ile.28.1642197535952; Fri, 14 Jan 2022 13:58:55 -0800 (PST) MIME-Version: 1.0 References: <20220113031434.464992-1-pcc@google.com> In-Reply-To: <20220113031434.464992-1-pcc@google.com> From: Andrey Konovalov Date: Sat, 15 Jan 2022 00:58:44 +0300 Message-ID: Subject: Re: [PATCH] mm: use compare-exchange operation to set KASAN page tag To: Peter Collingbourne Cc: Andrew Morton , Linux Memory Management List , LKML , 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 13, 2022 at 6:14 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. Is it know how exactly this race happens? Why are flags for a newly allocated page being accessed concurrently? > 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 > --- > include/linux/mm.h | 16 +++++++++++----- > 1 file changed, 11 insertions(+), 5 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index c768a7c81b0b..b544b0a9f537 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1531,11 +1531,17 @@ 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; > + do { > + old_flags = flags = page->flags; I guess this should be at least READ_ONCE(page->flags) if we care about concurrency. > + flags &= ~(KASAN_TAG_MASK << KASAN_TAG_PGSHIFT); > + flags |= (tag & KASAN_TAG_MASK) << KASAN_TAG_PGSHIFT; > + } while (unlikely(cmpxchg(&page->flags, old_flags, flags) != old_flags)); > } > > static inline void page_kasan_tag_reset(struct page *page) > -- > 2.34.1.575.g55b058a8bb-goog >