Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3965510pxj; Tue, 11 May 2021 16:24:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxtpVtZ1GFPhQjb8szba9fT23I+4zG8r3F+NNLRmN3MsTxYMGqRK6CO8f3lxqWyo51d/RE7 X-Received: by 2002:a05:6830:410d:: with SMTP id w13mr27765807ott.173.1620775498366; Tue, 11 May 2021 16:24:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620775498; cv=none; d=google.com; s=arc-20160816; b=yk2cwgoaogkI1kQ3Hu/qOVexaQ8H07TXbr+zvgZQ0VmbtgCRgGvc5Dt3wvy+Ck+Qp+ s4ymPrbPPvVRU6t95+6CyYwNzyHHFZ14n1qofPltoe+3eIvsqO2QJ237iTP3yz9P0BkA s8rnmQ/vJOCca3FgZYqnR6CJBUBfE3PywsVhcPPi3g9VsySha5PZ5xrj2Mi7aORaU+Tn C23OUqzfI64LCxK8MOPSBykuEwzgqDRQXE5oU4DSBhsIN2SHNbNGaFpe6sGJfVO3Kmyi 8HWmK46EJI1g3E4V0dXjTmXX5VjUGTPbr2PKYrtFsopu/k/86NGiQIIxIwTQ6BwBMFim 9YCw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=lakBTHiGe1qpKCvD4saPRyJ0c65ZOohMlPhrwiZc13c=; b=clWFS6MpMm8i5G4TJ4YxT4CkcC378Z8wGGtDxDVf+9yD09smZYDcqscZntth5E9fW4 NYtBYaNKCRfv8PZLiJH7IxMV+S3JXZGKUv+GNR2MLv/flnvtFspFKjVA/d4pToRUxKcr ODGi884uiXmgMmCmI648oLMOQmM9PHrEfTWWTWNAT1fJ9w8Kf7ELRWaIjfhFEOXzYGV+ mgnsG9Eh/wsXzwRl3YE2nhLWwiGuPuAnvDrOGsL5WjdFghlgWVGR8SNNWhz1qviAwcK9 jOBZgkOhqxQp1axah8WpkVcVIGk45pfRgCEKVDi6C+PQ2ZPn1pJf8LyD6F0jCttjSo2+ 9bxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=R0Lrq5ex; 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w2si18417244oia.104.2021.05.11.16.24.44; Tue, 11 May 2021 16:24:58 -0700 (PDT) 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=@kernel.org header.s=k20201202 header.b=R0Lrq5ex; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230114AbhEKXZQ (ORCPT + 99 others); Tue, 11 May 2021 19:25:16 -0400 Received: from mail.kernel.org ([198.145.29.99]:52544 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229994AbhEKXZO (ORCPT ); Tue, 11 May 2021 19:25:14 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id EA61E61288; Tue, 11 May 2021 23:24:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620775447; bh=+XXDUQSgM6zd6Dpxi3ONSqy1SgysxRa34Ip60zn8ANg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R0Lrq5exfMbh4R7dlnIi3HGM3iYn2GnRE9GYE83Zfi4oBnUqMgevtS6y+7572pvdt VbKqb8+BwQWEaUmlwjtOgl40/ojKKa0kOccAP23j8ekyiqrsLTT6rVEda8P1wKbevl Wq0qCeZAD7vHe9shGvlu/bmXeWczzKFW1a2n1PZXTkM18MDqItJBQp9CpKO2gatdBb boIxUUF/Kb1P0fRcNo7/qjGQFE8n/06593kQNvy0EdROOpgfs4OE6jhb6BHNAh0I2x lGkH+9Lv85hLOsVCKhdJocT6Lz1bnKCf3sAPlYNTGva96vpcDSTsvgMIYlaAdX8gcQ SaMOO7PMbjsPg== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id 9CB6A5C014E; Tue, 11 May 2021 16:24:06 -0700 (PDT) From: "Paul E. McKenney" To: linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, kernel-team@fb.com, mingo@kernel.org Cc: elver@google.com, andreyknvl@google.com, glider@google.com, dvyukov@google.com, cai@lca.pw, boqun.feng@gmail.com, Mark Rutland , "Paul E . McKenney" Subject: [PATCH tip/core/rcu 02/10] kcsan: Simplify value change detection Date: Tue, 11 May 2021 16:23:53 -0700 Message-Id: <20210511232401.2896217-2-paulmck@kernel.org> X-Mailer: git-send-email 2.31.1.189.g2e36527f23 In-Reply-To: <20210511231149.GA2895263@paulmck-ThinkPad-P17-Gen-1> References: <20210511231149.GA2895263@paulmck-ThinkPad-P17-Gen-1> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mark Rutland In kcsan_setup_watchpoint() we store snapshots of a watched value into a union of u8/u16/u32/u64 sized fields, modify this in place using a consistent field, then later check for any changes via the u64 field. We can achieve the safe effect more simply by always treating the field as a u64, as smaller values will be zero-extended. As the values are zero-extended, we don't need to truncate the access_mask when we apply it, and can always apply the full 64-bit access_mask to the 64-bit value. Finally, we can store the two snapshots and calculated difference separately, which makes the code a little easier to read, and will permit reporting the old/new values in subsequent patches. There should be no functional change as a result of this patch. Signed-off-by: Mark Rutland Signed-off-by: Marco Elver Signed-off-by: Paul E. McKenney --- kernel/kcsan/core.c | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/kernel/kcsan/core.c b/kernel/kcsan/core.c index 45c821d4e8bd..d360183002d6 100644 --- a/kernel/kcsan/core.c +++ b/kernel/kcsan/core.c @@ -407,12 +407,7 @@ kcsan_setup_watchpoint(const volatile void *ptr, size_t size, int type) const bool is_write = (type & KCSAN_ACCESS_WRITE) != 0; const bool is_assert = (type & KCSAN_ACCESS_ASSERT) != 0; atomic_long_t *watchpoint; - union { - u8 _1; - u16 _2; - u32 _4; - u64 _8; - } expect_value; + u64 old, new, diff; unsigned long access_mask; enum kcsan_value_change value_change = KCSAN_VALUE_CHANGE_MAYBE; unsigned long ua_flags = user_access_save(); @@ -468,19 +463,19 @@ kcsan_setup_watchpoint(const volatile void *ptr, size_t size, int type) * Read the current value, to later check and infer a race if the data * was modified via a non-instrumented access, e.g. from a device. */ - expect_value._8 = 0; + old = 0; switch (size) { case 1: - expect_value._1 = READ_ONCE(*(const u8 *)ptr); + old = READ_ONCE(*(const u8 *)ptr); break; case 2: - expect_value._2 = READ_ONCE(*(const u16 *)ptr); + old = READ_ONCE(*(const u16 *)ptr); break; case 4: - expect_value._4 = READ_ONCE(*(const u32 *)ptr); + old = READ_ONCE(*(const u32 *)ptr); break; case 8: - expect_value._8 = READ_ONCE(*(const u64 *)ptr); + old = READ_ONCE(*(const u64 *)ptr); break; default: break; /* ignore; we do not diff the values */ @@ -506,33 +501,30 @@ kcsan_setup_watchpoint(const volatile void *ptr, size_t size, int type) * racy access. */ access_mask = get_ctx()->access_mask; + new = 0; switch (size) { case 1: - expect_value._1 ^= READ_ONCE(*(const u8 *)ptr); - if (access_mask) - expect_value._1 &= (u8)access_mask; + new = READ_ONCE(*(const u8 *)ptr); break; case 2: - expect_value._2 ^= READ_ONCE(*(const u16 *)ptr); - if (access_mask) - expect_value._2 &= (u16)access_mask; + new = READ_ONCE(*(const u16 *)ptr); break; case 4: - expect_value._4 ^= READ_ONCE(*(const u32 *)ptr); - if (access_mask) - expect_value._4 &= (u32)access_mask; + new = READ_ONCE(*(const u32 *)ptr); break; case 8: - expect_value._8 ^= READ_ONCE(*(const u64 *)ptr); - if (access_mask) - expect_value._8 &= (u64)access_mask; + new = READ_ONCE(*(const u64 *)ptr); break; default: break; /* ignore; we do not diff the values */ } + diff = old ^ new; + if (access_mask) + diff &= access_mask; + /* Were we able to observe a value-change? */ - if (expect_value._8 != 0) + if (diff != 0) value_change = KCSAN_VALUE_CHANGE_TRUE; /* Check if this access raced with another. */ -- 2.31.1.189.g2e36527f23