Received: by 2002:a17:90b:8d0:0:0:0:0 with SMTP id ds16csp207865pjb; Thu, 16 Jul 2020 12:02:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxE1sRAxzF76xPu5NDgBbYVN4Jv5woem1J+uOoTl66cVsTHoKCOXzwDe8n1igBJkSaQ1aEs X-Received: by 2002:a17:906:27c9:: with SMTP id k9mr5014529ejc.74.1594926177762; Thu, 16 Jul 2020 12:02:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594926177; cv=none; d=google.com; s=arc-20160816; b=XoWyo5l50wiLx0jhrFvFflwWgsOKXvN/Ocv0iqFouBVPCNkNtcQ086jkAI6EeOue6l Tp8tyqahRqWyxjaQ8IOy/Fv72aaN00w39zW1JKyzwhwZGiMlg7fH1U9/8hwLH8+0aJl2 OiZ5hOCDGDqVz/hIsc3dw2H2oJAMiYpmxy9IC4jxf3VHbmYt8O6L8MeaVBPg4Y8sAxi9 toggaSG0dZIkWmBMGe4yVAtUBbq8gM/DY5Fz/C1k7z73Yphf1AqDGLjLZkG/5XytyeQG FcgfzIdnyK6gkaOD0FS78QJaKzUCf9SqStH0L2Q1cAaNQmHq90bq+MHMO0z+ppWep4// LF5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:to:from:cc:in-reply-to:subject:date:dkim-signature; bh=JfJefRWjeb9DH1MrBUsvBscaMgupvBInX+3elN90M+E=; b=X6amewj0BCBLJjtVZ7xwRa21+FO4Ybn41dThQKbG8JbgW+AhYOjTN1m79QG/z8JAgJ 7UCLgnnYxE+v61Ma3DOIlZLsAPCbtsUtVpktdRGdnApkndj2Dd5JrOBIzmQ3Ue2lX5pq X/v8ZvQAcI8tXUWqvWnNF2piiLtN2OMcBL2War3I5xIgtmDJU8AIjA7ny0KdA3k5X8Bp cNScfduUy06fvCWCqHTHjQgML/JHTRuLUGFPHi386RrOI4/VqLkXINyBvcHpDs/SfLYL BWzN68y34EM/uCAgCnVRf++WT9babPQb9ABDRdyCS0fMFfWtLT2TbEkKFVutv4VlgKgh sWlA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@dabbelt-com.20150623.gappssmtp.com header.s=20150623 header.b=KnSzidzo; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 1si3729412ejo.509.2020.07.16.12.02.33; Thu, 16 Jul 2020 12:02:57 -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=@dabbelt-com.20150623.gappssmtp.com header.s=20150623 header.b=KnSzidzo; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729357AbgGPTAE (ORCPT + 99 others); Thu, 16 Jul 2020 15:00:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33058 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728907AbgGPTAD (ORCPT ); Thu, 16 Jul 2020 15:00:03 -0400 Received: from mail-pl1-x642.google.com (mail-pl1-x642.google.com [IPv6:2607:f8b0:4864:20::642]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8691EC08C5C0 for ; Thu, 16 Jul 2020 12:00:03 -0700 (PDT) Received: by mail-pl1-x642.google.com with SMTP id x9so4274267plr.2 for ; Thu, 16 Jul 2020 12:00:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dabbelt-com.20150623.gappssmtp.com; s=20150623; h=date:subject:in-reply-to:cc:from:to:message-id:mime-version :content-transfer-encoding; bh=JfJefRWjeb9DH1MrBUsvBscaMgupvBInX+3elN90M+E=; b=KnSzidzo66xdykVg2SLxktyn55MXR0V55tGOU4DaExdIhtIt3GeqanAb1iKPf9R7KE +2piaCrkav87qgcni5NLFfUDAKLxjdaJPx9WQJnAac+UYP6ESjs+6B8huzoSkq4mC2T3 VUWb5deEwYeyRTHXqAK/Q+wDPKoivdAzPEnDP7MKYsI3tXH/rNF7N7r2+6M5zLpI5Ukp fnmBHBu9jGkYkc4McRpEiI3ISoIIvnA4QXAd8EFuUQROxCThFFTJaW2nb3DticgpBMGI qUkxoJJzHo097Q195B3t4fK4L83tbp2rQ3/Y5v0+xqURCSyJBlaw35OFl2xfIKTKYpzI W3bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:subject:in-reply-to:cc:from:to:message-id :mime-version:content-transfer-encoding; bh=JfJefRWjeb9DH1MrBUsvBscaMgupvBInX+3elN90M+E=; b=EGk6MZd3ZvsnwII889sBeuXMB64x0mofX6ANAj/EtbLOsCGmw9WKxmVD84KD+lwilu xPUcmZzWwbQpHstBDD8K0sYH2IvNQ1Eo2WfRNQjEIgAldWtKj4KKDBbbH/7rq5454MuD NdYHD/atzPf7pB6cn/r8Z5QEEA2qFNgtacO7kVvaFQP5SAVa1QCKrzRrOxF4Q+hJcdyM BS6fkUih5GedUsmDYr7fTqDzfkTseoz4kwHMzsy5rcZXsrI11nYTb9wREJS4p3I0XpOy 7WAUsZEpSpVr34x+WnWG69qxWwBzCKgFhvF+rgHDRVXXOJUoowxyydmBDsIWXN8q3DLV GGRg== X-Gm-Message-State: AOAM5330HibaoC+JlIJBwCX8VVzpJTYk5cyrOXsYiJ+fZRWZRL5He0Jg 7ZKd+hnCXoei1ma9L2pKdUlNeTxGXMI= X-Received: by 2002:a17:902:8697:: with SMTP id g23mr4595359plo.94.1594926002609; Thu, 16 Jul 2020 12:00:02 -0700 (PDT) Received: from localhost (76-210-143-223.lightspeed.sntcca.sbcglobal.net. [76.210.143.223]) by smtp.gmail.com with ESMTPSA id u73sm5753263pfc.113.2020.07.16.12.00.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Jul 2020 12:00:01 -0700 (PDT) Date: Thu, 16 Jul 2020 12:00:01 -0700 (PDT) X-Google-Original-Date: Thu, 16 Jul 2020 11:59:58 PDT (-0700) Subject: Re: [PATCH] asm-generic/mmiowb: Allow mmiowb_set_pending() when preemptible() In-Reply-To: <20200716112816.7356-1-will@kernel.org> CC: linux-kernel@vger.kernel.org, kernel-team@android.com, linux-riscv@lists.infradead.org, linux-arch@vger.kernel.org, will@kernel.org, Arnd Bergmann , Paul Walmsley , guoren@kernel.org, mpe@ellerman.id.au From: Palmer Dabbelt To: will@kernel.org Message-ID: Mime-Version: 1.0 (MHng) Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 16 Jul 2020 04:28:16 PDT (-0700), will@kernel.org wrote: > Although mmiowb() is concerned only with serialising MMIO writes occuring > in contexts where a spinlock is held, the call to mmiowb_set_pending() > from the MMIO write accessors can occur in preemptible contexts, such > as during driver probe() functions where ordering between CPUs is not > usually a concern, assuming that the task migration path provides the > necessary ordering guarantees. > > Unfortunately, the default implementation of mmiowb_set_pending() is not > preempt-safe, as it makes use of a a per-cpu variable to track its > internal state. This has been reported to generate the following splat > on riscv: > > | BUG: using smp_processor_id() in preemptible [00000000] code: swapper/0/1 > | caller is regmap_mmio_write32le+0x1c/0x46 > | CPU: 3 PID: 1 Comm: swapper/0 Not tainted 5.8.0-rc3-hfu+ #1 > | Call Trace: > | walk_stackframe+0x0/0x7a > | dump_stack+0x6e/0x88 > | regmap_mmio_write32le+0x18/0x46 > | check_preemption_disabled+0xa4/0xaa > | regmap_mmio_write32le+0x18/0x46 > | regmap_mmio_write+0x26/0x44 > | regmap_write+0x28/0x48 > | sifive_gpio_probe+0xc0/0x1da > > Although it's possible to fix the driver in this case, other splats have > been seen from other drivers, including the infamous 8250 UART, and so > it's better to address this problem in the mmiowb core itself. > > Fix mmiowb_set_pending() by using the raw_cpu_ptr() to get at the mmiowb > state and then only updating the 'mmiowb_pending' field if we are not > preemptible (i.e. we have a non-zero nesting count). > > Cc: Arnd Bergmann > Cc: Paul Walmsley > Cc: Guo Ren > Cc: Michael Ellerman > Reported-by: Palmer Dabbelt > Signed-off-by: Will Deacon > --- > > I can queue this in the arm64 tree as a fix, as I already have some other > fixes targetting -rc6. > > include/asm-generic/mmiowb.h | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/include/asm-generic/mmiowb.h b/include/asm-generic/mmiowb.h > index 9439ff037b2d..5698fca3bf56 100644 > --- a/include/asm-generic/mmiowb.h > +++ b/include/asm-generic/mmiowb.h > @@ -27,7 +27,7 @@ > #include > > DECLARE_PER_CPU(struct mmiowb_state, __mmiowb_state); > -#define __mmiowb_state() this_cpu_ptr(&__mmiowb_state) > +#define __mmiowb_state() raw_cpu_ptr(&__mmiowb_state) > #else > #define __mmiowb_state() arch_mmiowb_state() > #endif /* arch_mmiowb_state */ > @@ -35,7 +35,9 @@ DECLARE_PER_CPU(struct mmiowb_state, __mmiowb_state); > static inline void mmiowb_set_pending(void) > { > struct mmiowb_state *ms = __mmiowb_state(); > - ms->mmiowb_pending = ms->nesting_count; > + > + if (likely(ms->nesting_count)) > + ms->mmiowb_pending = ms->nesting_count; > } > > static inline void mmiowb_spin_lock(void) Acked-by: Palmer Dabbelt Reviewed-by: Palmer Dabbelt The arm64 tree works for me. Thanks!