Message ID | 169815917362.8695.13904684741526725648.stgit@devnote2 |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1997014vqx; Tue, 24 Oct 2023 07:53:06 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGQKe7P+N8aTJQo9p6n95mZc33Os2vQQhXDSDB4LfU9Qw1e8098AHPyAekVPWNdgMiROT0O X-Received: by 2002:a17:902:d487:b0:1ca:dee1:4d1a with SMTP id c7-20020a170902d48700b001cadee14d1amr6973850plg.25.1698159186693; Tue, 24 Oct 2023 07:53:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698159186; cv=none; d=google.com; s=arc-20160816; b=m1VH0WcvyP8VvqHPGOdel/2+Ko0mg7GCWBrvMP2ANgKp0C9/AXC+64eeTJS04LQmDj BPeUhOSFH42bdZgkDeDV2A3ja9xe97uw1KcAMiDezBJ3dppEtsLMGBd5bldIcuLjD21k kTHbbvsZAYzjZG1ETqwdRIpaO7XAbYjxIRyHswI/xXgkv+qPzKUTtnSjLe0z/Bg54FG6 rv0lo1tMLlV5oX2vw7NFXV8iKVp4ErElIo1xZ3IqdJ3/gqcJonaIWsWzwoTH3/OSJqbl uWhoN5InklsE4yqcVu3YFzWKYC3ZuTkvfz9Y7PslYcntnmXke2YrLM7XouVL3akwvz5j sWcw== 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 :user-agent:message-id:date:subject:cc:to:from:dkim-signature; bh=Itstze/0liYTfnY8KCCYwGJQpYL1nmVmdM8DmdCPnV0=; fh=zMeRD+T3qe+EkVjSag86ownTZfjEVUwTROMBfBOCWjQ=; b=ojYdu1RCAcic142wSJiYYU9A28mH6dC9d6J8lGRbIgnG9oziwsAXZfYSvrIVyl8WOu XNzeb2ejCjPMvles6m1XhvJIm2DyTk9at4wEMXDSzL37i+gQE0C9BeDCCdS0uxbF/wJB GRwDf9m09kZ06ZIITH8t/KNO9QJJOvCOETvj4o+XRrBm2Xa2stZYKgHeFPbHxibSOsfW oV20ddPX2E8orSWjTlZQKXS3NuVaFrcuBLoiEdlaYN0dc/EPNEbygo3sXcuiCO9P24Wv k3TN4ZoSQqGH3584q9PvwZxlbCl5GRHwJsZDLZUfdjW56gLab4rYzemh9Wi9jE1cddQK g7YQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=U16Q1nag; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id e5-20020a170902b78500b001b9c1821f6bsi8396659pls.98.2023.10.24.07.53.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Oct 2023 07:53:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=U16Q1nag; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 5D2C7802C7F2; Tue, 24 Oct 2023 07:53:05 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343680AbjJXOxD (ORCPT <rfc822;a1648639935@gmail.com> + 26 others); Tue, 24 Oct 2023 10:53:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234560AbjJXOxB (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 24 Oct 2023 10:53:01 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 279B9B3; Tue, 24 Oct 2023 07:53:00 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 37CE6C433C7; Tue, 24 Oct 2023 14:52:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1698159179; bh=nksVzI2sxDyYwDK77Qh9hxtLz14PivSCoDF4mQ1mj4M=; h=From:To:Cc:Subject:Date:From; b=U16Q1nagA13WjsyrcYED+UgO0KdXjAHJxAU+n3rpd3ZUpmkIBNkBu3gpqgxL+2XnS QCfnDZMDDr48vspTq6FbzfRkGKiL5iVVJxn7dPKtacOMB3UIYGdNKeMW9zd3NoVf5Y V/BbtVZzMT6VG/GXa0kFIHsDSiQ5Kp8fS+29YN/VyrMTqthZD7upb3D0ly473Oig5L abhyJip2bIy7BvNrl7pJ+nGrVEYaSFq8zciCTTTItv7GQZ2xp1bgbq9QrjJvWDyyU/ vaviig+xb8SZlBmHn9g+T8fxT8/gGiRrzU5YTdlWCUdUHfCLnPwGUw+PeRv48tJL1l 59OBo/Cb6GHrg== From: "Masami Hiramatsu (Google)" <mhiramat@kernel.org> To: Yoshinori Sato <ysato@users.sourceforge.jp>, Rich Felker <dalias@libc.org>, John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> Cc: "wuqiang . matt" <wuqiang.matt@bytedance.com>, Mark Rutland <mark.rutland@arm.com>, Peter Zijlstra <peterz@infradead.org>, mhiramat@kernel.org, linux-sh@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH] locking/atomic: sh: Use generic_cmpxchg_local for arch_cmpxchg_local() Date: Tue, 24 Oct 2023 23:52:54 +0900 Message-Id: <169815917362.8695.13904684741526725648.stgit@devnote2> X-Mailer: git-send-email 2.34.1 User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 24 Oct 2023 07:53:05 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780648967370921238 X-GMAIL-MSGID: 1780648967370921238 |
Series |
locking/atomic: sh: Use generic_cmpxchg_local for arch_cmpxchg_local()
|
|
Commit Message
Masami Hiramatsu (Google)
Oct. 24, 2023, 2:52 p.m. UTC
From: Masami Hiramatsu (Google) <mhiramat@kernel.org> Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation in SH architecture because it does not implement arch_cmpxchg_local(). Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202310241310.Ir5uukOG-lkp@intel.com/ Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> --- arch/sh/include/asm/cmpxchg.h | 2 ++ 1 file changed, 2 insertions(+)
Comments
On Tue, Oct 24, 2023 at 11:52:54PM +0900, Masami Hiramatsu (Google) wrote: > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation > in SH architecture because it does not implement arch_cmpxchg_local(). I do not think this is correct. The implementation in <asm-generic/cmpxchg-local.h> is UP-only (and it only disables interrupts), whereas arch/sh can be built SMP. We should probably add some guards into <asm-generic/cmpxchg-local.h> for that as we have in <asm-generic/cmpxchg.h>. I think the right thing to do here is to define arch_cmpxchg_local() in terms of arch_cmpxchg(), i.e. at the bottom of arch/sh's <asm/cmpxchg.h> add: #define arch_cmpxchg_local arch_cmpxchg Mark. > > Reported-by: kernel test robot <lkp@intel.com> > Closes: https://lore.kernel.org/oe-kbuild-all/202310241310.Ir5uukOG-lkp@intel.com/ > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > --- > arch/sh/include/asm/cmpxchg.h | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h > index 288f6f38d98f..e920e61fb817 100644 > --- a/arch/sh/include/asm/cmpxchg.h > +++ b/arch/sh/include/asm/cmpxchg.h > @@ -71,4 +71,6 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, > (unsigned long)_n_, sizeof(*(ptr))); \ > }) > > +#include <asm-generic/cmpxchg-local.h> > + > #endif /* __ASM_SH_CMPXCHG_H */ >
On Tue, 2023-10-24 at 23:52 +0900, Masami Hiramatsu (Google) wrote: > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation > in SH architecture because it does not implement arch_cmpxchg_local(). > > Reported-by: kernel test robot <lkp@intel.com> > Closes: https://lore.kernel.org/oe-kbuild-all/202310241310.Ir5uukOG-lkp@intel.com/ > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > --- > arch/sh/include/asm/cmpxchg.h | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h > index 288f6f38d98f..e920e61fb817 100644 > --- a/arch/sh/include/asm/cmpxchg.h > +++ b/arch/sh/include/asm/cmpxchg.h > @@ -71,4 +71,6 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, > (unsigned long)_n_, sizeof(*(ptr))); \ > }) > > +#include <asm-generic/cmpxchg-local.h> > + > #endif /* __ASM_SH_CMPXCHG_H */ Reviewed-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
On Tue, 24 Oct 2023 16:08:12 +0100 Mark Rutland <mark.rutland@arm.com> wrote: > On Tue, Oct 24, 2023 at 11:52:54PM +0900, Masami Hiramatsu (Google) wrote: > > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > > > Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation > > in SH architecture because it does not implement arch_cmpxchg_local(). > > I do not think this is correct. > > The implementation in <asm-generic/cmpxchg-local.h> is UP-only (and it only > disables interrupts), whereas arch/sh can be built SMP. We should probably add > some guards into <asm-generic/cmpxchg-local.h> for that as we have in > <asm-generic/cmpxchg.h>. Isn't cmpxchg_local for the data which only needs to ensure to do cmpxchg on local CPU? So I think it doesn't care about the other CPUs (IOW, it should not touched by other CPUs), so it only considers UP case. E.g. on x86, arch_cmpxchg_local() is defined as raw "cmpxchg" without lock prefix. #define __cmpxchg_local(ptr, old, new, size) \ __raw_cmpxchg((ptr), (old), (new), (size), "") Thank you, > > I think the right thing to do here is to define arch_cmpxchg_local() in terms > of arch_cmpxchg(), i.e. at the bottom of arch/sh's <asm/cmpxchg.h> add: > > #define arch_cmpxchg_local arch_cmpxchg > > Mark. > > > > > Reported-by: kernel test robot <lkp@intel.com> > > Closes: https://lore.kernel.org/oe-kbuild-all/202310241310.Ir5uukOG-lkp@intel.com/ > > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > --- > > arch/sh/include/asm/cmpxchg.h | 2 ++ > > 1 file changed, 2 insertions(+) > > > > diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h > > index 288f6f38d98f..e920e61fb817 100644 > > --- a/arch/sh/include/asm/cmpxchg.h > > +++ b/arch/sh/include/asm/cmpxchg.h > > @@ -71,4 +71,6 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, > > (unsigned long)_n_, sizeof(*(ptr))); \ > > }) > > > > +#include <asm-generic/cmpxchg-local.h> > > + > > #endif /* __ASM_SH_CMPXCHG_H */ > >
On 2023/10/25 07:42, Masami Hiramatsu (Google) wrote: > On Tue, 24 Oct 2023 16:08:12 +0100 > Mark Rutland <mark.rutland@arm.com> wrote: > >> On Tue, Oct 24, 2023 at 11:52:54PM +0900, Masami Hiramatsu (Google) wrote: >>> From: Masami Hiramatsu (Google) <mhiramat@kernel.org> >>> >>> Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation >>> in SH architecture because it does not implement arch_cmpxchg_local(). >> >> I do not think this is correct. >> >> The implementation in <asm-generic/cmpxchg-local.h> is UP-only (and it only >> disables interrupts), whereas arch/sh can be built SMP. We should probably add >> some guards into <asm-generic/cmpxchg-local.h> for that as we have in >> <asm-generic/cmpxchg.h>. > > Isn't cmpxchg_local for the data which only needs to ensure to do cmpxchg > on local CPU? asm-generic/cmpxchg.h is only for UP, will throw an error for SMP building: #ifdef CONFIG_SMP #error "Cannot use generic cmpxchg on SMP" #endif SH arch seems it does have SMP systems. The arch/sh/include/asm/cmpxchg.h has the following codes: #if defined(CONFIG_GUSA_RB) #include <asm/cmpxchg-grb.h> #elif defined(CONFIG_CPU_SH4A) #include <asm/cmpxchg-llsc.h> #elif defined(CONFIG_CPU_J2) && defined(CONFIG_SMP) #include <asm/cmpxchg-cas.h> #else #include <asm/cmpxchg-irq.h> #endif > So I think it doesn't care about the other CPUs (IOW, it should not touched by > other CPUs), so it only considers UP case. E.g. on x86, arch_cmpxchg_local() is > defined as raw "cmpxchg" without lock prefix. > > #define __cmpxchg_local(ptr, old, new, size) \ > __raw_cmpxchg((ptr), (old), (new), (size), "") > > > Thank you, > > >> >> I think the right thing to do here is to define arch_cmpxchg_local() in terms >> of arch_cmpxchg(), i.e. at the bottom of arch/sh's <asm/cmpxchg.h> add: >> >> #define arch_cmpxchg_local arch_cmpxchg I agree too. Might not be performance optimized but guarantees correctness. >> Mark. >> >>> >>> Reported-by: kernel test robot <lkp@intel.com> >>> Closes: https://lore.kernel.org/oe-kbuild-all/202310241310.Ir5uukOG-lkp@intel.com/ >>> Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> >>> --- >>> arch/sh/include/asm/cmpxchg.h | 2 ++ >>> 1 file changed, 2 insertions(+) >>> >>> diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h >>> index 288f6f38d98f..e920e61fb817 100644 >>> --- a/arch/sh/include/asm/cmpxchg.h >>> +++ b/arch/sh/include/asm/cmpxchg.h >>> @@ -71,4 +71,6 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, >>> (unsigned long)_n_, sizeof(*(ptr))); \ >>> }) >>> >>> +#include <asm-generic/cmpxchg-local.h> >>> + >>> #endif /* __ASM_SH_CMPXCHG_H */ >>> > >
On Wed, Oct 25, 2023 at 08:42:55AM +0900, Masami Hiramatsu wrote: > On Tue, 24 Oct 2023 16:08:12 +0100 > Mark Rutland <mark.rutland@arm.com> wrote: > > > On Tue, Oct 24, 2023 at 11:52:54PM +0900, Masami Hiramatsu (Google) wrote: > > > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > > > > > Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation > > > in SH architecture because it does not implement arch_cmpxchg_local(). > > > > I do not think this is correct. > > > > The implementation in <asm-generic/cmpxchg-local.h> is UP-only (and it only > > disables interrupts), whereas arch/sh can be built SMP. We should probably add > > some guards into <asm-generic/cmpxchg-local.h> for that as we have in > > <asm-generic/cmpxchg.h>. > > Isn't cmpxchg_local for the data which only needs to ensure to do cmpxchg > on local CPU? > So I think it doesn't care about the other CPUs (IOW, it should not touched by > other CPUs), so it only considers UP case. E.g. on x86, arch_cmpxchg_local() is > defined as raw "cmpxchg" without lock prefix. > > #define __cmpxchg_local(ptr, old, new, size) \ > __raw_cmpxchg((ptr), (old), (new), (size), "") > Yes, you're right; sorry for the noise. For your original patch: Acked-by: Mark Rutland <mark.rutland@arm.com> Mark. > > Thank you, > > > > > > I think the right thing to do here is to define arch_cmpxchg_local() in terms > > of arch_cmpxchg(), i.e. at the bottom of arch/sh's <asm/cmpxchg.h> add: > > > > #define arch_cmpxchg_local arch_cmpxchg > > > > Mark. > > > > > > > > Reported-by: kernel test robot <lkp@intel.com> > > > Closes: https://lore.kernel.org/oe-kbuild-all/202310241310.Ir5uukOG-lkp@intel.com/ > > > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > > --- > > > arch/sh/include/asm/cmpxchg.h | 2 ++ > > > 1 file changed, 2 insertions(+) > > > > > > diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h > > > index 288f6f38d98f..e920e61fb817 100644 > > > --- a/arch/sh/include/asm/cmpxchg.h > > > +++ b/arch/sh/include/asm/cmpxchg.h > > > @@ -71,4 +71,6 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, > > > (unsigned long)_n_, sizeof(*(ptr))); \ > > > }) > > > > > > +#include <asm-generic/cmpxchg-local.h> > > > + > > > #endif /* __ASM_SH_CMPXCHG_H */ > > > > > > -- > Masami Hiramatsu (Google) <mhiramat@kernel.org>
On Wed, 2023-10-25 at 11:30 +0100, Mark Rutland wrote: > On Wed, Oct 25, 2023 at 08:42:55AM +0900, Masami Hiramatsu wrote: > > On Tue, 24 Oct 2023 16:08:12 +0100 > > Mark Rutland <mark.rutland@arm.com> wrote: > > > > > On Tue, Oct 24, 2023 at 11:52:54PM +0900, Masami Hiramatsu (Google) wrote: > > > > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > > > > > > > Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation > > > > in SH architecture because it does not implement arch_cmpxchg_local(). > > > > > > I do not think this is correct. > > > > > > The implementation in <asm-generic/cmpxchg-local.h> is UP-only (and it only > > > disables interrupts), whereas arch/sh can be built SMP. We should probably add > > > some guards into <asm-generic/cmpxchg-local.h> for that as we have in > > > <asm-generic/cmpxchg.h>. > > > > Isn't cmpxchg_local for the data which only needs to ensure to do cmpxchg > > on local CPU? > > So I think it doesn't care about the other CPUs (IOW, it should not touched by > > other CPUs), so it only considers UP case. E.g. on x86, arch_cmpxchg_local() is > > defined as raw "cmpxchg" without lock prefix. > > > > #define __cmpxchg_local(ptr, old, new, size) \ > > __raw_cmpxchg((ptr), (old), (new), (size), "") > > > > Yes, you're right; sorry for the noise. > > For your original patch: > > Acked-by: Mark Rutland <mark.rutland@arm.com> > Geert, what's your opinion on this? Adrian
On 2023/10/25 09:51, wuqiang.matt wrote: > On 2023/10/25 07:42, Masami Hiramatsu (Google) wrote: >> On Tue, 24 Oct 2023 16:08:12 +0100 >> Mark Rutland <mark.rutland@arm.com> wrote: >> >>> On Tue, Oct 24, 2023 at 11:52:54PM +0900, Masami Hiramatsu (Google) wrote: >>>> From: Masami Hiramatsu (Google) <mhiramat@kernel.org> >>>> >>>> Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation >>>> in SH architecture because it does not implement arch_cmpxchg_local(). >>> >>> I do not think this is correct. >>> >>> The implementation in <asm-generic/cmpxchg-local.h> is UP-only (and it only >>> disables interrupts), whereas arch/sh can be built SMP. We should probably add >>> some guards into <asm-generic/cmpxchg-local.h> for that as we have in >>> <asm-generic/cmpxchg.h>. >> >> Isn't cmpxchg_local for the data which only needs to ensure to do cmpxchg >> on local CPU? > > asm-generic/cmpxchg.h is only for UP, will throw an error for SMP building: > > #ifdef CONFIG_SMP > #error "Cannot use generic cmpxchg on SMP" > #endif Sorry that I just noticed Masami's patch has asm-generic/cmpxchg-local.h included, not asm-generic/cmpxchg.h. cmpxchg.h does throw an error for SMP configs, but cmpxchg-local.h doesn't. > SH arch seems it does have SMP systems. The arch/sh/include/asm/cmpxchg.h has > the following codes: > > #if defined(CONFIG_GUSA_RB) > #include <asm/cmpxchg-grb.h> > #elif defined(CONFIG_CPU_SH4A) > #include <asm/cmpxchg-llsc.h> > #elif defined(CONFIG_CPU_J2) && defined(CONFIG_SMP) > #include <asm/cmpxchg-cas.h> > #else > #include <asm/cmpxchg-irq.h> > #endif > >> So I think it doesn't care about the other CPUs (IOW, it should not touched by >> other CPUs), so it only considers UP case. E.g. on x86, arch_cmpxchg_local() is >> defined as raw "cmpxchg" without lock prefix. >> >> #define __cmpxchg_local(ptr, old, new, size) \ >> __raw_cmpxchg((ptr), (old), (new), (size), "") >> >> >> Thank you, >> >> >>> >>> I think the right thing to do here is to define arch_cmpxchg_local() in terms >>> of arch_cmpxchg(), i.e. at the bottom of arch/sh's <asm/cmpxchg.h> add: >>> >>> #define arch_cmpxchg_local arch_cmpxchg > > I agree too. Might not be performance optimized but guarantees correctness. > >>> Mark. >>> >>>> >>>> Reported-by: kernel test robot <lkp@intel.com> >>>> Closes: >>>> https://lore.kernel.org/oe-kbuild-all/202310241310.Ir5uukOG-lkp@intel.com/ >>>> Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> >>>> --- >>>> arch/sh/include/asm/cmpxchg.h | 2 ++ >>>> 1 file changed, 2 insertions(+) >>>> >>>> diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h >>>> index 288f6f38d98f..e920e61fb817 100644 >>>> --- a/arch/sh/include/asm/cmpxchg.h >>>> +++ b/arch/sh/include/asm/cmpxchg.h >>>> @@ -71,4 +71,6 @@ static inline unsigned long __cmpxchg(volatile void * >>>> ptr, unsigned long old, >>>> (unsigned long)_n_, sizeof(*(ptr))); \ >>>> }) >>>> +#include <asm-generic/cmpxchg-local.h> >>>> + >>>> #endif /* __ASM_SH_CMPXCHG_H */ >>>> >> >> >
On 2023/10/24 22:52, Masami Hiramatsu (Google) wrote: > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation > in SH architecture because it does not implement arch_cmpxchg_local(). > > Reported-by: kernel test robot <lkp@intel.com> > Closes: https://lore.kernel.org/oe-kbuild-all/202310241310.Ir5uukOG-lkp@intel.com/ > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > --- > arch/sh/include/asm/cmpxchg.h | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h > index 288f6f38d98f..e920e61fb817 100644 > --- a/arch/sh/include/asm/cmpxchg.h > +++ b/arch/sh/include/asm/cmpxchg.h > @@ -71,4 +71,6 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, > (unsigned long)_n_, sizeof(*(ptr))); \ > }) > > +#include <asm-generic/cmpxchg-local.h> > + asm-generic/cmpxchg-local.h defines only 2 routines: __generic_cmpxchg_local and __generic_cmpxchg64_local. Shall add the definition of arch_cmpxchg_local into arch/sh/include/asm/cmpxchg.h, or group arch_cmpxchg_local and arch_cmpxchg64_local into asm-generic/cmpxchg-local.h ? > #endif /* __ASM_SH_CMPXCHG_H */ >
Hi Adrian, On Wed, Oct 25, 2023 at 12:32 PM John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> wrote: > On Wed, 2023-10-25 at 11:30 +0100, Mark Rutland wrote: > > On Wed, Oct 25, 2023 at 08:42:55AM +0900, Masami Hiramatsu wrote: > > > On Tue, 24 Oct 2023 16:08:12 +0100 > > > Mark Rutland <mark.rutland@arm.com> wrote: > > > > On Tue, Oct 24, 2023 at 11:52:54PM +0900, Masami Hiramatsu (Google) wrote: > > > > > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > > > > > > > > > Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation > > > > > in SH architecture because it does not implement arch_cmpxchg_local(). > > > > > > > > I do not think this is correct. > > > > > > > > The implementation in <asm-generic/cmpxchg-local.h> is UP-only (and it only > > > > disables interrupts), whereas arch/sh can be built SMP. We should probably add > > > > some guards into <asm-generic/cmpxchg-local.h> for that as we have in > > > > <asm-generic/cmpxchg.h>. > > > > > > Isn't cmpxchg_local for the data which only needs to ensure to do cmpxchg > > > on local CPU? > > > So I think it doesn't care about the other CPUs (IOW, it should not touched by > > > other CPUs), so it only considers UP case. E.g. on x86, arch_cmpxchg_local() is > > > defined as raw "cmpxchg" without lock prefix. > > > > > > #define __cmpxchg_local(ptr, old, new, size) \ > > > __raw_cmpxchg((ptr), (old), (new), (size), "") > > > > > > > Yes, you're right; sorry for the noise. > > > > For your original patch: > > > > Acked-by: Mark Rutland <mark.rutland@arm.com> > > Geert, what's your opinion on this? While this looks OK on first sight (ARM includes the same file, even on SMP), it does not seem to work? For sh-allnoconfig, as reported by kernel test robot: $ make ARCH=sh CROSS_COMPILE=sh2-linux- allnoconfig lib/objpool.o lib/objpool.c: In function 'objpool_try_add_slot': ./include/linux/atomic/atomic-arch-fallback.h:384:27: error: implicit declaration of function 'arch_cmpxchg_local'; did you mean 'raw_cmpxchg_local'? [-Werror=implicit-function-declaration] 384 | #define raw_cmpxchg_local arch_cmpxchg_local | ^~~~~~~~~~~~~~~~~~ ./include/linux/atomic/atomic-arch-fallback.h:392:16: note: in expansion of macro 'raw_cmpxchg_local' 392 | ___r = raw_cmpxchg_local((_ptr), ___o, (_new)); \ | ^~~~~~~~~~~~~~~~~ ./include/linux/atomic/atomic-instrumented.h:4980:9: note: in expansion of macro 'raw_try_cmpxchg_local' 4980 | raw_try_cmpxchg_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \ | ^~~~~~~~~~~~~~~~~~~~~ lib/objpool.c:169:19: note: in expansion of macro 'try_cmpxchg_local' 169 | } while (!try_cmpxchg_local(&slot->tail, &tail, tail + 1)); | ^~~~~~~~~~~~~~~~~ For an SMP defconfig: $ make ARCH=sh CROSS_COMPILE=sh4-linux-gnu- sdk7786_defconfig lib/objpool.o ./include/linux/atomic/atomic-arch-fallback.h:384:27: error: implicit declaration of function ‘arch_cmpxchg_local’; did you mean ‘try_cmpxchg_local’? [-Werror=implicit-function-declaration] 384 | #define raw_cmpxchg_local arch_cmpxchg_local | ^~~~~~~~~~~~~~~~~~ ./include/linux/atomic/atomic-arch-fallback.h:392:16: note: in expansion of macro ‘raw_cmpxchg_local’ 392 | ___r = raw_cmpxchg_local((_ptr), ___o, (_new)); \ | ^~~~~~~~~~~~~~~~~ ./include/linux/atomic/atomic-instrumented.h:4980:9: note: in expansion of macro ‘raw_try_cmpxchg_local’ 4980 | raw_try_cmpxchg_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \ | ^~~~~~~~~~~~~~~~~~~~~ lib/objpool.c:169:19: note: in expansion of macro ‘try_cmpxchg_local’ 169 | } while (!try_cmpxchg_local(&slot->tail, &tail, tail + 1)); | ^~~~~~~~~~~~~~~~~ Hiramatsu-san: do these build for you? Gr{oetje,eeting}s, Geert
On Wed, 25 Oct 2023 15:16:16 +0200 Geert Uytterhoeven <geert@linux-m68k.org> wrote: > Hi Adrian, > > On Wed, Oct 25, 2023 at 12:32 PM John Paul Adrian Glaubitz > <glaubitz@physik.fu-berlin.de> wrote: > > On Wed, 2023-10-25 at 11:30 +0100, Mark Rutland wrote: > > > On Wed, Oct 25, 2023 at 08:42:55AM +0900, Masami Hiramatsu wrote: > > > > On Tue, 24 Oct 2023 16:08:12 +0100 > > > > Mark Rutland <mark.rutland@arm.com> wrote: > > > > > On Tue, Oct 24, 2023 at 11:52:54PM +0900, Masami Hiramatsu (Google) wrote: > > > > > > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > > > > > > > > > > > Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation > > > > > > in SH architecture because it does not implement arch_cmpxchg_local(). > > > > > > > > > > I do not think this is correct. > > > > > > > > > > The implementation in <asm-generic/cmpxchg-local.h> is UP-only (and it only > > > > > disables interrupts), whereas arch/sh can be built SMP. We should probably add > > > > > some guards into <asm-generic/cmpxchg-local.h> for that as we have in > > > > > <asm-generic/cmpxchg.h>. > > > > > > > > Isn't cmpxchg_local for the data which only needs to ensure to do cmpxchg > > > > on local CPU? > > > > So I think it doesn't care about the other CPUs (IOW, it should not touched by > > > > other CPUs), so it only considers UP case. E.g. on x86, arch_cmpxchg_local() is > > > > defined as raw "cmpxchg" without lock prefix. > > > > > > > > #define __cmpxchg_local(ptr, old, new, size) \ > > > > __raw_cmpxchg((ptr), (old), (new), (size), "") > > > > > > > > > > Yes, you're right; sorry for the noise. > > > > > > For your original patch: > > > > > > Acked-by: Mark Rutland <mark.rutland@arm.com> > > > > Geert, what's your opinion on this? > > While this looks OK on first sight (ARM includes the same file, even > on SMP), it does not seem to work? > > For sh-allnoconfig, as reported by kernel test robot: > > $ make ARCH=sh CROSS_COMPILE=sh2-linux- allnoconfig lib/objpool.o > lib/objpool.c: In function 'objpool_try_add_slot': > ./include/linux/atomic/atomic-arch-fallback.h:384:27: error: implicit > declaration of function 'arch_cmpxchg_local'; did you mean > 'raw_cmpxchg_local'? [-Werror=implicit-function-declaration] > 384 | #define raw_cmpxchg_local arch_cmpxchg_local > | ^~~~~~~~~~~~~~~~~~ > ./include/linux/atomic/atomic-arch-fallback.h:392:16: note: in > expansion of macro 'raw_cmpxchg_local' > 392 | ___r = raw_cmpxchg_local((_ptr), ___o, (_new)); \ > | ^~~~~~~~~~~~~~~~~ > ./include/linux/atomic/atomic-instrumented.h:4980:9: note: in > expansion of macro 'raw_try_cmpxchg_local' > 4980 | raw_try_cmpxchg_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \ > | ^~~~~~~~~~~~~~~~~~~~~ > lib/objpool.c:169:19: note: in expansion of macro 'try_cmpxchg_local' > 169 | } while (!try_cmpxchg_local(&slot->tail, &tail, tail + 1)); > | ^~~~~~~~~~~~~~~~~ > > For an SMP defconfig: > > $ make ARCH=sh CROSS_COMPILE=sh4-linux-gnu- sdk7786_defconfig lib/objpool.o > > ./include/linux/atomic/atomic-arch-fallback.h:384:27: error: implicit > declaration of function ‘arch_cmpxchg_local’; did you mean > ‘try_cmpxchg_local’? [-Werror=implicit-function-declaration] > 384 | #define raw_cmpxchg_local arch_cmpxchg_local > | ^~~~~~~~~~~~~~~~~~ > ./include/linux/atomic/atomic-arch-fallback.h:392:16: note: in > expansion of macro ‘raw_cmpxchg_local’ > 392 | ___r = raw_cmpxchg_local((_ptr), ___o, (_new)); \ > | ^~~~~~~~~~~~~~~~~ > ./include/linux/atomic/atomic-instrumented.h:4980:9: note: in > expansion of macro ‘raw_try_cmpxchg_local’ > 4980 | raw_try_cmpxchg_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \ > | ^~~~~~~~~~~~~~~~~~~~~ > lib/objpool.c:169:19: note: in expansion of macro ‘try_cmpxchg_local’ > 169 | } while (!try_cmpxchg_local(&slot->tail, &tail, tail + 1)); > | ^~~~~~~~~~~~~~~~~ > > Hiramatsu-san: do these build for you? Thanks for pointing. I thought I just need to include the header file. That's my fault. Let me fix that. Thank you! > > Gr{oetje,eeting}s, > > Geert > > -- > Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org > > In personal conversations with technical people, I call myself a hacker. But > when I'm talking to journalists I just say "programmer" or something like that. > -- Linus Torvalds
On Wed, 25 Oct 2023 19:26:37 +0800 "wuqiang.matt" <wuqiang.matt@bytedance.com> wrote: > On 2023/10/24 22:52, Masami Hiramatsu (Google) wrote: > > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > > > Use generic_cmpxchg_local() for arch_cmpxchg_local() implementation > > in SH architecture because it does not implement arch_cmpxchg_local(). > > > > Reported-by: kernel test robot <lkp@intel.com> > > Closes: https://lore.kernel.org/oe-kbuild-all/202310241310.Ir5uukOG-lkp@intel.com/ > > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > --- > > arch/sh/include/asm/cmpxchg.h | 2 ++ > > 1 file changed, 2 insertions(+) > > > > diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h > > index 288f6f38d98f..e920e61fb817 100644 > > --- a/arch/sh/include/asm/cmpxchg.h > > +++ b/arch/sh/include/asm/cmpxchg.h > > @@ -71,4 +71,6 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, > > (unsigned long)_n_, sizeof(*(ptr))); \ > > }) > > > > +#include <asm-generic/cmpxchg-local.h> > > + > > asm-generic/cmpxchg-local.h defines only 2 routines: __generic_cmpxchg_local > and __generic_cmpxchg64_local. Thanks Wuqiang, I found how I can fix that from your message. > > Shall add the definition of arch_cmpxchg_local into > arch/sh/include/asm/cmpxchg.h, or group arch_cmpxchg_local and > arch_cmpxchg64_local into > asm-generic/cmpxchg-local.h ? No, maybe it depends on the arch that which __generic function need to use. Thank you, > > > #endif /* __ASM_SH_CMPXCHG_H */ > > >
diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h index 288f6f38d98f..e920e61fb817 100644 --- a/arch/sh/include/asm/cmpxchg.h +++ b/arch/sh/include/asm/cmpxchg.h @@ -71,4 +71,6 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, (unsigned long)_n_, sizeof(*(ptr))); \ }) +#include <asm-generic/cmpxchg-local.h> + #endif /* __ASM_SH_CMPXCHG_H */