Re: [PATCH nf v2] netfilter: conntrack: connection timeout after re-register

2020-10-08 Thread Jozsef Kadlecsik
Hi Francesco,

On Thu, 8 Oct 2020, Francesco Ruggeri wrote:

> On Wed, Oct 7, 2020 at 12:32 PM Francesco Ruggeri  wrote:
> >
> > If the first packet conntrack sees after a re-register is an outgoing 
> > keepalive packet with no data (SEG.SEQ = SND.NXT-1), td_end is set to 
> > SND.NXT-1. When the peer correctly acknowledges SND.NXT, tcp_in_window 
> > fails check III (Upper bound for valid (s)ack: sack <= 
> > receiver.td_end) and returns false, which cascades into 
> > nf_conntrack_in setting skb->_nfct = 0 and in later conntrack iptables 
> > rules not matching. In cases where iptables are dropping packets that 
> > do not match conntrack rules this can result in idle tcp connections 
> > to time out.
> >
> > v2: adjust td_end when getting the reply rather than when sending out
> > the keepalive packet.
> >
> 
> Any comments?
> Here is a simple reproducer. The idea is to show that keepalive packets 
> in an idle tcp connection will be dropped (and the connection will time 
> out) if conntrack hooks are de-registered and then re-registered. The 
> reproducer has two files. client_server.py creates both ends of a tcp 
> connection, bounces a few packets back and forth, and then blocks on a 
> recv on the client side. The client's keepalive is configured to time 
> out in 20 seconds. This connection should not time out. test is a bash 
> script that creates a net namespace where it sets iptables rules for the 
> connection, starts client_server.py, and then clears and restores the 
> iptables rules (which causes conntrack hooks to be de-registered and 
> re-registered).

In my opinion an iptables restore should not cause conntrack hooks to be 
de-registered and re-registered, because important TCP initialization 
parameters cannot be "restored" later from the packets. Therefore the 
proper fix would be to prevent it to happen. Otherwise your patch looks OK 
to handle the case when conntrack is intentionally restarted.

Best regards,
Jozsef
 
>  file client_server.py
> #!/usr/bin/python
> 
> import socket
> 
> PORT=4446
> 
> # create server socket
> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> sock.bind(('localhost', PORT))
> sock.listen(1)
> 
> # create client socket
> cl_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> cl_sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
> cl_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 2)
> cl_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 2)
> cl_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 10)
> cl_sock.connect(('localhost', PORT))
> 
> srv_sock, _ = sock.accept()
> 
> # Bounce a packet back and forth a few times
> buf = ''
> for i in range(5):
>cl_sock.send(buf)
>buf = srv_sock.recv(100)
>srv_sock.send(buf)
>buf = cl_sock.recv(100)
>print buf
> 
> # idle the connection
> try:
>buf = cl_sock.recv(100)
> except socket.error, e:
>print "Error: %s" % e
> 
> sock.close()
> cl_sock.close()
> srv_sock.close()
> 
> == file test
> #!/bin/bash
> 
> ip netns add dummy
> ip netns exec dummy ip link set lo up
> echo "Created namespace"
> 
> ip netns exec dummy iptables-restore < *filter
> :INPUT DROP [0:0]
> :FORWARD ACCEPT [0:0]
> :OUTPUT ACCEPT [0:0]
> -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
> -A INPUT -p tcp -m tcp --dport 4446 -j ACCEPT
> COMMIT
> END
> echo "Installed iptables rules"
> 
> ip netns exec dummy ./client_server.py &
> echo "Created tcp connection"
> sleep 2
> 
> ip netns exec dummy iptables-restore << END
> *filter
> :INPUT ACCEPT [0:0]
> :FORWARD ACCEPT [0:0]
> :OUTPUT ACCEPT [0:0]
> COMMIT
> END
> echo "Cleared iptables rules"
> sleep 4
> 
> ip netns exec dummy iptables-restore << END
> *filter
> :INPUT DROP [0:0]
> :FORWARD ACCEPT [0:0]
> :OUTPUT ACCEPT [0:0]
> -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
> -A INPUT -p tcp -m tcp --dport 4446 -j ACCEPT
> COMMIT
> END
> echo "Restored original iptables rules"
> 
> wait
> ip netns del dummy
> exit 0
> 

-
E-mail  : kad...@blackhole.kfki.hu, kadlecsik.joz...@wigner.hu
PGP key : https://wigner.hu/~kadlec/pgp_public_key.txt
Address : Wigner Research Centre for Physics
  H-1525 Budapest 114, POB. 49, Hungary


Re: [GIT PULL memory-model] LKMM commits for v5.10

2020-10-08 Thread Ingo Molnar


* Paul E. McKenney  wrote:

> Hello, Ingo!
> 
> This pull request contains Linux-Kernel Memory-Model commits for v5.10.
> These have been subjected to LKML review:
> 
>   https://lore.kernel.org/lkml/20200831182012.GA1965@paulmck-ThinkPad-P72
> 
> All of these have also been subjected to the kbuild test robot and
> -next testing.  The following changes since v5.9-rc1 are available in
> the git repository at:
> 
>   git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git lkmm
> 
> for you to fetch changes up to 0ce0c78eff7d22c8a261de6c4305a5abb638c200:
> 
>   tools/memory-model: Expand the cheatsheet.txt notion of relaxed (2020-09-04 
> 11:58:15 -0700)
> 
> 
> Alexander A. Klimov (1):
>   Replace HTTP links with HTTPS ones: LKMM
> 
> Paul E. McKenney (4):
>   tools/memory-model: Update recipes.txt prime_numbers.c path
>   tools/memory-model: Improve litmus-test documentation
>   tools/memory-model: Add a simple entry point document
>   tools/memory-model: Expand the cheatsheet.txt notion of relaxed
> 
>  tools/memory-model/Documentation/cheatsheet.txt   |   33 +-
>  tools/memory-model/Documentation/litmus-tests.txt | 1074 
> +
>  tools/memory-model/Documentation/recipes.txt  |4 +-
>  tools/memory-model/Documentation/references.txt   |2 +-
>  tools/memory-model/Documentation/simple.txt   |  271 ++
>  tools/memory-model/README |  160 +--
>  6 files changed, 1410 insertions(+), 134 deletions(-)
>  create mode 100644 tools/memory-model/Documentation/litmus-tests.txt
>  create mode 100644 tools/memory-model/Documentation/simple.txt

Pulled, thanks a lot Paul!

Ingo


Re: [PATCH v4 4/4] mmc: sdhci-of-arasan: Enable UHS-1 support for Keem Bay SOC

2020-10-08 Thread Ulf Hansson
On Thu, 8 Oct 2020 at 19:21, Zulkifli, Muhammad Husaini
 wrote:
>
> Hi,
>
> >-Original Message-
> >From: Ulf Hansson 
> >Sent: Thursday, October 8, 2020 11:19 PM
> >To: Zulkifli, Muhammad Husaini 
> >Cc: Hunter, Adrian ; Michal Simek
> >; Shevchenko, Andriy
> >; linux-...@vger.kernel.org; Linux ARM
> >; Linux Kernel Mailing List  >ker...@vger.kernel.org>; Raja Subramanian, Lakshmi Bai
> >; Wan Mohamad, Wan Ahmad
> >Zainie ; Arnd Bergmann
> >
> >Subject: Re: [PATCH v4 4/4] mmc: sdhci-of-arasan: Enable UHS-1 support for
> >Keem Bay SOC
> >
> >On Thu, 8 Oct 2020 at 12:54, Zulkifli, Muhammad Husaini
> > wrote:
> >>
> >> Hi,
> >>
> >> >-Original Message-
> >> >From: Ulf Hansson 
> >> >Sent: Thursday, October 8, 2020 5:28 PM
> >> >To: Zulkifli, Muhammad Husaini 
> >> >Cc: Hunter, Adrian ; Michal Simek
> >> >; Shevchenko, Andriy
> >> >; linux-...@vger.kernel.org; Linux ARM
> >> >; Linux Kernel Mailing List
> >> >; Raja Subramanian, Lakshmi Bai
> >> >; Wan Mohamad, Wan Ahmad
> >> >Zainie ; Arnd Bergmann
> >> >
> >> >Subject: Re: [PATCH v4 4/4] mmc: sdhci-of-arasan: Enable UHS-1
> >> >support for Keem Bay SOC
> >> >
> >> >On Thu, 8 Oct 2020 at 04:12, 
> >wrote:
> >> >>
> >> >> From: Muhammad Husaini Zulkifli
> >> >> 
> >> >>
> >> >> Voltage switching sequence is needed to support UHS-1 interface.
> >> >> There are 2 places to control the voltage.
> >> >> 1) By setting the AON register using firmware driver calling
> >> >> system-level platform management layer (SMC) to set the register.
> >> >> 2) By controlling the GPIO expander value to drive either 1.8V or
> >> >> 3.3V for power mux input.
> >> >>
> >> >> Signed-off-by: Muhammad Husaini Zulkifli
> >> >> 
> >> >> Reviewed-by: Andy Shevchenko 
> >> >> Reviewed-by: Adrian Hunter 
> >> >> ---
> >> >>  drivers/mmc/host/sdhci-of-arasan.c | 126
> >> >> +
> >> >>  1 file changed, 126 insertions(+)
> >> >>
> >> >> diff --git a/drivers/mmc/host/sdhci-of-arasan.c
> >> >> b/drivers/mmc/host/sdhci-of-arasan.c
> >> >> index 46aea6516133..ea2467b0073d 100644
> >> >> --- a/drivers/mmc/host/sdhci-of-arasan.c
> >> >> +++ b/drivers/mmc/host/sdhci-of-arasan.c
> >> >> @@ -16,6 +16,7 @@
> >> >>   */
> >> >>
> >> >>  #include 
> >> >> +#include 
> >> >>  #include 
> >> >>  #include 
> >> >>  #include 
> >> >> @@ -23,6 +24,7 @@
> >> >>  #include 
> >> >>  #include 
> >> >>  #include 
> >> >> +#include 
> >> >>
> >> >>  #include "cqhci.h"
> >> >>  #include "sdhci-pltfm.h"
> >> >> @@ -136,6 +138,7 @@ struct sdhci_arasan_clk_data {
> >> >>   * @soc_ctl_base:  Pointer to regmap for syscon for soc_ctl 
> >> >> registers.
> >> >>   * @soc_ctl_map:   Map to get offsets into soc_ctl registers.
> >> >>   * @quirks:Arasan deviations from spec.
> >> >> + * @uhs_gpio:  Pointer to the uhs gpio.
> >> >>   */
> >> >>  struct sdhci_arasan_data {
> >> >> struct sdhci_host *host;
> >> >> @@ -150,6 +153,7 @@ struct sdhci_arasan_data {
> >> >> struct regmap   *soc_ctl_base;
> >> >> const struct sdhci_arasan_soc_ctl_map *soc_ctl_map;
> >> >> unsigned intquirks;
> >> >> +   struct gpio_desc *uhs_gpio;
> >> >>
> >> >>  /* Controller does not have CD wired and will not function
> >> >> normally without
> >> >*/
> >> >>  #define SDHCI_ARASAN_QUIRK_FORCE_CDTESTBIT(0)
> >> >> @@ -361,6 +365,112 @@ static int sdhci_arasan_voltage_switch(struct
> >> >mmc_host *mmc,
> >> >> return -EINVAL;
> >> >>  }
> >> >>
> >> >> +static int sdhci_arasan_keembay_voltage_switch(struct mmc_host
> >*mmc,
> >> >> +  struct mmc_ios *ios) {
> >> >> +   struct sdhci_host *host = mmc_priv(mmc);
> >> >> +   struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> >> >> +   struct sdhci_arasan_data *sdhci_arasan =
> >sdhci_pltfm_priv(pltfm_host);
> >> >> +   u16 ctrl_2, clk;
> >> >> +   int ret;
> >> >> +
> >> >> +   switch (ios->signal_voltage) {
> >> >> +   case MMC_SIGNAL_VOLTAGE_180:
> >> >> +   clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
> >> >> +   clk &= ~SDHCI_CLOCK_CARD_EN;
> >> >> +   sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
> >> >> +
> >> >> +   clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
> >> >> +   if (clk & SDHCI_CLOCK_CARD_EN)
> >> >> +   return -EAGAIN;
> >> >> +
> >> >> +   sdhci_writeb(host, SDHCI_POWER_ON | SDHCI_POWER_180,
> >> >> +  SDHCI_POWER_CONTROL);
> >> >> +
> >> >> +   /*
> >> >> +* Set VDDIO_B voltage to Low for 1.8V
> >> >> +* which is controlling by GPIO Expander.
> >> >> +*/
> >> >> +   gpiod_set_value_cansleep(sdhci_arasan->uhs_gpio,
> >> >> + 0);
> >> >> +
> >> >> +   /*
> >> >> +* This is like a final gatekeeper. Need to ensure 
> >> >> changed
> >voltage
> >> >> +* is s

Re: [PATCH] MAINTAINERS: Update entry for st7703 driver after the rename

2020-10-08 Thread Daniel Vetter
On Fri, Oct 09, 2020 at 06:27:46AM +0200, Lukas Bulwahn wrote:
> 
> 
> On Wed, 1 Jul 2020, Ondrej Jirman wrote:
> 
> > The driver was renamed, change the path in the MAINTAINERS file.
> > 
> > Signed-off-by: Ondrej Jirman 
> 
> This minor non-urgent cleanup patch has not been picked up yet by anyone.
> 
> Hence, ./scripts/get_maintainers.pl --self-test=patterns continues to 
> complain:
> 
>   warning: no file matches  F:
> Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
>   warning: no file matches  F:
> drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> 
> This patch cleanly applies on next-20201008 and resolves the issue above.

Generally after 2-3 weeks a patch is lost and unfortunately needs to be
resend. Please do that next time around instead of waiting.

Patch queued up now for 5.10, thanks.
-Daniel

> Reviewed-by: Lukas Bulwahn 
> 
> 
> Lukas
> 
> > ---
> >  MAINTAINERS | 7 ---
> >  1 file changed, 4 insertions(+), 3 deletions(-)
> > 
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 5f186a661a9b..f5183eae08df 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -5487,12 +5487,13 @@ S:  Maintained
> >  F: Documentation/devicetree/bindings/display/panel/raydium,rm67191.yaml
> >  F: drivers/gpu/drm/panel/panel-raydium-rm67191.c
> >  
> > -DRM DRIVER FOR ROCKTECH JH057N00900 PANELS
> > +DRM DRIVER FOR SITRONIX ST7703 PANELS
> >  M: Guido Günther 
> >  R: Purism Kernel Team 
> > +R: Ondrej Jirman 
> >  S: Maintained
> > -F: Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
> > -F: drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> > +F: 
> > Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
> > +F: drivers/gpu/drm/panel/panel-sitronix-st7703.c
> >  
> >  DRM DRIVER FOR SAVAGE VIDEO CARDS
> >  S: Orphan / Obsolete
> > -- 
> > 2.27.0
> > 
> > 


-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


Re: [PATCH 5/5] i2c: geni: sdm845: dont perform DMA for the oneplus6

2020-10-08 Thread Mukesh, Savaliya



On 10/8/2020 3:33 PM, Wolfram Sang wrote:

On Wed, Oct 07, 2020 at 05:49:35PM +, Caleb Connolly wrote:

The OnePlus 6/T has the same issues as the c630 causing a crash when DMA
is used for i2c, so disable it.

https://patchwork.kernel.org/patch/11133827/
Signed-off-by: Caleb Connolly 

Reviewed-by: Mukesh Kumar Savaliya 

May I ask for a quick review here, so we can get this into 5.9 if
qcom-geni maintainers agree this is good to go?


---
  drivers/i2c/busses/i2c-qcom-geni.c | 6 --
  1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/busses/i2c-qcom-geni.c 
b/drivers/i2c/busses/i2c-qcom-geni.c
index dead5db3315a..50a0674a6553 100644
--- a/drivers/i2c/busses/i2c-qcom-geni.c
+++ b/drivers/i2c/busses/i2c-qcom-geni.c
@@ -358,7 +358,8 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, 
struct i2c_msg *msg,
struct geni_se *se = &gi2c->se;
size_t len = msg->len;
  
-	if (!of_machine_is_compatible("lenovo,yoga-c630"))

+   if (!of_machine_is_compatible("lenovo,yoga-c630") &&
+   !of_machine_is_compatible("oneplus,oneplus6"))
dma_buf = i2c_get_dma_safe_msg_buf(msg, 32);
  
  	if (dma_buf)

@@ -400,7 +401,8 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, 
struct i2c_msg *msg,
struct geni_se *se = &gi2c->se;
size_t len = msg->len;
  
-	if (!of_machine_is_compatible("lenovo,yoga-c630"))

+   if (!of_machine_is_compatible("lenovo,yoga-c630") &&
+   !of_machine_is_compatible("oneplus,oneplus6"))
dma_buf = i2c_get_dma_safe_msg_buf(msg, 32);
  
  	if (dma_buf)

--
2.28.0




Re: linux-next: build failure after merge of the tip tree

2020-10-08 Thread Vasily Gorbik
On Fri, Oct 09, 2020 at 03:28:46PM +1100, Stephen Rothwell wrote:
> Hi all,
> 
> After merging the tip tree, today's linux-next build (perf) failed
> like this:
> 
> In file included from tools/include/linux/build_bug.h:5,
>  from tools/include/linux/kernel.h:8,
>  from util/intel-pt-decoder/intel-pt-insn-decoder.c:7:
> util/intel-pt-decoder/../../../arch/x86/lib/insn.c: In function 
> '__insn_get_emulate_prefix':
> tools/include/linux/compiler.h:37:38: error: nested extern declaration of 
> '__compiletime_assert_0' [-Werror=nested-externs]
>37 |  _compiletime_assert(condition, msg, __compiletime_assert_, 
> __COUNTER__)
>   |  ^
...snip...
> 
> Caused by commit
> 
>   2a522b53c470 ("x86/insn: Support big endian cross-compiles")
> 
> I have reverted commits
> 
> a23b701ae9b3 objtool: Rework header include paths
> 1b4998c364bc objtool: Fix x86 orc generation on big endian cross compiles
> 317664a7fcc9 objtool: Fix reloc generation on big endian cross compiles
> 2a522b53c470 x86/insn: Support big endian cross-compiles
> 2486baae2cf6 objtool: Allow nested externs to enable BUILD_BUG()
> 
> for today.
> 
> This is a PowerPC LE native build of tools/perf.

Oh, I missed that. Sorry about that. Obviously x86 instruction
decoder is also used in perf. The question is, should we just disable
-Wnested-externs for perf like we did for the objtool. Or since we got
BUILD_BUG() implementation in tools simply disable -Wnested-externs for
all tools altogether? By throwing it out of EXTRA_WARNINGS.

Vasily Gorbik (1):
  perf build: Allow nested externs to enable BUILD_BUG() usage

 tools/perf/Makefile.config | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

-- 
⢋⡀⣀⠹
⠠⣶⡦⠀
⣿⣿⣿⠏⣴⣮⣴⣧⠈⢿⣿⣿
⣿⣿⡏⢰⣿⠖⣠⣿⡆⠈⣿⣿
⣿⢛⣵⣄⠙⣶⣶⡟⣅⣠⠹⣿
⣿⣜⣛⠻⢎⣉⣉⣀⠿⣫⣵⣿


[PATCH 1/1] perf build: Allow nested externs to enable BUILD_BUG() usage

2020-10-08 Thread Vasily Gorbik
Currently BUILD_BUG() macro is expanded to smth like the following:
   do {
   extern void __compiletime_assert_0(void)
   __attribute__((error("BUILD_BUG failed")));
   if (!(!(1)))
   __compiletime_assert_0();
   } while (0);

If used in a function body this obviously would produce build errors
with -Wnested-externs and -Werror.

To enable BUILD_BUG() usage in tools/arch/x86/lib/insn.c which perf
includes in intel-pt-decoder, build perf without -Wnested-externs.

Reported-by: Stephen Rothwell 
Signed-off-by: Vasily Gorbik 
---
 tools/perf/Makefile.config | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 190be4fa5c21..8137a6046a47 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -16,7 +16,7 @@ $(shell printf "" > $(OUTPUT).config-detected)
 detected = $(shell echo "$(1)=y"   >> $(OUTPUT).config-detected)
 detected_var = $(shell echo "$(1)=$($(1))" >> $(OUTPUT).config-detected)
 
-CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS)
+CFLAGS := $(EXTRA_CFLAGS) $(filter-out -Wnested-externs,$(EXTRA_WARNINGS))
 
 include $(srctree)/tools/scripts/Makefile.arch
 
-- 
⢋⡀⣀⠹
⠠⣶⡦⠀
⣿⣿⣿⠏⣴⣮⣴⣧⠈⢿⣿⣿
⣿⣿⡏⢰⣿⠖⣠⣿⡆⠈⣿⣿
⣿⢛⣵⣄⠙⣶⣶⡟⣅⣠⠹⣿
⣿⣜⣛⠻⢎⣉⣉⣀⠿⣫⣵⣿


[PATCH] perf trace: Segfault when trying to trace events by cgroup

2020-10-08 Thread Stanislav Ivanichkin
 # ./perf trace -e sched:sched_switch -G test -a sleep 1
 perf: Segmentation fault
 Obtained 11 stack frames.
 ./perf(sighandler_dump_stack+0x43) [0x55cfdc636db3]
 /lib/x86_64-linux-gnu/libc.so.6(+0x3efcf) [0x7fd23eecafcf]
 ./perf(parse_cgroups+0x36) [0x55cfdc673f36]
 ./perf(+0x3186ed) [0x55cfdc70d6ed]
 ./perf(parse_options_subcommand+0x629) [0x55cfdc70e999]
 ./perf(cmd_trace+0x9c2) [0x55cfdc5ad6d2]
 ./perf(+0x1e8ae0) [0x55cfdc5ddae0]
 ./perf(+0x1e8ded) [0x55cfdc5ddded]
 ./perf(main+0x370) [0x55cfdc556f00]
 /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe6) [0x7fd23eeadb96]
 ./perf(_start+0x29) [0x55cfdc557389]
 Segmentation fault

 It happens because "struct trace" in option->value is passed to
 parse_cgroups function instead of "struct evlist".

Signed-off-by: Stanislav Ivanichkin 
Reviewed-by: Dmitry Monakhov 
---
 tools/perf/builtin-trace.c | 9 ++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index bea461b6f937..cbc4de6840db 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -4651,9 +4651,12 @@ static int trace__parse_cgroups(const struct option 
*opt, const char *str, int u
 {
struct trace *trace = opt->value;
 
-   if (!list_empty(&trace->evlist->core.entries))
-   return parse_cgroups(opt, str, unset);
-
+   if (!list_empty(&trace->evlist->core.entries)) {
+   struct option o = OPT_CALLBACK('G', "cgroup", &trace->evlist,
+   "name", "monitor event in cgroup name only",
+   parse_cgroups);
+   return parse_cgroups(&o, str, unset);
+   }
trace->cgroup = evlist__findnew_cgroup(trace->evlist, str);
 
return 0;
-- 
2.17.1



Re: [GIT PULL kcsan] KCSAN commits for v5.10

2020-10-08 Thread Ingo Molnar


* Paul E. McKenney  wrote:

> Hello, Ingo!
> 
> This pull request contains KCSAN updates for v5.10.  These have been
> subjected to LKML review, most recently here:
> 
>   https://lore.kernel.org/lkml/20200831181715.GA1530@paulmck-ThinkPad-P72
> 
> All of these have also been subjected to the kbuild test robot and
> -next testing.  The following changes since v5.9-rc1 are available in
> the git repository at:
> 
>   git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git kcsan
> 
> for you to fetch changes up to cd290ec24633f51029dab0d25505fae7da0e1eda:
> 
>   kcsan: Use tracing-safe version of prandom (2020-08-30 21:50:13 -0700)
> 
> 
> Marco Elver (19):
>   kcsan: Add support for atomic builtins
>   objtool: Add atomic builtin TSAN instrumentation to uaccess whitelist
>   kcsan: Add atomic builtin test case
>   kcsan: Support compounded read-write instrumentation
>   objtool, kcsan: Add __tsan_read_write to uaccess whitelist
>   kcsan: Skew delay to be longer for certain access types
>   kcsan: Add missing CONFIG_KCSAN_IGNORE_ATOMICS checks
>   kcsan: Test support for compound instrumentation
>   instrumented.h: Introduce read-write instrumentation hooks
>   asm-generic/bitops: Use instrument_read_write() where appropriate
>   locking/atomics: Use read-write instrumentation for atomic RMWs
>   kcsan: Simplify debugfs counter to name mapping
>   kcsan: Simplify constant string handling
>   kcsan: Remove debugfs test command
>   kcsan: Show message if enabled early
>   kcsan: Use pr_fmt for consistency
>   kcsan: Optimize debugfs stats counters
>   bitops, kcsan: Partially revert instrumentation for non-atomic bitops
>   kcsan: Use tracing-safe version of prandom
> 
>  include/asm-generic/atomic-instrumented.h  | 330 
> ++---
>  include/asm-generic/bitops/instrumented-atomic.h   |   6 +-
>  include/asm-generic/bitops/instrumented-lock.h |   2 +-
>  .../asm-generic/bitops/instrumented-non-atomic.h   |  30 +-
>  include/linux/instrumented.h   |  30 ++
>  include/linux/kcsan-checks.h   |  45 ++-
>  kernel/kcsan/core.c| 210 +++--
>  kernel/kcsan/debugfs.c | 130 ++--
>  kernel/kcsan/kcsan-test.c  | 128 +++-
>  kernel/kcsan/kcsan.h   |  12 +-
>  kernel/kcsan/report.c  |  10 +-
>  kernel/kcsan/selftest.c|   8 +-
>  lib/Kconfig.kcsan  |   5 +
>  scripts/Makefile.kcsan |   2 +-
>  scripts/atomic/gen-atomic-instrumented.sh  |  21 +-
>  tools/objtool/check.c  |  55 
>  16 files changed, 677 insertions(+), 347 deletions(-)

Pulled into tip:locking/core, thanks a lot Paul!

Ingo


[GIT PULL] MMC fixes for v5.9-rc9 (final)

2020-10-08 Thread Ulf Hansson
Hi Linus,

Here's a PR with an MMC fix intended for v5.9-rc9 (final). Details about the
highlights are as usual found in the signed tag.

Note that, this fix didn't get the time to cook in linux next. Although, the
patch is trivial and also well tested by the people being involved.

Please pull this in!

Kind regards
Ulf Hansson


The following changes since commit afd7f30886b0b445a4240a99020458a9772f2b89:

  mmc: sdhci: Workaround broken command queuing on Intel GLK based IRBIS models 
(2020-09-28 12:16:47 +0200)

are available in the Git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc.git tags/mmc-v5.9-rc4-4

for you to fetch changes up to 4243219141b67d7c2fdb2d8073c17c539b9263eb:

  mmc: core: don't set limits.discard_granularity as 0 (2020-10-09 08:26:09 
+0200)


MMC host:
 - Assign a proper discard granularity rather than incorrectly set it to 0


Coly Li (1):
  mmc: core: don't set limits.discard_granularity as 0

 drivers/mmc/core/queue.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)


Re: [PATCH v39 11/24] x86/sgx: Add SGX enclave driver

2020-10-08 Thread Jarkko Sakkinen
On Wed, Oct 07, 2020 at 09:26:55PM +0200, Greg KH wrote:
> On Wed, Oct 07, 2020 at 01:09:01PM -0500, Haitao Huang wrote:
> > > > > There is a patch that adds "sgx/provision".
> > > > 
> > > > What number in this series?
> > > 
> > > It's 15/24.
> > > 
> > 
> > Don't know if this is critical. I'd prefer to keep them as is. Directory
> > seems natural to me and makes sense to add more under the same dir in case
> > there are more to come.
> 
> Why is this so special that you need a subdirectory for a single driver
> with a mere 2 device nodes?  Do any other misc drivers have a new
> subdirectory in /dev/ for them?

Absolutely nothing as far as I'm concerned. Should have done that
already at the time when I switched to misc based on your feedback. I
was acting too reactive I guess. For sure I'll rename.

I also looked at encl->refcount with time. Instead of just "moving the
garbage up to the correct waste pit", I'll address that one by
refactoring it out and making the reclaimer thread to do the reaper's
job.

> thanks,
> 
> greg k-h

/Jarkko


[PATCH v6 1/2] PCI: dwc: Skip PCIE_MSI_INTR0* programming if MSI is disabled

2020-10-08 Thread Jisheng Zhang
If MSI is disabled, there's no need to program PCIE_MSI_INTR0_MASK
and PCIE_MSI_INTR0_ENABLE registers.

Signed-off-by: Jisheng Zhang 
Reviewed-by: Rob Herring 
Acked-by: Gustavo Pimentel 
---
 drivers/pci/controller/dwc/pcie-designware-host.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c 
b/drivers/pci/controller/dwc/pcie-designware-host.c
index 317ff512f8df..d3e9ea11ce9e 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -528,7 +528,7 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
 
dw_pcie_setup(pci);
 
-   if (!pp->ops->msi_host_init) {
+   if (pci_msi_enabled() && !pp->ops->msi_host_init) {
num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
 
/* Initialize IRQ Status array */
-- 
2.28.0



[PATCH v6 2/2] PCI: dwc: Fix MSI page leakage in suspend/resume

2020-10-08 Thread Jisheng Zhang
Currently, dw_pcie_msi_init() allocates and maps page for msi, then
program the PCIE_MSI_ADDR_LO and PCIE_MSI_ADDR_HI. The Root Complex
may lose power during suspend-to-RAM, so when we resume, we want to
redo the latter but not the former. If designware based driver (for
example, pcie-tegra194.c) calls dw_pcie_msi_init() in resume path, the
msi page will be leaked.

As pointed out by Rob and Ard, there's no need to allocate a page for
the MSI address, we could use an address in the driver data.

To avoid map the MSI msg again during resume, we move the map MSI msg
from dw_pcie_msi_init() to dw_pcie_host_init().

Suggested-by: Rob Herring 
Signed-off-by: Jisheng Zhang 
Reviewed-by: Rob Herring 
---
 drivers/pci/controller/dwc/pci-dra7xx.c   | 18 +-
 .../pci/controller/dwc/pcie-designware-host.c | 36 +--
 drivers/pci/controller/dwc/pcie-designware.h  |  2 +-
 3 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c 
b/drivers/pci/controller/dwc/pci-dra7xx.c
index 8f0b6d644e4b..6d012d2b1e90 100644
--- a/drivers/pci/controller/dwc/pci-dra7xx.c
+++ b/drivers/pci/controller/dwc/pci-dra7xx.c
@@ -466,7 +466,9 @@ static struct irq_chip dra7xx_pci_msi_bottom_irq_chip = {
 static int dra7xx_pcie_msi_host_init(struct pcie_port *pp)
 {
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
+   struct device *dev = pci->dev;
u32 ctrl, num_ctrls;
+   int ret;
 
pp->msi_irq_chip = &dra7xx_pci_msi_bottom_irq_chip;
 
@@ -482,7 +484,21 @@ static int dra7xx_pcie_msi_host_init(struct pcie_port *pp)
~0);
}
 
-   return dw_pcie_allocate_domains(pp);
+   ret = dw_pcie_allocate_domains(pp);
+   if (ret)
+   return ret;
+
+   pp->msi_data = dma_map_single_attrs(dev, &pp->msi_msg,
+  sizeof(pp->msi_msg),
+  DMA_FROM_DEVICE,
+  DMA_ATTR_SKIP_CPU_SYNC);
+   ret = dma_mapping_error(dev, pp->msi_data);
+   if (ret) {
+   dev_err(dev, "Failed to map MSI data\n");
+   pp->msi_data = 0;
+   dw_pcie_free_msi(pp);
+   }
+   return ret;
 }
 
 static const struct dw_pcie_host_ops dra7xx_pcie_host_ops = {
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c 
b/drivers/pci/controller/dwc/pcie-designware-host.c
index d3e9ea11ce9e..4db244596e79 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -266,29 +266,19 @@ void dw_pcie_free_msi(struct pcie_port *pp)
irq_domain_remove(pp->msi_domain);
irq_domain_remove(pp->irq_domain);
 
-   if (pp->msi_page)
-   __free_page(pp->msi_page);
+   if (pp->msi_data) {
+   struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
+   struct device *dev = pci->dev;
+
+   dma_unmap_single_attrs(dev, pp->msi_data, sizeof(pp->msi_msg),
+  DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
+   }
 }
 
 void dw_pcie_msi_init(struct pcie_port *pp)
 {
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
-   struct device *dev = pci->dev;
-   u64 msi_target;
-
-   if (!IS_ENABLED(CONFIG_PCI_MSI))
-   return;
-
-   pp->msi_page = alloc_page(GFP_KERNEL);
-   pp->msi_data = dma_map_page(dev, pp->msi_page, 0, PAGE_SIZE,
-   DMA_FROM_DEVICE);
-   if (dma_mapping_error(dev, pp->msi_data)) {
-   dev_err(dev, "Failed to map MSI data\n");
-   __free_page(pp->msi_page);
-   pp->msi_page = NULL;
-   return;
-   }
-   msi_target = (u64)pp->msi_data;
+   u64 msi_target = (u64)pp->msi_data;
 
/* Program the msi_data */
dw_pcie_writel_dbi(pci, PCIE_MSI_ADDR_LO, lower_32_bits(msi_target));
@@ -394,6 +384,16 @@ int dw_pcie_host_init(struct pcie_port *pp)
irq_set_chained_handler_and_data(pp->msi_irq,
dw_chained_msi_isr,
pp);
+
+   pp->msi_data = dma_map_single_attrs(pci->dev, 
&pp->msi_msg,
+ sizeof(pp->msi_msg),
+ DMA_FROM_DEVICE,
+ DMA_ATTR_SKIP_CPU_SYNC);
+   if (dma_mapping_error(pci->dev, pp->msi_data)) {
+   dev_err(pci->dev, "Failed to map MSI data\n");
+   pp->msi_data = 0;
+   goto err_free_msi;
+   }
} else {
ret = pp->ops->msi_host_init(pp);
if (ret < 0)
diff --git a/drivers/pc

[PATCH v6 0/2] PCI: dwc: fix two MSI issues

2020-10-08 Thread Jisheng Zhang
Fix two MSI issues. One to skip PCIE_MSI_INTR0* programming if MSI is
disabled, another to use an address in the driver data for MSI address,
to fix the MSI page leakage during suspend/resume.

Since v5:
  - rebase on pci/dwc branch
  - add Acked-by tag

Since v4:
  - fix pci-dra7xx.c

Since v3:
  - add Acked-by tag
  - change patch2 commit msg to make it clear
  - map the MSI msg with dma_map_single_attrs() for some platforms
which either has separate addrs for dma and phy or has mem access
limitation for the PCIe.

Since v2:
  - add Acked-by tag
  - use an address in the driver data for MSI address. Thank Ard and Rob
for pointing out this correct direction.
  - Since the MSI page has gone, the leak issue doesn't exist anymore,
remove unnecessary patches.
  - Remove dw_pcie_free_msi rename and the last patch. They could be
targeted to next. So will send out patches in a separate series.

Since v1:
  - add proper error handling patches.
  - solve the msi page leakage by moving dw_pcie_msi_init() from each
users to designware host

Jisheng Zhang (2):
  PCI: dwc: Skip PCIE_MSI_INTR0* programming if MSI is disabled
  PCI: dwc: Fix MSI page leakage in suspend/resume

 drivers/pci/controller/dwc/pci-dra7xx.c   | 18 -
 .../pci/controller/dwc/pcie-designware-host.c | 37 +--
 drivers/pci/controller/dwc/pcie-designware.h  |  2 +-
 3 files changed, 36 insertions(+), 21 deletions(-)

-- 
2.28.0



Question regarding ext4_journalled_aops: lack of migrate_page

2020-10-08 Thread Chris Goldsworthy

Hi there,

ext4_aops and ext4_da_aops both have a migratepage callback, whereas 
ext4_journalled_aops lacks such a callback.  Why is this so?  I’m asking 
this due to the following: when a page containing EXT4 journal buffer 
heads ends up being migrated, fallback_migrate_page() is used, which 
eventually calls try_to_free_buffers(), which will call drop_buffers().  
Drop buffers() can fail for a page if that page is on the LRU list (see 
https://elixir.bootlin.com/linux/v5.8.14/source/fs/buffer.c#L3225).   
Now, if buffer_migrate_page() was supplied as the migratepage callback 
for the journaled aops, this wouldn’t be problem since we ignore the LRU 
lists altogether.


Resolving this issue will benefit CMA allocations, which might have to 
migrate movable pages that were allocated from a CMA region (the 
assumption is that these pages can be migrated once the memory backing 
these pages is needed).


Thanks,

Chris.

--
The Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora 
Forum,

a Linux Foundation Collaborative Project


linux-next: manual merge of the kspp tree with Linus' tree

2020-10-08 Thread Stephen Rothwell
Hi all,

Today's linux-next merge of the kspp tree got a conflict in:

  lib/random32.c

between commit:

  09a6b0bc3be7 ("random32: Restore __latent_entropy attribute on 
net_rand_state")

from Linus' tree and commit:

  2ce6b0d4293b ("random32: Restore __latent_entropy attribute on 
net_rand_state")

from the kspp tree.

I fixed it up (I used Linus' version - just a white space difference)
and can carry the fix as necessary. This is now fixed as far as
linux-next is concerned, but any non trivial conflicts should be
mentioned to your upstream maintainer when your tree is submitted for
merging.  You may also want to consider cooperating with the maintainer
of the conflicting tree to minimise any particularly complex conflicts.

-- 
Cheers,
Stephen Rothwell


pgpRvmJNMpDhD.pgp
Description: OpenPGP digital signature


Re: [PATCH v3 1/5] fpga: dfl: rename the bus type "dfl" to "fpga-dfl"

2020-10-08 Thread Greg KH
On Fri, Oct 09, 2020 at 02:20:59PM +0800, Xu Yilun wrote:
> Hi Greg:
> 
> On Mon, Sep 28, 2020 at 09:19:00PM -0700, Moritz Fischer wrote:
> > Hi Xu,
> > 
> > On Tue, Sep 29, 2020 at 09:23:23AM +0800, Xu Yilun wrote:
> > > Hi moritz:
> > > 
> > > On Sun, Sep 27, 2020 at 04:36:47PM +0800, Xu Yilun wrote:
> > > > Hi Greg,
> > > > 
> > > > On Sun, Sep 27, 2020 at 09:54:01AM +0200, Greg KH wrote:
> > > > > On Sun, Sep 27, 2020 at 03:37:54PM +0800, Xu Yilun wrote:
> > > > > > Hi Greg,
> > > > > > 
> > > > > > On Sun, Sep 27, 2020 at 07:51:08AM +0200, Greg KH wrote:
> > > > > > > On Sat, Sep 26, 2020 at 12:22:19PM -0700, Moritz Fischer wrote:
> > > > > > > > Hi Greg,
> > > > > > > > 
> > > > > > > > On Sat, Sep 26, 2020 at 08:09:13AM +0200, Greg KH wrote:
> > > > > > > > > On Sat, Sep 26, 2020 at 10:23:46AM +0800, Xu Yilun wrote:
> > > > > > > > > > Hi greg,
> > > > > > > > > > 
> > > > > > > > > > About the bus naming, I summarized some questions we've 
> > > > > > > > > > discussed to check
> > > > > > > > > > with you. See inline.
> > > > > > > > > > 
> > > > > > > > > > On Thu, Sep 24, 2020 at 10:27:00AM -0700, Moritz Fischer 
> > > > > > > > > > wrote:
> > > > > > > > > > > Hi Xu,
> > > > > > > > > > > 
> > > > > > > > > > > On Fri, Sep 25, 2020 at 12:59:57AM +0800, Xu Yilun wrote:
> > > > > > > > > > > > Now the DFL device drivers could be made as independent 
> > > > > > > > > > > > modules and put
> > > > > > > > > > > > in different subsystems according to their 
> > > > > > > > > > > > functionalities. So the name
> > > > > > > > > > > > should be descriptive and unique in the whole kernel.
> > > > > > > > > > > > 
> > > > > > > > > > > > The patch changes the naming of dfl bus related 
> > > > > > > > > > > > structures, functions,
> > > > > > > > > > > > APIs and documentations.
> > > > > > > > > > > > 
> > > > > > > > > > > > Signed-off-by: Xu Yilun 
> > > > > > > > > > > > ---
> > > > > > > > > > > >  Documentation/ABI/testing/sysfs-bus-dfl  |  15 --
> > > > > > > > > > > >  Documentation/ABI/testing/sysfs-bus-fpga-dfl |  15 ++
> > > > > > > > > > > >  MAINTAINERS  |   2 +-
> > > > > > > > > > > >  drivers/fpga/dfl.c   | 254 
> > > > > > > > > > > > ++-
> > > > > > > > > > > >  drivers/fpga/dfl.h   |  77 
> > > > > > > > > > > > 
> > > > > > > > > > > >  5 files changed, 184 insertions(+), 179 deletions(-)
> > > > > > > > > > > >  delete mode 100644 
> > > > > > > > > > > > Documentation/ABI/testing/sysfs-bus-dfl
> > > > > > > > > > > >  create mode 100644 
> > > > > > > > > > > > Documentation/ABI/testing/sysfs-bus-fpga-dfl
> > > > > > > > > > > > 
> > > > > > > > > > > > diff --git a/Documentation/ABI/testing/sysfs-bus-dfl 
> > > > > > > > > > > > b/Documentation/ABI/testing/sysfs-bus-dfl
> > > > > > > > > > > > deleted file mode 100644
> > > > > > > > > > > > index 23543be..000
> > > > > > > > > > > > --- a/Documentation/ABI/testing/sysfs-bus-dfl
> > > > > > > > > > > > +++ /dev/null
> > > > > > > > > > > > @@ -1,15 +0,0 @@
> > > > > > > > > > > > -What:  /sys/bus/dfl/devices/dfl_dev.X/type
> > > > > > > > > > > > -Date:  Aug 2020
> > > > > > > > > > > > -KernelVersion: 5.10
> > > > > > > > > > > > -Contact:   Xu Yilun 
> > > > > > > > > > > > -Description:   Read-only. It returns type of DFL FIU 
> > > > > > > > > > > > of the device. Now DFL
> > > > > > > > > > > > -   supports 2 FIU types, 0 for FME, 1 for 
> > > > > > > > > > > > PORT.
> > > > > > > > > > > > -   Format: 0x%x
> > > > > > > > > > > > -
> > > > > > > > > > > > -What:  
> > > > > > > > > > > > /sys/bus/dfl/devices/dfl_dev.X/feature_id
> > > > > > > > > > > > -Date:  Aug 2020
> > > > > > > > > > > > -KernelVersion: 5.10
> > > > > > > > > > > > -Contact:   Xu Yilun 
> > > > > > > > > > > > -Description:   Read-only. It returns feature 
> > > > > > > > > > > > identifier local to its DFL FIU
> > > > > > > > > > > > -   type.
> > > > > > > > > > > > -   Format: 0x%x
> > > > > > > > > > > 
> > > > > > > > > > > You're changing userland facing ABI. I think that's 
> > > > > > > > > > > something to avoid,
> > > > > > > > > > > please check with Greg on the rules since this hasn't 
> > > > > > > > > > > been in a release yet.
> > > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > I'm going to change the name of bus stuff for other 
> > > > > > > > > > subsystems, to be
> > > > > > > > > > aligned, I also consider change the bus_type.name and dfl 
> > > > > > > > > > dev_name. But
> > > > > > > > > > it will cause the changing of user ABIs. No user case for 
> > > > > > > > > > these user ABI
> > > > > > > > > > now cause they are just queued, is it good I change them?
> > > > > > > > > 
> > > > > > > > > Why change the user name here?  No need for that, right?  
> > > > > > > > > Unless you
> > > > > > > > > really want to

[tip: core/rcu] rcu/segcblist: Prevent useless GP start if no CBs to accelerate

2020-10-08 Thread tip-bot2 for Joel Fernandes (Google)
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 53922270d21de707a1a0ffaf1e07644e77fcb8db
Gitweb:
https://git.kernel.org/tip/53922270d21de707a1a0ffaf1e07644e77fcb8db
Author:Joel Fernandes (Google) 
AuthorDate:Thu, 18 Jun 2020 16:29:49 -04:00
Committer: Paul E. McKenney 
CommitterDate: Thu, 03 Sep 2020 09:39:59 -07:00

rcu/segcblist: Prevent useless GP start if no CBs to accelerate

The rcu_segcblist_accelerate() function returns true iff it is necessary
to request another grace period.  A tracing session showed that this
function unnecessarily requests grace periods.

For example, consider the following sequence of events:
1. Callbacks are queued only on the NEXT segment of CPU A's callback list.
2. CPU A runs RCU_SOFTIRQ, accelerating these callbacks from NEXT to WAIT.
3. Thus rcu_segcblist_accelerate() returns true, requesting grace period N.
4. RCU's grace-period kthread wakes up on CPU B and starts grace period N.
4. CPU A notices the new grace period and invokes RCU_SOFTIRQ.
5. CPU A's RCU_SOFTIRQ again invokes rcu_segcblist_accelerate(), but
   there are no new callbacks.  However, rcu_segcblist_accelerate()
   nevertheless (uselessly) requests a new grace period N+1.

This extra grace period results in additional lock contention and also
additional wakeups, all for no good reason.

This commit therefore adds a check to rcu_segcblist_accelerate() that
prevents the return of true when there are no new callbacks.

This change reduces the number of grace periods (GPs) and wakeups in each
of eleven five-second rcutorture runs as follows:

++---+---+
| #  | Number of GPs | Number of Wakeups |
++=+=+=+=+
| 1  | With| Without | With| Without |
++-+-+-+-+
| 2  |  75 |  89 | 113 | 119 |
++-+-+-+-+
| 3  |  62 |  91 | 105 | 123 |
++-+-+-+-+
| 4  |  60 |  79 |  98 | 110 |
++-+-+-+-+
| 5  |  63 |  79 |  99 | 112 |
++-+-+-+-+
| 6  |  57 |  89 |  96 | 123 |
++-+-+-+-+
| 7  |  64 |  85 |  97 | 118 |
++-+-+-+-+
| 8  |  58 |  83 |  98 | 113 |
++-+-+-+-+
| 9  |  57 |  77 |  89 | 104 |
++-+-+-+-+
| 10 |  66 |  82 |  98 | 119 |
++-+-+-+-+
| 11 |  52 |  82 |  83 | 117 |
++-+-+-+-+

The reduction in the number of wakeups ranges from 5% to 40%.

Cc: ure...@gmail.com
[ paulmck: Rework commit log and comment. ]
Signed-off-by: Joel Fernandes (Google) 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/rcu_segcblist.c | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/kernel/rcu/rcu_segcblist.c b/kernel/rcu/rcu_segcblist.c
index 9a0f661..2d2a6b6 100644
--- a/kernel/rcu/rcu_segcblist.c
+++ b/kernel/rcu/rcu_segcblist.c
@@ -475,8 +475,16 @@ bool rcu_segcblist_accelerate(struct rcu_segcblist *rsclp, 
unsigned long seq)
 * Also advance to the oldest segment of callbacks whose
 * ->gp_seq[] completion is at or after that passed in via "seq",
 * skipping any empty segments.
+*
+* Note that segment "i" (and any lower-numbered segments
+* containing older callbacks) will be unaffected, and their
+* grace-period numbers remain unchanged.  For example, if i ==
+* WAIT_TAIL, then neither WAIT_TAIL nor DONE_TAIL will be touched.
+* Instead, the CBs in NEXT_TAIL will be merged with those in
+* NEXT_READY_TAIL and the grace-period number of NEXT_READY_TAIL
+* would be updated.  NEXT_TAIL would then be empty.
 */
-   if (++i >= RCU_NEXT_TAIL)
+   if (rcu_segcblist_restempty(rsclp, i) || ++i >= RCU_NEXT_TAIL)
return false;
 
/*


[tip: core/rcu] rcutorture: Allow pointer leaks to test diagnostic code

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: d685514260e21aabd65a9aa8be045766bdaa0549
Gitweb:
https://git.kernel.org/tip/d685514260e21aabd65a9aa8be045766bdaa0549
Author:Paul E. McKenney 
AuthorDate:Tue, 11 Aug 2020 10:33:39 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:36 -07:00

rcutorture: Allow pointer leaks to test diagnostic code

This commit adds an rcutorture.leakpointer module parameter that
intentionally leaks an RCU-protected pointer out of the RCU read-side
critical section and checks to see if the corresponding grace period
has elapsed, emitting a WARN_ON_ONCE() if so.  This module parameter can
be used to test facilities like CONFIG_RCU_STRICT_GRACE_PERIOD that end
grace periods quickly.

While in the area, also document rcutorture.irqreader, which was
previously left out.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 Documentation/admin-guide/kernel-parameters.txt | 12 
 kernel/rcu/rcutorture.c |  4 
 2 files changed, 16 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index bdc1f33..6d984f1 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4269,6 +4269,18 @@
are zero, rcutorture acts as if is interpreted
they are all non-zero.
 
+   rcutorture.irqreader= [KNL]
+   Run RCU readers from irq handlers, or, more
+   accurately, from a timer handler.  Not all RCU
+   flavors take kindly to this sort of thing.
+
+   rcutorture.leakpointer= [KNL]
+   Leak an RCU-protected pointer out of the reader.
+   This can of course result in splats, and is
+   intended to test the ability of things like
+   CONFIG_RCU_STRICT_GRACE_PERIOD=y to detect
+   such leaks.
+
rcutorture.n_barrier_cbs= [KNL]
Set callbacks/threads for rcu_barrier() testing.
 
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 983f82f..916ea4f 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -87,6 +87,7 @@ torture_param(bool, gp_normal, false,
 "Use normal (non-expedited) GP wait primitives");
 torture_param(bool, gp_sync, false, "Use synchronous GP wait primitives");
 torture_param(int, irqreader, 1, "Allow RCU readers from irq handlers");
+torture_param(int, leakpointer, 0, "Leak pointer dereferences from readers");
 torture_param(int, n_barrier_cbs, 0,
 "# of callbacks/kthreads for barrier testing");
 torture_param(int, nfakewriters, 4, "Number of RCU fake writer threads");
@@ -1401,6 +1402,9 @@ static bool rcu_torture_one_read(struct 
torture_random_state *trsp)
preempt_enable();
rcutorture_one_extend(&readstate, 0, trsp, rtrsp);
WARN_ON_ONCE(readstate & RCUTORTURE_RDR_MASK);
+   // This next splat is expected behavior if leakpointer, especially
+   // for CONFIG_RCU_STRICT_GRACE_PERIOD=y kernels.
+   WARN_ON_ONCE(leakpointer && READ_ONCE(p->rtort_pipe_count) > 1);
 
/* If error or close call, record the sequence of reader protections. */
if ((pipe_count > 1 || completed > 1) && !xchg(&err_segs_recorded, 1)) {


[tip: core/rcu] torture: Update initrd documentation

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 33595581f53011d1f0ba64a9a2f76d6fa5528f7f
Gitweb:
https://git.kernel.org/tip/33595581f53011d1f0ba64a9a2f76d6fa5528f7f
Author:Paul E. McKenney 
AuthorDate:Mon, 13 Jul 2020 14:18:33 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:33 -07:00

torture: Update initrd documentation

The rcu-test-image.txt documentation covers a very uncommon case where
a real userspace environment is required.  However, someone reading this
document might reasonably conclude that this is in fact a prerequisite.
In addition, the initrd.txt file mentions dracut, which is no longer used.
This commit therefore provides the needed updates.

Signed-off-by: Paul E. McKenney 
---
 tools/testing/selftests/rcutorture/doc/initrd.txt | 36 +--
 tools/testing/selftests/rcutorture/doc/rcu-test-image.txt | 35 ++-
 2 files changed, 37 insertions(+), 34 deletions(-)

diff --git a/tools/testing/selftests/rcutorture/doc/initrd.txt 
b/tools/testing/selftests/rcutorture/doc/initrd.txt
index 933b4fd..41a4255 100644
--- a/tools/testing/selftests/rcutorture/doc/initrd.txt
+++ b/tools/testing/selftests/rcutorture/doc/initrd.txt
@@ -1,12 +1,11 @@
-The rcutorture scripting tools automatically create the needed initrd
-directory using dracut.  Failing that, this tool will create an initrd
-containing a single statically linked binary named "init" that loops
-over a very long sleep() call.  In both cases, this creation is done
-by tools/testing/selftests/rcutorture/bin/mkinitrd.sh.
+The rcutorture scripting tools automatically create an initrd containing
+a single statically linked binary named "init" that loops over a
+very long sleep() call.  In both cases, this creation is done by
+tools/testing/selftests/rcutorture/bin/mkinitrd.sh.
 
-However, if you are attempting to run rcutorture on a system that does
-not have dracut installed, and if you don't like the notion of static
-linking, you might wish to press an existing initrd into service:
+However, if you don't like the notion of statically linked bare-bones
+userspace environments, you might wish to press an existing initrd
+into service:
 
 
 cd tools/testing/selftests/rcutorture
@@ -15,24 +14,3 @@ mkdir initrd
 cd initrd
 cpio -id < /tmp/initrd.img.zcat
 # Manually verify that initrd contains needed binaries and libraries.
-
-
-Interestingly enough, if you are running rcutorture, you don't really
-need userspace in many cases.  Running without userspace has the
-advantage of allowing you to test your kernel independently of the
-distro in place, the root-filesystem layout, and so on.  To make this
-happen, put the following script in the initrd's tree's "/init" file,
-with 0755 mode.
-
-
-#!/bin/sh
-
-while :
-do
-   sleep 10
-done
-
-
-This approach also allows most of the binaries and libraries in the
-initrd filesystem to be dispensed with, which can save significant
-space in rcutorture's "res" directory.
diff --git a/tools/testing/selftests/rcutorture/doc/rcu-test-image.txt 
b/tools/testing/selftests/rcutorture/doc/rcu-test-image.txt
index cc280ba..b2fc247 100644
--- a/tools/testing/selftests/rcutorture/doc/rcu-test-image.txt
+++ b/tools/testing/selftests/rcutorture/doc/rcu-test-image.txt
@@ -1,8 +1,33 @@
-This document describes one way to create the rcu-test-image file
-that contains the filesystem used by the guest-OS kernel.  There are
-probably much better ways of doing this, and this filesystem could no
-doubt be smaller.  It is probably also possible to simply download
-an appropriate image from any number of places.
+Normally, a minimal initrd is created automatically by the rcutorture
+scripting.  But minimal really does mean "minimal", namely just a single
+root directory with a single statically linked executable named "init":
+
+$ size tools/testing/selftests/rcutorture/initrd/init
+   textdata bss dec hex filename
+328   0   8 336 150 
tools/testing/selftests/rcutorture/initrd/init
+
+Suppose you need to run some scripts, perhaps to monitor or control
+some aspect of the rcutorture testing.  This will require a more fully
+filled-out userspace, perhaps containing libraries, executables for
+the shell and other utilities, and soforth.  In that case, place your
+desired filesystem here:
+
+   tools/testing/selftests/rcutorture/initrd
+
+For example, your tools/testing/selftests/rcutorture/initrd/init might
+be a script that does any needed mount operations and starts whatever
+scripts need starting to properly monitor or control your testing.
+The next rcutorture build will then incorporate this filesystem into

[tip: core/rcu] torture: Add kvm.sh --help and update help message

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 5461808889405de254ab3370aa7f07ac0b6cb938
Gitweb:
https://git.kernel.org/tip/5461808889405de254ab3370aa7f07ac0b6cb938
Author:Paul E. McKenney 
AuthorDate:Sun, 19 Jul 2020 12:17:53 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:34 -07:00

torture: Add kvm.sh --help and update help message

This commit adds a --help argument (along with its synonym -h) to display
the help text.  While in the area, this commit also updates the help text.

Signed-off-by: Paul E. McKenney 
---
 tools/testing/selftests/rcutorture/bin/kvm.sh | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/rcutorture/bin/kvm.sh 
b/tools/testing/selftests/rcutorture/bin/kvm.sh
index 0a08463..fc15b52 100755
--- a/tools/testing/selftests/rcutorture/bin/kvm.sh
+++ b/tools/testing/selftests/rcutorture/bin/kvm.sh
@@ -56,17 +56,18 @@ usage () {
echo "   --defconfig string"
echo "   --dryrun sched|script"
echo "   --duration minutes"
+   echo "   --help"
echo "   --interactive"
echo "   --jitter N [ maxsleep (us) [ maxspin (us) ] ]"
echo "   --kconfig Kconfig-options"
echo "   --kmake-arg kernel-make-arguments"
echo "   --mac nn:nn:nn:nn:nn:nn"
-   echo "   --memory megabytes | nnnG"
+   echo "   --memory megabytes|nnnG"
echo "   --no-initrd"
echo "   --qemu-args qemu-arguments"
echo "   --qemu-cmd qemu-system-..."
echo "   --results absolute-pathname"
-   echo "   --torture rcu"
+   echo "   --torture lock|rcu|rcuperf|refscale|scf"
echo "   --trust-make"
exit 1
 }
@@ -127,6 +128,9 @@ do
dur=$(($2*60))
shift
;;
+   --help|-h)
+   usage
+   ;;
--interactive)
TORTURE_QEMU_INTERACTIVE=1; export TORTURE_QEMU_INTERACTIVE
;;


Re: [PATCH] mm: mmap: Fix general protection fault in unlink_file_vma()

2020-10-08 Thread linmiaohe
Andrew Morton  wrote:
> On Thu, 8 Oct 2020 07:17:18 + linmiaohe  wrote:
>
>> Andrew Morton  wrote:
>> > On Wed, 16 Sep 2020 05:07:33 -0400 Miaohe Lin  wrote:
>> >
>> >> The syzbot reported the below general protection fault:
>>
>> >
>> >is this using the correct file?  I think it is, but please do check.
>> >
>> 
>> Many thanks for your reply.
>> 
>> Yes, I think so too. We do deny_write_access and mapping_map_writable on 
>> @file, so we should undo all of this on @file.
>> Since @file is unchanged over the second vma_merge() time, we'are using the 
>> correct @file to undo our temporary denial count.
>> 
>> But how should I check this explicitly ? I can't find out a way to do this. 
>> Could you please figure it out for me?
>
>I meant "please check (review) the code as it now is", not "please add a 
>check" ;)
>

Oh, I see. I have reviewed the code carefully. The @file should be right one as 
I explained in previous email. ;)

Have a good day! ^_^



[tip: core/rcu] rcutorture: Replace HTTP links with HTTPS ones

2020-10-08 Thread tip-bot2 for Alexander A. Klimov
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: afcdf2319d11e0d68e45babd5df65f79771074b5
Gitweb:
https://git.kernel.org/tip/afcdf2319d11e0d68e45babd5df65f79771074b5
Author:Alexander A. Klimov 
AuthorDate:Mon, 13 Jul 2020 21:37:06 +02:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:32 -07:00

rcutorture: Replace HTTP links with HTTPS ones

Rationale:
Reduces attack surface on kernel devs opening the links for MITM
as HTTPS traffic is much harder to manipulate.

Deterministic algorithm:
For each file:
  If not .svg:
For each line:
  If doesn't contain `\bxmlns\b`:
For each link, `\bhttp://[^# \t\r\n]*(?:\w|/)`:
  If neither `\bgnu\.org/license`, nor `\bmozilla\.org/MPL\b`:
If both the HTTP and HTTPS versions
return 200 OK and serve the same content:
  Replace HTTP with HTTPS.

Signed-off-by: Alexander A. Klimov 
Signed-off-by: Paul E. McKenney 
---
 tools/testing/selftests/rcutorture/doc/rcu-test-image.txt | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/rcutorture/doc/rcu-test-image.txt 
b/tools/testing/selftests/rcutorture/doc/rcu-test-image.txt
index 449cf57..cc280ba 100644
--- a/tools/testing/selftests/rcutorture/doc/rcu-test-image.txt
+++ b/tools/testing/selftests/rcutorture/doc/rcu-test-image.txt
@@ -36,7 +36,7 @@ References:
https://help.ubuntu.com/community/JeOSVMBuilder
http://wiki.libvirt.org/page/UbuntuKVMWalkthrough

http://www.moe.co.uk/2011/01/07/pci_add_option_rom-failed-to-find-romfile-pxe-rtl8139-bin/
 -- "apt-get install kvm-pxe"
-   http://www.landley.net/writing/rootfs-howto.html
-   http://en.wikipedia.org/wiki/Initrd
-   http://en.wikipedia.org/wiki/Cpio
+   https://www.landley.net/writing/rootfs-howto.html
+   https://en.wikipedia.org/wiki/Initrd
+   https://en.wikipedia.org/wiki/Cpio
http://wiki.libvirt.org/page/UbuntuKVMWalkthrough


[tip: core/rcu] rcutorture: Add CONFIG_PROVE_RCU_LIST to TREE05

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: fc848cf4face352dce663c1fcc73717fba2d4557
Gitweb:
https://git.kernel.org/tip/fc848cf4face352dce663c1fcc73717fba2d4557
Author:Paul E. McKenney 
AuthorDate:Tue, 14 Jul 2020 11:02:15 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:33 -07:00

rcutorture: Add CONFIG_PROVE_RCU_LIST to TREE05

Currently, the CONFIG_PROVE_RCU_LIST=y case is untested.  This commit
therefore adds CONFIG_PROVE_RCU_LIST=y to rcutorture's TREE05 scenario.

Cc: Madhuparna Bhowmik 
Cc: Joel Fernandes (Google) 
Signed-off-by: Paul E. McKenney 
---
 tools/testing/selftests/rcutorture/configs/rcu/TREE05 | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE05 
b/tools/testing/selftests/rcutorture/configs/rcu/TREE05
index 2dde0d9..4f95f85 100644
--- a/tools/testing/selftests/rcutorture/configs/rcu/TREE05
+++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE05
@@ -16,5 +16,6 @@ CONFIG_RCU_NOCB_CPU=y
 CONFIG_DEBUG_LOCK_ALLOC=y
 CONFIG_PROVE_LOCKING=y
 #CHECK#CONFIG_PROVE_RCU=y
+CONFIG_PROVE_RCU_LIST=y
 CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
 CONFIG_RCU_EXPERT=y


[tip: core/rcu] kernel/smp: Provide CSD lock timeout diagnostics

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 35feb60474bf4f7fa7840e14fc7fd344996b919d
Gitweb:
https://git.kernel.org/tip/35feb60474bf4f7fa7840e14fc7fd344996b919d
Author:Paul E. McKenney 
AuthorDate:Tue, 30 Jun 2020 13:22:54 -07:00
Committer: Paul E. McKenney 
CommitterDate: Fri, 04 Sep 2020 11:52:50 -07:00

kernel/smp: Provide CSD lock timeout diagnostics

This commit causes csd_lock_wait() to emit diagnostics when a CPU
fails to respond quickly enough to one of the smp_call_function()
family of function calls.  These diagnostics are enabled by a new
CSD_LOCK_WAIT_DEBUG Kconfig option that depends on DEBUG_KERNEL.

This commit was inspired by an earlier patch by Josef Bacik.

[ paulmck: Fix for syzbot+0f719294463916a3f...@syzkaller.appspotmail.com ]
[ paulmck: Fix KASAN use-after-free issue reported by Qian Cai. ]
[ paulmck: Fix botched nr_cpu_ids comparison per Dan Carpenter. ]
[ paulmck: Apply Peter Zijlstra feedback. ]
Link: https://lore.kernel.org/lkml/42f21905a991e...@google.com
Link: https://lore.kernel.org/lkml/2ef21705a9933...@google.com
Cc: Peter Zijlstra 
Cc: Ingo Molnar 
Cc: Thomas Gleixner 
Cc: Sebastian Andrzej Siewior 
Signed-off-by: Paul E. McKenney 
---
 kernel/smp.c  | 132 -
 lib/Kconfig.debug |  11 -
 2 files changed, 141 insertions(+), 2 deletions(-)

diff --git a/kernel/smp.c b/kernel/smp.c
index 865a876..c5d3188 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -20,6 +20,9 @@
 #include 
 #include 
 #include 
+#include 
+#include 
+#include 
 
 #include "smpboot.h"
 #include "sched/smp.h"
@@ -96,6 +99,103 @@ void __init call_function_init(void)
smpcfd_prepare_cpu(smp_processor_id());
 }
 
+#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG
+
+static DEFINE_PER_CPU(call_single_data_t *, cur_csd);
+static DEFINE_PER_CPU(smp_call_func_t, cur_csd_func);
+static DEFINE_PER_CPU(void *, cur_csd_info);
+
+#define CSD_LOCK_TIMEOUT (5ULL * NSEC_PER_SEC)
+atomic_t csd_bug_count = ATOMIC_INIT(0);
+
+/* Record current CSD work for current CPU, NULL to erase. */
+static void csd_lock_record(call_single_data_t *csd)
+{
+   if (!csd) {
+   smp_mb(); /* NULL cur_csd after unlock. */
+   __this_cpu_write(cur_csd, NULL);
+   return;
+   }
+   __this_cpu_write(cur_csd_func, csd->func);
+   __this_cpu_write(cur_csd_info, csd->info);
+   smp_wmb(); /* func and info before csd. */
+   __this_cpu_write(cur_csd, csd);
+   smp_mb(); /* Update cur_csd before function call. */
+ /* Or before unlock, as the case may be. */
+}
+
+static __always_inline int csd_lock_wait_getcpu(call_single_data_t *csd)
+{
+   unsigned int csd_type;
+
+   csd_type = CSD_TYPE(csd);
+   if (csd_type == CSD_TYPE_ASYNC || csd_type == CSD_TYPE_SYNC)
+   return csd->dst; /* Other CSD_TYPE_ values might not have 
->dst. */
+   return -1;
+}
+
+/*
+ * Complain if too much time spent waiting.  Note that only
+ * the CSD_TYPE_SYNC/ASYNC types provide the destination CPU,
+ * so waiting on other types gets much less information.
+ */
+static __always_inline bool csd_lock_wait_toolong(call_single_data_t *csd, u64 
ts0, u64 *ts1, int *bug_id)
+{
+   int cpu = -1;
+   int cpux;
+   bool firsttime;
+   u64 ts2, ts_delta;
+   call_single_data_t *cpu_cur_csd;
+   unsigned int flags = READ_ONCE(csd->flags);
+
+   if (!(flags & CSD_FLAG_LOCK)) {
+   if (!unlikely(*bug_id))
+   return true;
+   cpu = csd_lock_wait_getcpu(csd);
+   pr_alert("csd: CSD lock (#%d) got unstuck on CPU#%02d, CPU#%02d 
released the lock.\n",
+*bug_id, raw_smp_processor_id(), cpu);
+   return true;
+   }
+
+   ts2 = sched_clock();
+   ts_delta = ts2 - *ts1;
+   if (likely(ts_delta <= CSD_LOCK_TIMEOUT))
+   return false;
+
+   firsttime = !*bug_id;
+   if (firsttime)
+   *bug_id = atomic_inc_return(&csd_bug_count);
+   cpu = csd_lock_wait_getcpu(csd);
+   if (WARN_ONCE(cpu < 0 || cpu >= nr_cpu_ids, "%s: cpu = %d\n", __func__, 
cpu))
+   cpux = 0;
+   else
+   cpux = cpu;
+   cpu_cur_csd = smp_load_acquire(&per_cpu(cur_csd, cpux)); /* Before func 
and info. */
+   pr_alert("csd: %s non-responsive CSD lock (#%d) on CPU#%d, waiting %llu 
ns for CPU#%02d %pS(%ps).\n",
+firsttime ? "Detected" : "Continued", *bug_id, 
raw_smp_processor_id(), ts2 - ts0,
+cpu, csd->func, csd->info);
+   if (cpu_cur_csd && csd != cpu_cur_csd) {
+   pr_alert("\tcsd: CSD lock (#%d) handling prior %pS(%ps) 
request.\n",
+*bug_id, READ_ONCE(per_cpu(cur_csd_func, cpux)),
+READ_ONCE(per_cpu(cur_csd_info, cpux)));
+   } else {
+   pr_alert("\tcsd: CSD lock (#%d)

[tip: core/rcu] locktorture: Make function torture_percpu_rwsem_init() static

2020-10-08 Thread tip-bot2 for Wei Yongjun
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: d49bed9abc3454bd123cbe974ecbeae119701b92
Gitweb:
https://git.kernel.org/tip/d49bed9abc3454bd123cbe974ecbeae119701b92
Author:Wei Yongjun 
AuthorDate:Fri, 03 Jul 2020 13:05:27 +08:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:32 -07:00

locktorture: Make function torture_percpu_rwsem_init() static

The sparse tool complains as follows:

kernel/locking/locktorture.c:569:6: warning:
 symbol 'torture_percpu_rwsem_init' was not declared. Should it be static?

And this function is not used outside of locktorture.c,
so this commit marks it static.

Signed-off-by: Wei Yongjun 
Signed-off-by: Paul E. McKenney 
---
 kernel/locking/locktorture.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c
index 9cfa5e8..62d215b 100644
--- a/kernel/locking/locktorture.c
+++ b/kernel/locking/locktorture.c
@@ -566,7 +566,7 @@ static struct lock_torture_ops rwsem_lock_ops = {
 #include 
 static struct percpu_rw_semaphore pcpu_rwsem;
 
-void torture_percpu_rwsem_init(void)
+static void torture_percpu_rwsem_init(void)
 {
BUG_ON(percpu_init_rwsem(&pcpu_rwsem));
 }


[tip: core/rcu] rcu: Reduce leaf fanout for strict RCU grace periods

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: dc1269186bed3afc5a2018527516be84fe55d3e0
Gitweb:
https://git.kernel.org/tip/dc1269186bed3afc5a2018527516be84fe55d3e0
Author:Paul E. McKenney 
AuthorDate:Wed, 05 Aug 2020 16:52:17 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:23 -07:00

rcu: Reduce leaf fanout for strict RCU grace periods

Because strict RCU grace periods will complete more quickly, they will
experience greater lock contention on each leaf rcu_node structure's
->lock.  This commit therefore reduces the leaf fanout in order to reduce
this lock contention.

Note that this also has the effect of reducing the number of CPUs
supported to 16 in the case of CONFIG_RCU_FANOUT_LEAF=2 or 81 in the
case of CONFIG_RCU_FANOUT_LEAF=3.  However, greater numbers of CPUs are
probably a bad idea when using CONFIG_RCU_STRICT_GRACE_PERIOD=y.  Those
wishing to live dangerously are free to edit their kernel/rcu/Kconfig
files accordingly.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/Kconfig | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig
index 0ebe15a..b71e21f 100644
--- a/kernel/rcu/Kconfig
+++ b/kernel/rcu/Kconfig
@@ -135,10 +135,12 @@ config RCU_FANOUT
 
 config RCU_FANOUT_LEAF
int "Tree-based hierarchical RCU leaf-level fanout value"
-   range 2 64 if 64BIT
-   range 2 32 if !64BIT
+   range 2 64 if 64BIT && !RCU_STRICT_GRACE_PERIOD
+   range 2 32 if !64BIT && !RCU_STRICT_GRACE_PERIOD
+   range 2 3 if RCU_STRICT_GRACE_PERIOD
depends on TREE_RCU && RCU_EXPERT
-   default 16
+   default 16 if !RCU_STRICT_GRACE_PERIOD
+   default 2 if RCU_STRICT_GRACE_PERIOD
help
  This option controls the leaf-level fanout of hierarchical
  implementations of RCU, and allows trading off cache misses


[tip: core/rcu] rcu: Attempt QS when CPU discovers GP for strict GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 1a2f5d57a33f7b9189b6b3e997eb858301482d79
Gitweb:
https://git.kernel.org/tip/1a2f5d57a33f7b9189b6b3e997eb858301482d79
Author:Paul E. McKenney 
AuthorDate:Thu, 06 Aug 2020 16:35:08 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:26 -07:00

rcu: Attempt QS when CPU discovers GP for strict GPs

A given CPU normally notes a new grace period during one RCU_SOFTIRQ,
but avoids reporting the corresponding quiescent state until some later
RCU_SOFTIRQ.  This leisurly approach improves efficiency by increasing
the number of update requests served by each grace period, but is not
what is needed for kernels built with CONFIG_RCU_STRICT_GRACE_PERIOD=y.

This commit therefore adds a new rcu_strict_gp_check_qs() function
which, in CONFIG_RCU_STRICT_GRACE_PERIOD=y kernels, simply enters and
immediately exist an RCU read-side critical section.  If the CPU is
in a quiescent state, the rcu_read_unlock() will attempt to report an
immediate quiescent state.  This rcu_strict_gp_check_qs() function is
invoked from note_gp_changes(), so that a CPU just noticing a new grace
period might immediately report a quiescent state for that grace period.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 14 ++
 1 file changed, 14 insertions(+)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 4436857..36a860c 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1575,6 +1575,19 @@ static void __maybe_unused rcu_advance_cbs_nowake(struct 
rcu_node *rnp,
 }
 
 /*
+ * In CONFIG_RCU_STRICT_GRACE_PERIOD=y kernels, attempt to generate a
+ * quiescent state.  This is intended to be invoked when the CPU notices
+ * a new grace period.
+ */
+static void rcu_strict_gp_check_qs(void)
+{
+   if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD)) {
+   rcu_read_lock();
+   rcu_read_unlock();
+   }
+}
+
+/*
  * Update CPU-local rcu_data state to record the beginnings and ends of
  * grace periods.  The caller must hold the ->lock of the leaf rcu_node
  * structure corresponding to the current CPU, and must have irqs disabled.
@@ -1644,6 +1657,7 @@ static void note_gp_changes(struct rcu_data *rdp)
}
needwake = __note_gp_changes(rnp, rdp);
raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
+   rcu_strict_gp_check_qs();
if (needwake)
rcu_gp_kthread_wake();
 }


[tip: core/rcu] rcutorture: Output number of elapsed grace periods

2020-10-08 Thread tip-bot2 for Joel Fernandes (Google)
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 959954df0ca7da2111c3fb67a81798d15b9d
Gitweb:
https://git.kernel.org/tip/959954df0ca7da2111c3fb67a81798d15b9d
Author:Joel Fernandes (Google) 
AuthorDate:Thu, 18 Jun 2020 16:29:55 -04:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:31 -07:00

rcutorture: Output number of elapsed grace periods

This commit adds code to print the grace-period number at the start
of the test along with both the grace-period number and the number of
elapsed grace periods at the end of the test.  Note that variants of
RCU)without the notion of a grace-period number (for example, Tiny RCU)
just print zeroes.

[ paulmck: Adjust commit log. ]
Signed-off-by: Joel Fernandes (Google) 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/rcutorture.c | 13 +++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index db37861..c8206ff 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -172,6 +172,7 @@ static long n_barrier_successes; /* did rcu_barrier test 
succeed? */
 static unsigned long n_read_exits;
 static struct list_head rcu_torture_removed;
 static unsigned long shutdown_jiffies;
+static unsigned long start_gp_seq;
 
 static int rcu_torture_writer_state;
 #define RTWS_FIXED_DELAY   0
@@ -2469,8 +2470,9 @@ rcu_torture_cleanup(void)
 
rcutorture_get_gp_data(cur_ops->ttype, &flags, &gp_seq);
srcutorture_get_gp_data(cur_ops->ttype, srcu_ctlp, &flags, &gp_seq);
-   pr_alert("%s:  End-test grace-period state: g%lu f%#x\n",
-cur_ops->name, gp_seq, flags);
+   pr_alert("%s:  End-test grace-period state: g%ld f%#x total-gps=%ld\n",
+cur_ops->name, (long)gp_seq, flags,
+rcutorture_seq_diff(gp_seq, start_gp_seq));
torture_stop_kthread(rcu_torture_stats, stats_task);
torture_stop_kthread(rcu_torture_fqs, fqs_task);
if (rcu_torture_can_boost())
@@ -2594,6 +2596,8 @@ rcu_torture_init(void)
long i;
int cpu;
int firsterr = 0;
+   int flags = 0;
+   unsigned long gp_seq = 0;
static struct rcu_torture_ops *torture_ops[] = {
&rcu_ops, &rcu_busted_ops, &srcu_ops, &srcud_ops,
&busted_srcud_ops, &tasks_ops, &tasks_rude_ops,
@@ -2636,6 +2640,11 @@ rcu_torture_init(void)
nrealreaders = 1;
}
rcu_torture_print_module_parms(cur_ops, "Start of test");
+   rcutorture_get_gp_data(cur_ops->ttype, &flags, &gp_seq);
+   srcutorture_get_gp_data(cur_ops->ttype, srcu_ctlp, &flags, &gp_seq);
+   start_gp_seq = gp_seq;
+   pr_alert("%s:  Start-test grace-period state: g%ld f%#x\n",
+cur_ops->name, (long)gp_seq, flags);
 
/* Set up the freelist. */
 


[tip: core/rcu] torture: document --allcpus argument added to the kvm.sh script

2020-10-08 Thread tip-bot2 for Paul Gortmaker
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: fbb9f8531a0d6693189783d295114db4c30624ca
Gitweb:
https://git.kernel.org/tip/fbb9f8531a0d6693189783d295114db4c30624ca
Author:Paul Gortmaker 
AuthorDate:Thu, 02 Jul 2020 15:59:05 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:31 -07:00

torture: document --allcpus argument added to the kvm.sh script

Signed-off-by: Paul Gortmaker 
Signed-off-by: Paul E. McKenney 
---
 tools/testing/selftests/rcutorture/bin/kvm.sh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/testing/selftests/rcutorture/bin/kvm.sh 
b/tools/testing/selftests/rcutorture/bin/kvm.sh
index e655983..0a08463 100755
--- a/tools/testing/selftests/rcutorture/bin/kvm.sh
+++ b/tools/testing/selftests/rcutorture/bin/kvm.sh
@@ -46,6 +46,7 @@ jitter="-1"
 
 usage () {
echo "Usage: $scriptname optional arguments:"
+   echo "   --allcpus"
echo "   --bootargs kernel-boot-arguments"
echo "   --bootimage relative-path-to-kernel-boot-image"
echo "   --buildonly"


[tip: core/rcu] rcu: Force DEFAULT_RCU_BLIMIT to 1000 for strict RCU GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 29fc5f93320cb447f83baedfe103ed784cadb073
Gitweb:
https://git.kernel.org/tip/29fc5f93320cb447f83baedfe103ed784cadb073
Author:Paul E. McKenney 
AuthorDate:Thu, 06 Aug 2020 06:39:30 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:24 -07:00

rcu: Force DEFAULT_RCU_BLIMIT to 1000 for strict RCU GPs

The value of DEFAULT_RCU_BLIMIT is normally set to 10, the idea being to
avoid needless response-time degradation due to RCU callback invocation.
However, when CONFIG_RCU_STRICT_GRACE_PERIOD=y it is better to avoid
throttling callback execution in order to better detect pointer
leaks from RCU read-side critical sections.  This commit therefore
sets the value of DEFAULT_RCU_BLIMIT to 1000 in kernels built with
CONFIG_RCU_STRICT_GRACE_PERIOD=y.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 13 +++--
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 8551159..4436857 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -468,17 +468,18 @@ static int rcu_is_cpu_rrupt_from_idle(void)
return __this_cpu_read(rcu_data.dynticks_nesting) == 0;
 }
 
-#define DEFAULT_RCU_BLIMIT 10 /* Maximum callbacks per rcu_do_batch ... */
-#define DEFAULT_MAX_RCU_BLIMIT 1 /* ... even during callback flood. */
+#define DEFAULT_RCU_BLIMIT (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) ? 1000 
: 10)
+   // Maximum callbacks per rcu_do_batch ...
+#define DEFAULT_MAX_RCU_BLIMIT 1 // ... even during callback flood.
 static long blimit = DEFAULT_RCU_BLIMIT;
-#define DEFAULT_RCU_QHIMARK 1 /* If this many pending, ignore blimit. */
+#define DEFAULT_RCU_QHIMARK 1 // If this many pending, ignore blimit.
 static long qhimark = DEFAULT_RCU_QHIMARK;
-#define DEFAULT_RCU_QLOMARK 100   /* Once only this many pending, use blimit. 
*/
+#define DEFAULT_RCU_QLOMARK 100   // Once only this many pending, use blimit.
 static long qlowmark = DEFAULT_RCU_QLOMARK;
 #define DEFAULT_RCU_QOVLD_MULT 2
 #define DEFAULT_RCU_QOVLD (DEFAULT_RCU_QOVLD_MULT * DEFAULT_RCU_QHIMARK)
-static long qovld = DEFAULT_RCU_QOVLD; /* If this many pending, hammer QS. */
-static long qovld_calc = -1; /* No pre-initialization lock acquisitions! */
+static long qovld = DEFAULT_RCU_QOVLD; // If this many pending, hammer QS.
+static long qovld_calc = -1; // No pre-initialization lock acquisitions!
 
 module_param(blimit, long, 0444);
 module_param(qhimark, long, 0444);


[tip: core/rcu] rcu: Restrict default jiffies_till_first_fqs for strict RCU GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: aecd34b9765de3b58c98a1d75b982fc64becd1e9
Gitweb:
https://git.kernel.org/tip/aecd34b9765de3b58c98a1d75b982fc64becd1e9
Author:Paul E. McKenney 
AuthorDate:Wed, 05 Aug 2020 17:25:23 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:24 -07:00

rcu: Restrict default jiffies_till_first_fqs for strict RCU GPs

If there are idle CPUs, RCU's grace-period kthread will wait several
jiffies before even thinking about polling them.  This promotes
efficiency, which is normally a good thing, but when the kernel
has been built with CONFIG_RCU_STRICT_GRACE_PERIOD=y, we care more
about short grace periods.  This commit therefore restricts the
default jiffies_till_first_fqs value to zero in kernels built with
CONFIG_RCU_STRICT_GRACE_PERIOD=y, which causes RCU's grace-period kthread
to poll for idle CPUs immediately after starting a grace period.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 8ce77d9..8551159 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -485,7 +485,7 @@ module_param(qhimark, long, 0444);
 module_param(qlowmark, long, 0444);
 module_param(qovld, long, 0444);
 
-static ulong jiffies_till_first_fqs = ULONG_MAX;
+static ulong jiffies_till_first_fqs = 
IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) ? 0 : ULONG_MAX;
 static ulong jiffies_till_next_fqs = ULONG_MAX;
 static bool rcu_kick_kthreads;
 static int rcu_divisor = 7;


[tip: core/rcu] rcu: Always set .need_qs from __rcu_read_lock() for strict GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: f19920e412fdeed1e15691bcee5b40e18b8e96ff
Gitweb:
https://git.kernel.org/tip/f19920e412fdeed1e15691bcee5b40e18b8e96ff
Author:Paul E. McKenney 
AuthorDate:Thu, 06 Aug 2020 09:40:18 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:25 -07:00

rcu: Always set .need_qs from __rcu_read_lock() for strict GPs

The ->rcu_read_unlock_special.b.need_qs field in the task_struct
structure indicates that the RCU core needs a quiscent state from the
corresponding task.  The __rcu_read_unlock() function checks this (via
an eventual call to rcu_preempt_deferred_qs_irqrestore()), and if set
reports a quiscent state immediately upon exit from the outermost RCU
read-side critical section.

Currently, this flag is only set when the scheduling-clock interrupt
decides that the current RCU grace period is too old, as in about
one full second too old.  But if the kernel has been built with
CONFIG_RCU_STRICT_GRACE_PERIOD=y, we clearly do not want to wait that
long.  This commit therefore sets the .need_qs field immediately at the
start of the RCU read-side critical section from within __rcu_read_lock()
in order to unconditionally enlist help from __rcu_read_unlock().

But note the additional check for rcu_state.gp_kthread, which prevents
attempts to awaken RCU's grace-period kthread during early boot before
there is a scheduler.  Leaving off this check results in early boot hangs.
So early that there is no console output.  Thus, this additional check
fails until such time as RCU's grace-period kthread has been created,
avoiding these empty-console hangs.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree_plugin.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 44cf77d..668bbd2 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -376,6 +376,8 @@ void __rcu_read_lock(void)
rcu_preempt_read_enter();
if (IS_ENABLED(CONFIG_PROVE_LOCKING))
WARN_ON_ONCE(rcu_preempt_depth() > RCU_NEST_PMAX);
+   if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) && rcu_state.gp_kthread)
+   WRITE_ONCE(current->rcu_read_unlock_special.b.need_qs, true);
barrier();  /* critical section after entry code. */
 }
 EXPORT_SYMBOL_GPL(__rcu_read_lock);


[tip: core/rcu] rcu: Execute RCU reader shortly after rcu_core for strict GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: a657f2617010ae237db5693f875968c28e8f732f
Gitweb:
https://git.kernel.org/tip/a657f2617010ae237db5693f875968c28e8f732f
Author:Paul E. McKenney 
AuthorDate:Sat, 08 Aug 2020 07:56:31 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:27 -07:00

rcu: Execute RCU reader shortly after rcu_core for strict GPs

A kernel built with CONFIG_RCU_STRICT_GRACE_PERIOD=y needs a quiescent
state to appear very shortly after a CPU has noticed a new grace period.
Placing an RCU reader immediately after this point is ineffective because
this normally happens in softirq context, which acts as a big RCU reader.
This commit therefore introduces a new per-CPU work_struct, which is
used at the end of rcu_core() processing to schedule an RCU read-side
critical section from within a clean environment.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 13 +
 kernel/rcu/tree.h |  1 +
 2 files changed, 14 insertions(+)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 4bbedfc..31995b3 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2646,6 +2646,14 @@ void rcu_force_quiescent_state(void)
 }
 EXPORT_SYMBOL_GPL(rcu_force_quiescent_state);
 
+// Workqueue handler for an RCU reader for kernels enforcing struct RCU
+// grace periods.
+static void strict_work_handler(struct work_struct *work)
+{
+   rcu_read_lock();
+   rcu_read_unlock();
+}
+
 /* Perform RCU core processing work for the current CPU.  */
 static __latent_entropy void rcu_core(void)
 {
@@ -2690,6 +2698,10 @@ static __latent_entropy void rcu_core(void)
/* Do any needed deferred wakeups of rcuo kthreads. */
do_nocb_deferred_wakeup(rdp);
trace_rcu_utilization(TPS("End RCU core"));
+
+   // If strict GPs, schedule an RCU reader in a clean environment.
+   if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
+   queue_work_on(rdp->cpu, rcu_gp_wq, &rdp->strict_work);
 }
 
 static void rcu_core_si(struct softirq_action *h)
@@ -3887,6 +3899,7 @@ rcu_boot_init_percpu_data(int cpu)
 
/* Set up local state, ensuring consistent view of global state. */
rdp->grpmask = leaf_node_cpu_bit(rdp->mynode, cpu);
+   INIT_WORK(&rdp->strict_work, strict_work_handler);
WARN_ON_ONCE(rdp->dynticks_nesting != 1);
WARN_ON_ONCE(rcu_dynticks_in_eqs(rcu_dynticks_snap(rdp)));
rdp->rcu_ofl_gp_seq = rcu_state.gp_seq;
diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h
index c96ae35..5831ac0 100644
--- a/kernel/rcu/tree.h
+++ b/kernel/rcu/tree.h
@@ -164,6 +164,7 @@ struct rcu_data {
/* period it is aware of. */
struct irq_work defer_qs_iw;/* Obtain later scheduler attention. */
bool defer_qs_iw_pending;   /* Scheduler attention pending? */
+   struct work_struct strict_work; /* Schedule readers for strict GPs. */
 
/* 2) batch handling */
struct rcu_segcblist cblist;/* Segmented callback list, with */


[tip: core/rcu] rcu: Provide optional RCU-reader exit delay for strict GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 3d29aaf1ef992b5b4612fe32b9e6f517f7bba904
Gitweb:
https://git.kernel.org/tip/3d29aaf1ef992b5b4612fe32b9e6f517f7bba904
Author:Paul E. McKenney 
AuthorDate:Fri, 07 Aug 2020 13:44:10 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:27 -07:00

rcu: Provide optional RCU-reader exit delay for strict GPs

The goal of this series is to increase the probability of tools like
KASAN detecting that an RCU-protected pointer was used outside of its
RCU read-side critical section.  Thus far, the approach has been to make
grace periods and callback processing happen faster.  Another approach
is to delay the pointer leaker.  This commit therefore allows a delay
to be applied to exit from RCU read-side critical sections.

This slowdown is specified by a new rcutree.rcu_unlock_delay kernel boot
parameter that specifies this delay in microseconds, defaulting to zero.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 Documentation/admin-guide/kernel-parameters.txt |  9 +
 kernel/rcu/tree_plugin.h| 12 ++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index bdc1f33..cb90624 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4152,6 +4152,15 @@
This wake_up() will be accompanied by a
WARN_ONCE() splat and an ftrace_dump().
 
+   rcutree.rcu_unlock_delay= [KNL]
+   In CONFIG_RCU_STRICT_GRACE_PERIOD=y kernels,
+   this specifies an rcu_read_unlock()-time delay
+   in microseconds.  This defaults to zero.
+   Larger delays increase the probability of
+   catching RCU pointer leaks, that is, buggy use
+   of RCU-protected pointers after the relevant
+   rcu_read_unlock() has completed.
+
rcutree.sysrq_rcu= [KNL]
Commandeer a sysrq key to dump out Tree RCU's
rcu_node tree with an eye towards determining
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index dfdb902..3f3a4ff 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -430,6 +430,12 @@ static bool rcu_preempt_has_tasks(struct rcu_node *rnp)
return !list_empty(&rnp->blkd_tasks);
 }
 
+// Add delay to rcu_read_unlock() for strict grace periods.
+static int rcu_unlock_delay;
+#ifdef CONFIG_RCU_STRICT_GRACE_PERIOD
+module_param(rcu_unlock_delay, int, 0444);
+#endif
+
 /*
  * Report deferred quiescent states.  The deferral time can
  * be quite short, for example, in the case of the call from
@@ -460,10 +466,12 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, 
unsigned long flags)
}
t->rcu_read_unlock_special.s = 0;
if (special.b.need_qs) {
-   if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
+   if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD)) {
rcu_report_qs_rdp(rdp->cpu, rdp);
-   else
+   udelay(rcu_unlock_delay);
+   } else {
rcu_qs();
+   }
}
 
/*


[tip: core/rcu] rcutorture: Remove KCSAN stubs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 83224afd11d71e0d6effb86fe1ab5725d5415251
Gitweb:
https://git.kernel.org/tip/83224afd11d71e0d6effb86fe1ab5725d5415251
Author:Paul E. McKenney 
AuthorDate:Wed, 17 Jun 2020 13:22:17 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:31 -07:00

rcutorture: Remove KCSAN stubs

KCSAN is now in mainline, so this commit removes the stubs for the
data_race(), ASSERT_EXCLUSIVE_WRITER(), and ASSERT_EXCLUSIVE_ACCESS()
macros.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/rcutorture.c | 13 -
 1 file changed, 13 deletions(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index f453bf8..db37861 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -52,19 +52,6 @@
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Paul E. McKenney  and Josh Triplett 
");
 
-#ifndef data_race
-#define data_race(expr)
\
-   ({  \
-   expr;   \
-   })
-#endif
-#ifndef ASSERT_EXCLUSIVE_WRITER
-#define ASSERT_EXCLUSIVE_WRITER(var) do { } while (0)
-#endif
-#ifndef ASSERT_EXCLUSIVE_ACCESS
-#define ASSERT_EXCLUSIVE_ACCESS(var) do { } while (0)
-#endif
-
 /* Bits for ->extendables field, extendables param, and related definitions. */
 #define RCUTORTURE_RDR_SHIFT8  /* Put SRCU index in upper bits. */
 #define RCUTORTURE_RDR_MASK ((1 << RCUTORTURE_RDR_SHIFT) - 1)


[tip: core/rcu] rcu: IPI all CPUs at GP end for strict GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 4e025f52a1e0e8ff4e303fa0a80e2061ccfa27d6
Gitweb:
https://git.kernel.org/tip/4e025f52a1e0e8ff4e303fa0a80e2061ccfa27d6
Author:Paul E. McKenney 
AuthorDate:Thu, 06 Aug 2020 19:42:47 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:26 -07:00

rcu: IPI all CPUs at GP end for strict GPs

Currently, each CPU discovers the end of a given grace period on its
own time, which is again good for efficiency but bad for fast grace
periods, given that it is things like kfree() within the RCU callbacks
that will cause trouble for pointers leaked from RCU read-side critical
sections.  This commit therefore uses on_each_cpu() to IPI each CPU
after grace-period cleanup in order to inform each CPU of the end of
the old grace period in a timely manner, but only in kernels build with
CONFIG_RCU_STRICT_GRACE_PERIOD=y.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 88f4fa6..4bbedfc 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2052,6 +2052,10 @@ static void rcu_gp_cleanup(void)
   rcu_state.gp_flags & RCU_GP_FLAG_INIT);
}
raw_spin_unlock_irq_rcu_node(rnp);
+
+   // If strict, make all CPUs aware of the end of the old grace period.
+   if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
+   on_each_cpu(rcu_strict_gp_boundary, NULL, 0);
 }
 
 /*


[tip: core/rcu] rcu: Remove unused "cpu" parameter from rcu_report_qs_rdp()

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: cfeac3977ab4b6222a01f79997739d2367a8cc94
Gitweb:
https://git.kernel.org/tip/cfeac3977ab4b6222a01f79997739d2367a8cc94
Author:Paul E. McKenney 
AuthorDate:Thu, 20 Aug 2020 11:26:14 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:28 -07:00

rcu: Remove unused "cpu" parameter from rcu_report_qs_rdp()

The "cpu" parameter to rcu_report_qs_rdp() is not used, with rdp->cpu
being used instead.  Furtheremore, every call to rcu_report_qs_rdp()
invokes it on rdp->cpu.  This commit therefore removes this unused "cpu"
parameter and converts a check of rdp->cpu against smp_processor_id()
to a WARN_ON_ONCE().

Reported-by: Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c| 8 
 kernel/rcu/tree_plugin.h | 4 ++--
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index a295cad..c612765 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2240,7 +2240,7 @@ rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned 
long flags)
  * structure.  This must be called from the specified CPU.
  */
 static void
-rcu_report_qs_rdp(int cpu, struct rcu_data *rdp)
+rcu_report_qs_rdp(struct rcu_data *rdp)
 {
unsigned long flags;
unsigned long mask;
@@ -2249,6 +2249,7 @@ rcu_report_qs_rdp(int cpu, struct rcu_data *rdp)
   rcu_segcblist_is_offloaded(&rdp->cblist);
struct rcu_node *rnp;
 
+   WARN_ON_ONCE(rdp->cpu != smp_processor_id());
rnp = rdp->mynode;
raw_spin_lock_irqsave_rcu_node(rnp, flags);
if (rdp->cpu_no_qs.b.norm || rdp->gp_seq != rnp->gp_seq ||
@@ -2265,8 +2266,7 @@ rcu_report_qs_rdp(int cpu, struct rcu_data *rdp)
return;
}
mask = rdp->grpmask;
-   if (rdp->cpu == smp_processor_id())
-   rdp->core_needs_qs = false;
+   rdp->core_needs_qs = false;
if ((rnp->qsmask & mask) == 0) {
raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
} else {
@@ -2315,7 +2315,7 @@ rcu_check_quiescent_state(struct rcu_data *rdp)
 * Tell RCU we are done (but rcu_report_qs_rdp() will be the
 * judge of that).
 */
-   rcu_report_qs_rdp(rdp->cpu, rdp);
+   rcu_report_qs_rdp(rdp);
 }
 
 /*
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 25a676d..ca31be0 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -461,7 +461,7 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, 
unsigned long flags)
t->rcu_read_unlock_special.s = 0;
if (special.b.need_qs) {
if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD)) {
-   rcu_report_qs_rdp(rdp->cpu, rdp);
+   rcu_report_qs_rdp(rdp);
udelay(rcu_unlock_delay);
} else {
rcu_qs();
@@ -791,7 +791,7 @@ void rcu_read_unlock_strict(void)
   irqs_disabled() || preempt_count() || !rcu_state.gp_kthread)
return;
rdp = this_cpu_ptr(&rcu_data);
-   rcu_report_qs_rdp(rdp->cpu, rdp);
+   rcu_report_qs_rdp(rdp);
udelay(rcu_unlock_delay);
 }
 EXPORT_SYMBOL_GPL(rcu_read_unlock_strict);


[tip: core/rcu] rcu: Report QS for outermost PREEMPT=n rcu_read_unlock() for strict GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: aa40c138cc8f36e2f5c721fd1bdb823a1ef1a237
Gitweb:
https://git.kernel.org/tip/aa40c138cc8f36e2f5c721fd1bdb823a1ef1a237
Author:Paul E. McKenney 
AuthorDate:Mon, 10 Aug 2020 09:58:03 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:28 -07:00

rcu: Report QS for outermost PREEMPT=n rcu_read_unlock() for strict GPs

The CONFIG_PREEMPT=n instance of rcu_read_unlock is even more
aggressively than that of CONFIG_PREEMPT=y in deferring reporting
quiescent states to the RCU core.  This is just what is wanted in normal
use because it reduces overhead, but the resulting delay is not what
is wanted for kernels built with CONFIG_RCU_STRICT_GRACE_PERIOD=y.
This commit therefore adds an rcu_read_unlock_strict() function that
checks for exceptional conditions, and reports the newly started
quiescent state if it is safe to do so, also doing a spin-delay if
requested via rcutree.rcu_unlock_delay.  This commit also adds a call
to rcu_read_unlock_strict() from the CONFIG_PREEMPT=n instance of
__rcu_read_unlock().

[ paulmck: Fixed bug located by kernel test robot  ]
Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 include/linux/rcupdate.h |  7 +++
 kernel/rcu/tree.c|  6 ++
 kernel/rcu/tree_plugin.h | 24 ++--
 3 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index d15d46d..522529a 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -55,6 +55,12 @@ void __rcu_read_unlock(void);
 
 #else /* #ifdef CONFIG_PREEMPT_RCU */
 
+#ifdef CONFIG_TINY_RCU
+#define rcu_read_unlock_strict() do { } while (0)
+#else
+void rcu_read_unlock_strict(void);
+#endif
+
 static inline void __rcu_read_lock(void)
 {
preempt_disable();
@@ -63,6 +69,7 @@ static inline void __rcu_read_lock(void)
 static inline void __rcu_read_unlock(void)
 {
preempt_enable();
+   rcu_read_unlock_strict();
 }
 
 static inline int rcu_preempt_depth(void)
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 31995b3..a295cad 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -178,6 +178,12 @@ module_param(gp_init_delay, int, 0444);
 static int gp_cleanup_delay;
 module_param(gp_cleanup_delay, int, 0444);
 
+// Add delay to rcu_read_unlock() for strict grace periods.
+static int rcu_unlock_delay;
+#ifdef CONFIG_RCU_STRICT_GRACE_PERIOD
+module_param(rcu_unlock_delay, int, 0444);
+#endif
+
 /*
  * This rcu parameter is runtime-read-only. It reflects
  * a minimum allowed number of objects which can be cached
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 3f3a4ff..25a676d 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -430,12 +430,6 @@ static bool rcu_preempt_has_tasks(struct rcu_node *rnp)
return !list_empty(&rnp->blkd_tasks);
 }
 
-// Add delay to rcu_read_unlock() for strict grace periods.
-static int rcu_unlock_delay;
-#ifdef CONFIG_RCU_STRICT_GRACE_PERIOD
-module_param(rcu_unlock_delay, int, 0444);
-#endif
-
 /*
  * Report deferred quiescent states.  The deferral time can
  * be quite short, for example, in the case of the call from
@@ -785,6 +779,24 @@ dump_blkd_tasks(struct rcu_node *rnp, int ncheck)
 #else /* #ifdef CONFIG_PREEMPT_RCU */
 
 /*
+ * If strict grace periods are enabled, and if the calling
+ * __rcu_read_unlock() marks the beginning of a quiescent state, immediately
+ * report that quiescent state and, if requested, spin for a bit.
+ */
+void rcu_read_unlock_strict(void)
+{
+   struct rcu_data *rdp;
+
+   if (!IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) ||
+  irqs_disabled() || preempt_count() || !rcu_state.gp_kthread)
+   return;
+   rdp = this_cpu_ptr(&rcu_data);
+   rcu_report_qs_rdp(rdp->cpu, rdp);
+   udelay(rcu_unlock_delay);
+}
+EXPORT_SYMBOL_GPL(rcu_read_unlock_strict);
+
+/*
  * Tell them what RCU they are running.
  */
 static void __init rcu_bootup_announce(void)


[tip: core/rcu] rcu: IPI all CPUs at GP start for strict GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 933ada2c3310aa88807e65c8d498b74a2159a9a2
Gitweb:
https://git.kernel.org/tip/933ada2c3310aa88807e65c8d498b74a2159a9a2
Author:Paul E. McKenney 
AuthorDate:Thu, 06 Aug 2020 19:21:48 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:26 -07:00

rcu: IPI all CPUs at GP start for strict GPs

Currently, each CPU discovers the beginning of a given grace period
on its own time, which is again good for efficiency but bad for fast
grace periods.  This commit therefore uses on_each_cpu() to IPI each
CPU after grace-period initialization in order to inform each CPU of
the new grace period in a timely manner, but only in kernels build with
CONFIG_RCU_STRICT_GRACE_PERIOD=y.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 36a860c..88f4fa6 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1696,6 +1696,15 @@ static void rcu_gp_torture_wait(void)
 }
 
 /*
+ * Handler for on_each_cpu() to invoke the target CPU's RCU core
+ * processing.
+ */
+static void rcu_strict_gp_boundary(void *unused)
+{
+   invoke_rcu_core();
+}
+
+/*
  * Initialize a new grace period.  Return false if no grace period required.
  */
 static bool rcu_gp_init(void)
@@ -1823,6 +1832,10 @@ static bool rcu_gp_init(void)
WRITE_ONCE(rcu_state.gp_activity, jiffies);
}
 
+   // If strict, make all CPUs aware of new grace period.
+   if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
+   on_each_cpu(rcu_strict_gp_boundary, NULL, 0);
+
return true;
 }
 


[tip: core/rcu] rcu: Do full report for .need_qs for strict GPs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 44bad5b3cca2d452d17ef82841b20b42a2cf11a0
Gitweb:
https://git.kernel.org/tip/44bad5b3cca2d452d17ef82841b20b42a2cf11a0
Author:Paul E. McKenney 
AuthorDate:Thu, 06 Aug 2020 15:12:50 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:25 -07:00

rcu: Do full report for .need_qs for strict GPs

The rcu_preempt_deferred_qs_irqrestore() function is invoked at
the end of an RCU read-side critical section (for example, directly
from rcu_read_unlock()) and, if .need_qs is set, invokes rcu_qs() to
report the new quiescent state.  This works, except that rcu_qs() only
updates per-CPU state, leaving reporting of the actual quiescent state
to a later call to rcu_report_qs_rdp(), for example from within a later
RCU_SOFTIRQ instance.  Although this approach is exactly what you want if
you are more concerned about efficiency than about short grace periods,
in CONFIG_RCU_STRICT_GRACE_PERIOD=y kernels, short grace periods are
the name of the game.

This commit therefore makes rcu_preempt_deferred_qs_irqrestore() directly
invoke rcu_report_qs_rdp() in CONFIG_RCU_STRICT_GRACE_PERIOD=y, thus
shortening grace periods.

Historical note:  To the best of my knowledge, causing rcu_read_unlock()
to directly report a quiescent state first appeared in Jim Houston's
and Joe Korty's JRCU.  This is the second instance of a Linux-kernel RCU
feature being inspired by JRCU, the first being RCU callback offloading
(as in the RCU_NOCB_CPU Kconfig option).

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree_plugin.h | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 668bbd2..dfdb902 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -459,8 +459,12 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, 
unsigned long flags)
return;
}
t->rcu_read_unlock_special.s = 0;
-   if (special.b.need_qs)
-   rcu_qs();
+   if (special.b.need_qs) {
+   if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
+   rcu_report_qs_rdp(rdp->cpu, rdp);
+   else
+   rcu_qs();
+   }
 
/*
 * Respond to a request by an expedited grace period for a


[tip: core/rcu] scftorture: Add smp_call_function_single() memory-ordering checks

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: b93e21a51e1c8ed3816da888d34f88193ad1b917
Gitweb:
https://git.kernel.org/tip/b93e21a51e1c8ed3816da888d34f88193ad1b917
Author:Paul E. McKenney 
AuthorDate:Tue, 30 Jun 2020 20:49:50 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:33 -07:00

scftorture: Add smp_call_function_single() memory-ordering checks

This commit adds checks for memory misordering across calls to
smp_call_function_single() and also across returns in the case where
the caller waits.  Misordering results in a splat.

[ paulmck: s/GFP_KERNEL/GFP_ATOMIC/ per kernel test robot feedback. ]
Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 56 +---
 1 file changed, 48 insertions(+), 8 deletions(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 09a6242..9b42271 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -117,9 +117,20 @@ static struct scf_selector scf_sel_array[SCF_NPRIMS];
 static int scf_sel_array_len;
 static unsigned long scf_sel_totweight;
 
+// Communicate between caller and handler.
+struct scf_check {
+   bool scfc_in;
+   bool scfc_out;
+   int scfc_cpu; // -1 for not _single().
+   bool scfc_wait;
+};
+
 // Use to wait for all threads to start.
 static atomic_t n_started;
 static atomic_t n_errs;
+static atomic_t n_mb_in_errs;
+static atomic_t n_mb_out_errs;
+static atomic_t n_alloc_errs;
 static bool scfdone;
 
 DEFINE_TORTURE_RANDOM_PERCPU(scf_torture_rand);
@@ -222,24 +233,27 @@ static struct scf_selector *scf_sel_rand(struct 
torture_random_state *trsp)
 // Update statistics and occasionally burn up mass quantities of CPU time,
 // if told to do so via scftorture.longwait.  Otherwise, occasionally burn
 // a little bit.
-static void scf_handler(void *unused)
+static void scf_handler(void *scfc_in)
 {
int i;
int j;
unsigned long r = torture_random(this_cpu_ptr(&scf_torture_rand));
+   struct scf_check *scfcp = scfc_in;
 
+   if (likely(scfcp) && WARN_ON_ONCE(unlikely(!READ_ONCE(scfcp->scfc_in
+   atomic_inc(&n_mb_in_errs);
this_cpu_inc(scf_invoked_count);
if (longwait <= 0) {
if (!(r & 0xffc0))
udelay(r & 0x3f);
-   return;
+   goto out;
}
if (r & 0xfff)
-   return;
+   goto out;
r = (r >> 12);
if (longwait <= 0) {
udelay((r & 0xff) + 1);
-   return;
+   goto out;
}
r = r % longwait + 1;
for (i = 0; i < r; i++) {
@@ -248,14 +262,24 @@ static void scf_handler(void *unused)
cpu_relax();
}
}
+out:
+   if (unlikely(!scfcp))
+   return;
+   if (scfcp->scfc_wait)
+   WRITE_ONCE(scfcp->scfc_out, true);
+   else
+   kfree(scfcp);
 }
 
 // As above, but check for correct CPU.
-static void scf_handler_1(void *me)
+static void scf_handler_1(void *scfc_in)
 {
-   if (WARN_ON_ONCE(smp_processor_id() != (uintptr_t)me))
+   struct scf_check *scfcp = scfc_in;
+
+   if (likely(scfcp) && WARN_ONCE(smp_processor_id() != scfcp->scfc_cpu, 
"%s: Wanted CPU %d got CPU %d\n", __func__, scfcp->scfc_cpu, 
smp_processor_id())) {
atomic_inc(&n_errs);
-   scf_handler(NULL);
+   }
+   scf_handler(scfcp);
 }
 
 // Randomly do an smp_call_function*() invocation.
@@ -263,6 +287,7 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
 {
uintptr_t cpu;
int ret;
+   struct scf_check *scfcp = NULL;
struct scf_selector *scfsp = scf_sel_rand(trsp);
 
if (use_cpus_read_lock)
@@ -271,17 +296,32 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
preempt_disable();
switch (scfsp->scfs_prim) {
case SCF_PRIM_SINGLE:
+   scfcp = kmalloc(sizeof(*scfcp), GFP_ATOMIC);
+   if (WARN_ON_ONCE(!scfcp))
+   atomic_inc(&n_alloc_errs);
cpu = torture_random(trsp) % nr_cpu_ids;
if (scfsp->scfs_wait)
scfp->n_single_wait++;
else
scfp->n_single++;
-   ret = smp_call_function_single(cpu, scf_handler_1, (void *)cpu, 
scfsp->scfs_wait);
+   if (scfcp) {
+   scfcp->scfc_cpu = cpu;
+   scfcp->scfc_wait = scfsp->scfs_wait;
+   scfcp->scfc_out = false;
+   scfcp->scfc_in = true;
+   }
+   ret = smp_call_function_single(cpu, scf_handler_1, (void 
*)scfcp, scfsp->scfs_wait);
if (ret) {
if (scfsp->scfs_wait)
scfp->n_single_wait_ofl+

[tip: core/rcu] rcuperf: Change rcuperf to rcuscale

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 4e88ec4a9eb17527e640b063f79e5b875733eb53
Gitweb:
https://git.kernel.org/tip/4e88ec4a9eb17527e640b063f79e5b875733eb53
Author:Paul E. McKenney 
AuthorDate:Tue, 11 Aug 2020 21:18:12 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:39:24 -07:00

rcuperf: Change rcuperf to rcuscale

This commit further avoids conflation of rcuperf with the kernel's perf
feature by renaming kernel/rcu/rcuperf.c to kernel/rcu/rcuscale.c, and
also by similarly renaming the functions and variables inside this file.
This has the side effect of changing the names of the kernel boot
parameters, so kernel-parameters.txt and ver_functions.sh are also
updated.  The rcutorture --torture type was also updated from rcuperf
to rcuscale.

[ paulmck: Fix bugs located by Stephen Rothwell. ]
Reported-by: Ingo Molnar 
Signed-off-by: Paul E. McKenney 
---
 Documentation/admin-guide/kernel-parameters.txt   |  36 +--
 MAINTAINERS   |   3 +-
 kernel/rcu/Kconfig.debug  |   2 +-
 kernel/rcu/Makefile   |   2 +-
 kernel/rcu/rcuperf.c  | 853 
+--
 kernel/rcu/rcuscale.c | 853 
++-
 tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuperf-ftrace.sh  | 109 
+-
 tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuperf.sh |  83 
+---
 tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuscale-ftrace.sh | 109 
+-
 tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuscale.sh|  83 
+++-
 tools/testing/selftests/rcutorture/bin/kvm.sh |   8 +-
 tools/testing/selftests/rcutorture/bin/parse-console.sh   |   4 +-
 tools/testing/selftests/rcutorture/configs/rcuperf/CFLIST |   1 +-
 tools/testing/selftests/rcutorture/configs/rcuperf/CFcommon   |   2 +-
 tools/testing/selftests/rcutorture/configs/rcuperf/TINY   |  16 +-
 tools/testing/selftests/rcutorture/configs/rcuperf/TREE   |  19 +--
 tools/testing/selftests/rcutorture/configs/rcuperf/TREE54 |  22 +--
 tools/testing/selftests/rcutorture/configs/rcuperf/ver_functions.sh   |  16 +-
 tools/testing/selftests/rcutorture/configs/rcuscale/CFLIST|   1 +-
 tools/testing/selftests/rcutorture/configs/rcuscale/CFcommon  |   2 +-
 tools/testing/selftests/rcutorture/configs/rcuscale/TINY  |  16 +-
 tools/testing/selftests/rcutorture/configs/rcuscale/TREE  |  19 ++-
 tools/testing/selftests/rcutorture/configs/rcuscale/TREE54|  22 ++-
 tools/testing/selftests/rcutorture/configs/rcuscale/ver_functions.sh  |  16 +-
 24 files changed, 1149 insertions(+), 1148 deletions(-)
 delete mode 100644 kernel/rcu/rcuperf.c
 create mode 100644 kernel/rcu/rcuscale.c
 delete mode 100755 
tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuperf-ftrace.sh
 delete mode 100755 
tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuperf.sh
 create mode 100755 
tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuscale-ftrace.sh
 create mode 100755 
tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuscale.sh
 delete mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/CFLIST
 delete mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/CFcommon
 delete mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TINY
 delete mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE
 delete mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE54
 delete mode 100644 
tools/testing/selftests/rcutorture/configs/rcuperf/ver_functions.sh
 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuscale/CFLIST
 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuscale/CFcommon
 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuscale/TINY
 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuscale/TREE
 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuscale/TREE54
 create mode 100644 
tools/testing/selftests/rcutorture/configs/rcuscale/ver_functions.sh

diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index 91a5638..c27bbe9 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4157,41 +4157,41 @@
rcu_node tree with an eye towards determining
why a new grace period has not yet started.
 
-   rcuperf.gp_async= [KNL]
+   rcuscale.gp_async= [KNL]

[tip: core/rcu] scftorture: Consolidate scftorture_invoke_one() check and kfree()

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 676e5469643e716df7f39ef77ba8f09c85b0c4f8
Gitweb:
https://git.kernel.org/tip/676e5469643e716df7f39ef77ba8f09c85b0c4f8
Author:Paul E. McKenney 
AuthorDate:Wed, 01 Jul 2020 14:13:02 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:35 -07:00

scftorture: Consolidate scftorture_invoke_one() check and kfree()

This commit moves checking of the ->scfc_out field and the freeing of
the scf_check structure down below the end of switch statement, thus
saving a few lines of code.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 26 --
 1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 0d7299d..f220cd3 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -289,7 +289,7 @@ static void scf_handler_1(void *scfc_in)
 static void scftorture_invoke_one(struct scf_statistics *scfp, struct 
torture_random_state *trsp)
 {
uintptr_t cpu;
-   int ret;
+   int ret = 0;
struct scf_check *scfcp = NULL;
struct scf_selector *scfsp = scf_sel_rand(trsp);
 
@@ -322,11 +322,7 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
else
scfp->n_single_ofl++;
kfree(scfcp);
-   } else if (scfcp && scfsp->scfs_wait) {
-   if (WARN_ON_ONCE(!scfcp->scfc_out))
-   atomic_inc(&n_mb_out_errs); // Leak rather than 
trash!
-   else
-   kfree(scfcp);
+   scfcp = NULL;
}
break;
case SCF_PRIM_MANY:
@@ -341,12 +337,6 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfcp->scfc_in = true;
}
smp_call_function_many(cpu_online_mask, scf_handler, scfcp, 
scfsp->scfs_wait);
-   if (scfcp) {
-   if (WARN_ON_ONCE(!scfcp->scfc_out))
-   atomic_inc(&n_mb_out_errs);  // Leak rather 
than trash!
-   else
-   kfree(scfcp);
-   }
break;
case SCF_PRIM_ALL:
if (scfsp->scfs_wait)
@@ -360,14 +350,14 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfcp->scfc_in = true;
}
smp_call_function(scf_handler, scfcp, scfsp->scfs_wait);
-   if (scfcp) {
-   if (WARN_ON_ONCE(!scfcp->scfc_out))
-   atomic_inc(&n_mb_out_errs);  // Leak rather 
than trash!
-   else
-   kfree(scfcp);
-   }
break;
}
+   if (scfcp && scfsp->scfs_wait) {
+   if (WARN_ON_ONCE(!scfcp->scfc_out))
+   atomic_inc(&n_mb_out_errs); // Leak rather than trash!
+   else
+   kfree(scfcp);
+   }
if (use_cpus_read_lock)
cpus_read_unlock();
else


[tip: core/rcu] scftorture: Add smp_call_function() memory-ordering checks

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 34e8c4837adb579962e528a4f7dd1f75cb120be4
Gitweb:
https://git.kernel.org/tip/34e8c4837adb579962e528a4f7dd1f75cb120be4
Author:Paul E. McKenney 
AuthorDate:Wed, 01 Jul 2020 13:49:06 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:34 -07:00

scftorture: Add smp_call_function() memory-ordering checks

This commit adds checks for memory misordering across calls to and
returns from smp_call_function() in the case where the caller waits.
Misordering results in a splat.

Note that in contrast to smp_call_function_single(), this code does not
test memory ordering into the handler in the no-wait case because none
of the handlers would be able to free the scf_check structure without
introducing heavy synchronization to work out which was last.

[ paulmck: s/GFP_KERNEL/GFP_ATOMIC/ per kernel test robot feedback. ]
Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 25 +
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 3519ad1..0d7299d 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -297,11 +297,13 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
cpus_read_lock();
else
preempt_disable();
-   switch (scfsp->scfs_prim) {
-   case SCF_PRIM_SINGLE:
+   if (scfsp->scfs_prim == SCF_PRIM_SINGLE || scfsp->scfs_wait) {
scfcp = kmalloc(sizeof(*scfcp), GFP_ATOMIC);
if (WARN_ON_ONCE(!scfcp))
atomic_inc(&n_alloc_errs);
+   }
+   switch (scfsp->scfs_prim) {
+   case SCF_PRIM_SINGLE:
cpu = torture_random(trsp) % nr_cpu_ids;
if (scfsp->scfs_wait)
scfp->n_single_wait++;
@@ -328,11 +330,6 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
}
break;
case SCF_PRIM_MANY:
-   if (scfsp->scfs_wait) {
-   scfcp = kmalloc(sizeof(*scfcp), GFP_ATOMIC);
-   if (WARN_ON_ONCE(!scfcp))
-   atomic_inc(&n_alloc_errs);
-   }
if (scfsp->scfs_wait)
scfp->n_many_wait++;
else
@@ -356,7 +353,19 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfp->n_all_wait++;
else
scfp->n_all++;
-   smp_call_function(scf_handler, NULL, scfsp->scfs_wait);
+   if (scfcp) {
+   scfcp->scfc_cpu = -1;
+   scfcp->scfc_wait = true;
+   scfcp->scfc_out = false;
+   scfcp->scfc_in = true;
+   }
+   smp_call_function(scf_handler, scfcp, scfsp->scfs_wait);
+   if (scfcp) {
+   if (WARN_ON_ONCE(!scfcp->scfc_out))
+   atomic_inc(&n_mb_out_errs);  // Leak rather 
than trash!
+   else
+   kfree(scfcp);
+   }
break;
}
if (use_cpus_read_lock)


[tip: core/rcu] tick-sched: Clarify "NOHZ: local_softirq_pending" warning

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: bca37119c57bdc2c68c84b313a5118005e8693cf
Gitweb:
https://git.kernel.org/tip/bca37119c57bdc2c68c84b313a5118005e8693cf
Author:Paul E. McKenney 
AuthorDate:Fri, 26 Jun 2020 13:39:41 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:32 -07:00

tick-sched: Clarify "NOHZ: local_softirq_pending" warning

Currently, can_stop_idle_tick() prints "NOHZ: local_softirq_pending HH"
(where "HH" is the hexadecimal softirq vector number) when one or more
non-RCU softirq handlers are still enabled when checking to stop the
scheduler-tick interrupt.  This message is not as enlightening as one
might hope, so this commit changes it to "NOHZ tick-stop error: Non-RCU
local softirq work is pending, handler #HH".

Reported-by: Andy Lutomirski 
Cc: Frederic Weisbecker 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Signed-off-by: Paul E. McKenney 
---
 kernel/time/tick-sched.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index f0199a4..81632cd 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -927,7 +927,7 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched 
*ts)
 
if (ratelimit < 10 &&
(local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) {
-   pr_warn("NOHZ: local_softirq_pending %02x\n",
+   pr_warn("NOHZ tick-stop error: Non-RCU local softirq 
work is pending, handler #%02x!!!\n",
(unsigned int) local_softirq_pending());
ratelimit++;
}


[tip: core/rcu] torture: Declare parse-console.sh independence from rcutorture

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 687d4775db56d24c81b4704056186d6c506de30d
Gitweb:
https://git.kernel.org/tip/687d4775db56d24c81b4704056186d6c506de30d
Author:Paul E. McKenney 
AuthorDate:Tue, 30 Jun 2020 13:37:22 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:31 -07:00

torture: Declare parse-console.sh independence from rcutorture

Currently, parse-torture.sh looks at the fifth field of torture-test
console output for the version number.  This works fine for rcutorture,
but not for scftorture, which lacks the pointer field.  This commit
therefore adjusts matching lines so that the parse-console.sh awk script
always sees the version number as the first field in the lines passed
to it.

Signed-off-by: Paul E. McKenney 
---
 tools/testing/selftests/rcutorture/bin/parse-console.sh | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/rcutorture/bin/parse-console.sh 
b/tools/testing/selftests/rcutorture/bin/parse-console.sh
index 71a9f43..4e081a2 100755
--- a/tools/testing/selftests/rcutorture/bin/parse-console.sh
+++ b/tools/testing/selftests/rcutorture/bin/parse-console.sh
@@ -67,6 +67,7 @@ then
grep --binary-files=text 'torture:.*ver:' $file |
egrep --binary-files=text -v '\(null\)|rtc: 0* ' |
sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
+   sed -e 's/^.*ver: //' |
awk '
BEGIN   {
ver = 0;
@@ -74,13 +75,13 @@ then
}
 
{
-   if (!badseq && ($5 + 0 != $5 || $5 <= ver)) {
+   if (!badseq && ($1 + 0 != $1 || $1 <= ver)) {
badseqno1 = ver;
-   badseqno2 = $5;
+   badseqno2 = $1;
badseqnr = NR;
badseq = 1;
}
-   ver = $5
+   ver = $1
}
 
END {


[tip: core/rcu] scftorture: Implement weighted primitive selection

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 5022b8ac608f8b80b042a8041fe2738c4b9ea8cf
Gitweb:
https://git.kernel.org/tip/5022b8ac608f8b80b042a8041fe2738c4b9ea8cf
Author:Paul E. McKenney 
AuthorDate:Thu, 25 Jun 2020 17:05:58 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:32 -07:00

scftorture: Implement weighted primitive selection

This commit uses the scftorture.weight* kernel parameters to randomly
chooses between smp_call_function_single(), smp_call_function_many(),
and smp_call_function().  For each variant, it also randomly chooses
whether to invoke it synchronously (wait=1) or asynchronously (wait=0).
The percentage weighting for each option are dumped to the console log
(search for "scf_sel_dump").

This accumulates statistics, which a later commit will dump out at the
end of the run.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 182 ---
 1 file changed, 155 insertions(+), 27 deletions(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 44f1e49..5f19845 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -64,8 +64,8 @@ torture_param(bool, use_cpus_read_lock, 0, "Use 
cpus_read_lock() to exclude CPU 
 torture_param(int, verbose, 0, "Enable verbose debugging printk()s");
 torture_param(int, weight_single, -1, "Testing weight for single-CPU no-wait 
operations.");
 torture_param(int, weight_single_wait, -1, "Testing weight for single-CPU 
operations.");
-torture_param(int, weight_mult, -1, "Testing weight for multi-CPU no-wait 
operations.");
-torture_param(int, weight_mult_wait, -1, "Testing weight for multi-CPU 
operations.");
+torture_param(int, weight_many, -1, "Testing weight for multi-CPU no-wait 
operations.");
+torture_param(int, weight_many_wait, -1, "Testing weight for multi-CPU 
operations.");
 torture_param(int, weight_all, -1, "Testing weight for all-CPU no-wait 
operations.");
 torture_param(int, weight_all_wait, -1, "Testing weight for all-CPU 
operations.");
 
@@ -83,9 +83,11 @@ struct scf_statistics {
struct task_struct *task;
int cpu;
long long n_single;
+   long long n_single_ofl;
long long n_single_wait;
-   long long n_multi;
-   long long n_multi_wait;
+   long long n_single_wait_ofl;
+   long long n_many;
+   long long n_many_wait;
long long n_all;
long long n_all_wait;
 };
@@ -94,6 +96,27 @@ static struct scf_statistics *scf_stats_p;
 static struct task_struct *scf_torture_stats_task;
 static DEFINE_PER_CPU(long long, scf_invoked_count);
 
+// Data for random primitive selection
+#define SCF_PRIM_SINGLE0
+#define SCF_PRIM_MANY  1
+#define SCF_PRIM_ALL   2
+#define SCF_NPRIMS (2 * 3) // Need wait and no-wait versions of 
each.
+
+static char *scf_prim_name[] = {
+   "smp_call_function_single",
+   "smp_call_function_many",
+   "smp_call_function",
+};
+
+struct scf_selector {
+   unsigned long scfs_weight;
+   int scfs_prim;
+   bool scfs_wait;
+};
+static struct scf_selector scf_sel_array[SCF_NPRIMS];
+static int scf_sel_array_len;
+static unsigned long scf_sel_totweight;
+
 // Use to wait for all threads to start.
 static atomic_t n_started;
 static atomic_t n_errs;
@@ -131,6 +154,57 @@ scf_torture_stats(void *arg)
return 0;
 }
 
+// Add a primitive to the scf_sel_array[].
+static void scf_sel_add(unsigned long weight, int prim, bool wait)
+{
+   struct scf_selector *scfsp = &scf_sel_array[scf_sel_array_len];
+
+   // If no weight, if array would overflow, if computing three-place
+   // percentages would overflow, or if the scf_prim_name[] array would
+   // overflow, don't bother.  In the last three two cases, complain.
+   if (!weight ||
+   WARN_ON_ONCE(scf_sel_array_len >= ARRAY_SIZE(scf_sel_array)) ||
+   WARN_ON_ONCE(0 - 10 * weight <= 10 * scf_sel_totweight) ||
+   WARN_ON_ONCE(prim >= ARRAY_SIZE(scf_prim_name)))
+   return;
+   scf_sel_totweight += weight;
+   scfsp->scfs_weight = scf_sel_totweight;
+   scfsp->scfs_prim = prim;
+   scfsp->scfs_wait = wait;
+   scf_sel_array_len++;
+}
+
+// Dump out weighting percentages for scf_prim_name[] array.
+static void scf_sel_dump(void)
+{
+   int i;
+   unsigned long oldw = 0;
+   struct scf_selector *scfsp;
+   unsigned long w;
+
+   for (i = 0; i < scf_sel_array_len; i++) {
+   scfsp = &scf_sel_array[i];
+   w = (scfsp->scfs_weight - oldw) * 10 / scf_sel_totweight;
+   pr_info("%s: %3lu.%03lu %s(%s)\n", __func__, w / 1000, w % 1000,
+   scf_prim_name[scfsp->scfs_prim],
+   scfsp->scfs_wait ? "wait" : "nowait");
+   oldw = scfsp->scfs_weight;
+   }
+}
+
+// Randomly pick a primitive and wait/nowait, based on weighting

[tip: core/rcu] scftorture: Add smp_call_function_many() memory-ordering checks

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 980205ee8489d53c4380f7762debac87312b0fb3
Gitweb:
https://git.kernel.org/tip/980205ee8489d53c4380f7762debac87312b0fb3
Author:Paul E. McKenney 
AuthorDate:Wed, 01 Jul 2020 12:30:02 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:34 -07:00

scftorture: Add smp_call_function_many() memory-ordering checks

This commit adds checks for memory misordering across calls to and
returns from smp_call_function_many() in the case where the caller waits.
Misordering results in a splat.

Note that in contrast to smp_call_function_single(), this code does not
test memory ordering into the handler in the no-wait case because none
of the handlers would be able to free the scf_check structure without
introducing heavy synchronization to work out which was last.

[ paulmck: s/GFP_KERNEL/GFP_ATOMIC/ per kernel test robot feedback. ]
Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 26 +++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 9b42271..3519ad1 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -240,8 +240,11 @@ static void scf_handler(void *scfc_in)
unsigned long r = torture_random(this_cpu_ptr(&scf_torture_rand));
struct scf_check *scfcp = scfc_in;
 
-   if (likely(scfcp) && WARN_ON_ONCE(unlikely(!READ_ONCE(scfcp->scfc_in
-   atomic_inc(&n_mb_in_errs);
+   if (likely(scfcp)) {
+   WRITE_ONCE(scfcp->scfc_out, false); // For multiple receivers.
+   if (WARN_ON_ONCE(unlikely(!READ_ONCE(scfcp->scfc_in
+   atomic_inc(&n_mb_in_errs);
+   }
this_cpu_inc(scf_invoked_count);
if (longwait <= 0) {
if (!(r & 0xffc0))
@@ -325,11 +328,28 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
}
break;
case SCF_PRIM_MANY:
+   if (scfsp->scfs_wait) {
+   scfcp = kmalloc(sizeof(*scfcp), GFP_ATOMIC);
+   if (WARN_ON_ONCE(!scfcp))
+   atomic_inc(&n_alloc_errs);
+   }
if (scfsp->scfs_wait)
scfp->n_many_wait++;
else
scfp->n_many++;
-   smp_call_function_many(cpu_online_mask, scf_handler, NULL, 
scfsp->scfs_wait);
+   if (scfcp) {
+   scfcp->scfc_cpu = -1;
+   scfcp->scfc_wait = true;
+   scfcp->scfc_out = false;
+   scfcp->scfc_in = true;
+   }
+   smp_call_function_many(cpu_online_mask, scf_handler, scfcp, 
scfsp->scfs_wait);
+   if (scfcp) {
+   if (WARN_ON_ONCE(!scfcp->scfc_out))
+   atomic_inc(&n_mb_out_errs);  // Leak rather 
than trash!
+   else
+   kfree(scfcp);
+   }
break;
case SCF_PRIM_ALL:
if (scfsp->scfs_wait)


[tip: core/rcu] scftorture: Consolidate scftorture_invoke_one() scf_check initialization

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 4df55bddc1a360e94c86e227fe417ac9422cb615
Gitweb:
https://git.kernel.org/tip/4df55bddc1a360e94c86e227fe417ac9422cb615
Author:Paul E. McKenney 
AuthorDate:Thu, 09 Jul 2020 13:58:32 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:35 -07:00

scftorture: Consolidate scftorture_invoke_one() scf_check initialization

This commit hoists much of the initialization of the scf_check
structure out of the switch statement, thus saving a few lines of code.
The initialization of the ->scfc_in field remains in each leg of the
switch statement in order to more heavily stress memory ordering.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 21 -
 1 file changed, 8 insertions(+), 13 deletions(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index f220cd3..8ab72e5 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -299,8 +299,13 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
preempt_disable();
if (scfsp->scfs_prim == SCF_PRIM_SINGLE || scfsp->scfs_wait) {
scfcp = kmalloc(sizeof(*scfcp), GFP_ATOMIC);
-   if (WARN_ON_ONCE(!scfcp))
+   if (WARN_ON_ONCE(!scfcp)) {
atomic_inc(&n_alloc_errs);
+   } else {
+   scfcp->scfc_cpu = -1;
+   scfcp->scfc_wait = scfsp->scfs_wait;
+   scfcp->scfc_out = false;
+   }
}
switch (scfsp->scfs_prim) {
case SCF_PRIM_SINGLE:
@@ -311,8 +316,6 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfp->n_single++;
if (scfcp) {
scfcp->scfc_cpu = cpu;
-   scfcp->scfc_wait = scfsp->scfs_wait;
-   scfcp->scfc_out = false;
scfcp->scfc_in = true;
}
ret = smp_call_function_single(cpu, scf_handler_1, (void 
*)scfcp, scfsp->scfs_wait);
@@ -330,12 +333,8 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfp->n_many_wait++;
else
scfp->n_many++;
-   if (scfcp) {
-   scfcp->scfc_cpu = -1;
-   scfcp->scfc_wait = true;
-   scfcp->scfc_out = false;
+   if (scfcp)
scfcp->scfc_in = true;
-   }
smp_call_function_many(cpu_online_mask, scf_handler, scfcp, 
scfsp->scfs_wait);
break;
case SCF_PRIM_ALL:
@@ -343,12 +342,8 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfp->n_all_wait++;
else
scfp->n_all++;
-   if (scfcp) {
-   scfcp->scfc_cpu = -1;
-   scfcp->scfc_wait = true;
-   scfcp->scfc_out = false;
+   if (scfcp)
scfcp->scfc_in = true;
-   }
smp_call_function(scf_handler, scfcp, scfsp->scfs_wait);
break;
}


[tip: core/rcu] scftorture: Flag errors in torture-compatible manner

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: dbf83b655a7853bc430af10e9a3e7eb1f4c90f86
Gitweb:
https://git.kernel.org/tip/dbf83b655a7853bc430af10e9a3e7eb1f4c90f86
Author:Paul E. McKenney 
AuthorDate:Wed, 01 Jul 2020 16:06:22 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:35 -07:00

scftorture: Flag errors in torture-compatible manner

This commit prints error counts on the statistics line and also adds a
"!!!" if any of the counters are non-zero.  Allocation failures are
(somewhat) forgiven, but all other errors result in a "FAILURE" print
at the end of the test.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 14 ++
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 8ab72e5..880c2ce 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -132,6 +132,7 @@ static atomic_t n_mb_in_errs;
 static atomic_t n_mb_out_errs;
 static atomic_t n_alloc_errs;
 static bool scfdone;
+static char *bangstr = "";
 
 DEFINE_TORTURE_RANDOM_PERCPU(scf_torture_rand);
 
@@ -156,12 +157,17 @@ static void scf_torture_stats_print(void)
scfs.n_all += scf_stats_p[i].n_all;
scfs.n_all_wait += scf_stats_p[i].n_all_wait;
}
-   pr_alert("%s scf_invoked_count %s: %lld single: %lld/%lld single_ofl: 
%lld/%lld many: %lld/%lld all: %lld/%lld ",
-SCFTORT_FLAG, isdone ? "VER" : "ver", invoked_count,
+   if (atomic_read(&n_errs) || atomic_read(&n_mb_in_errs) ||
+   atomic_read(&n_mb_out_errs) || atomic_read(&n_alloc_errs))
+   bangstr = "!!! ";
+   pr_alert("%s %sscf_invoked_count %s: %lld single: %lld/%lld single_ofl: 
%lld/%lld many: %lld/%lld all: %lld/%lld ",
+SCFTORT_FLAG, bangstr, isdone ? "VER" : "ver", invoked_count,
 scfs.n_single, scfs.n_single_wait, scfs.n_single_ofl, 
scfs.n_single_wait_ofl,
 scfs.n_many, scfs.n_many_wait, scfs.n_all, scfs.n_all_wait);
torture_onoff_stats();
-   pr_cont("\n");
+   pr_cont("ste: %d stnmie: %d stnmoe: %d staf: %d\n", 
atomic_read(&n_errs),
+   atomic_read(&n_mb_in_errs), atomic_read(&n_mb_out_errs),
+   atomic_read(&n_alloc_errs));
 }
 
 // Periodically prints torture statistics, if periodic statistics printing
@@ -431,7 +437,7 @@ static void scf_torture_cleanup(void)
kfree(scf_stats_p);  // -After- the last stats print has completed!
scf_stats_p = NULL;
 
-   if (atomic_read(&n_errs))
+   if (atomic_read(&n_errs) || atomic_read(&n_mb_in_errs) || 
atomic_read(&n_mb_out_errs))
scftorture_print_module_parms("End of test: FAILURE");
else if (torture_onoff_failures())
scftorture_print_module_parms("End of test: LOCK_HOTPLUG");


[tip: core/rcu] rcu: Add Kconfig option for strict RCU grace periods

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 8cbd0e38a9f2de38e8991c5c1c6f9024b2731d17
Gitweb:
https://git.kernel.org/tip/8cbd0e38a9f2de38e8991c5c1c6f9024b2731d17
Author:Paul E. McKenney 
AuthorDate:Wed, 05 Aug 2020 15:51:20 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:40:23 -07:00

rcu: Add Kconfig option for strict RCU grace periods

People running automated tests have asked for a way to make RCU minimize
grace-period duration in order to increase the probability of KASAN
detecting a pointer being improperly leaked from an RCU read-side critical
section, for example, like this:

rcu_read_lock();
p = rcu_dereference(gp);
do_something_with(p); // OK
rcu_read_unlock();
do_something_else_with(p); // BUG!!!

The rcupdate.rcu_expedited boot parameter is a start in this direction,
given that it makes calls to synchronize_rcu() instead invoke the faster
(and more wasteful) synchronize_rcu_expedited().  However, this does
nothing to shorten RCU grace periods that are instead initiated by
call_rcu(), and RCU pointer-leak bugs can involve call_rcu() just as
surely as they can synchronize_rcu().

This commit therefore adds a RCU_STRICT_GRACE_PERIOD Kconfig option
that will be used to shorten normal (non-expedited) RCU grace periods.
This commit also dumps out a message when this option is in effect.
Later commits will actually shorten grace periods.

Reported-by Jann Horn 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/Kconfig.debug | 15 +++
 kernel/rcu/tree_plugin.h |  2 ++
 2 files changed, 17 insertions(+)

diff --git a/kernel/rcu/Kconfig.debug b/kernel/rcu/Kconfig.debug
index 3cf6132..cab5a4b 100644
--- a/kernel/rcu/Kconfig.debug
+++ b/kernel/rcu/Kconfig.debug
@@ -114,4 +114,19 @@ config RCU_EQS_DEBUG
  Say N here if you need ultimate kernel/user switch latencies
  Say Y if you are unsure
 
+config RCU_STRICT_GRACE_PERIOD
+   bool "Provide debug RCU implementation with short grace periods"
+   depends on DEBUG_KERNEL && RCU_EXPERT
+   default n
+   select PREEMPT_COUNT if PREEMPT=n
+   help
+ Select this option to build an RCU variant that is strict about
+ grace periods, making them as short as it can.  This limits
+ scalability, destroys real-time response, degrades battery
+ lifetime and kills performance.  Don't try this on large
+ machines, as in systems with more than about 10 or 20 CPUs.
+ But in conjunction with tools like KASAN, it can be helpful
+ when looking for certain types of RCU usage bugs, for example,
+ too-short RCU read-side critical sections.
+
 endmenu # "RCU Debugging"
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 982fc5b..44cf77d 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -36,6 +36,8 @@ static void __init rcu_bootup_announce_oddness(void)
pr_info("\tRCU dyntick-idle grace-period acceleration is 
enabled.\n");
if (IS_ENABLED(CONFIG_PROVE_RCU))
pr_info("\tRCU lockdep checking is enabled.\n");
+   if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
+   pr_info("\tRCU strict (and thus non-scalable) grace periods 
enabled.\n");
if (RCU_NUM_LVLS >= 4)
pr_info("\tFour(or more)-level hierarchy is enabled.\n");
if (RCU_FANOUT_LEAF != 16)


[tip: core/rcu] rcu: Move rcu_cpu_started per-CPU variable to rcu_data

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: c0f97f20e5d97a1358ade650fcf6a322c0c9bc72
Gitweb:
https://git.kernel.org/tip/c0f97f20e5d97a1358ade650fcf6a322c0c9bc72
Author:Paul E. McKenney 
AuthorDate:Fri, 24 Jul 2020 20:22:05 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:37:54 -07:00

rcu: Move rcu_cpu_started per-CPU variable to rcu_data

When the rcu_cpu_started per-CPU variable was added by commit
f64c6013a202 ("rcu/x86: Provide early rcu_cpu_starting() callback"),
there were multiple sets of per-CPU rcu_data structures.  Therefore, the
rcu_cpu_started flag was added as a separate per-CPU variable.  But now
there is only one set of per-CPU rcu_data structures, so this commit
moves rcu_cpu_started to a new ->cpu_started field in that structure.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 11 ---
 kernel/rcu/tree.h |  1 +
 2 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index da05afc..52108dd 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -3967,8 +3967,6 @@ int rcutree_offline_cpu(unsigned int cpu)
return 0;
 }
 
-static DEFINE_PER_CPU(int, rcu_cpu_started);
-
 /*
  * Mark the specified CPU as being online so that subsequent grace periods
  * (both expedited and normal) will wait on it.  Note that this means that
@@ -3988,12 +3986,11 @@ void rcu_cpu_starting(unsigned int cpu)
struct rcu_node *rnp;
bool newcpu;
 
-   if (per_cpu(rcu_cpu_started, cpu))
+   rdp = per_cpu_ptr(&rcu_data, cpu);
+   if (rdp->cpu_started)
return;
+   rdp->cpu_started = true;
 
-   per_cpu(rcu_cpu_started, cpu) = 1;
-
-   rdp = per_cpu_ptr(&rcu_data, cpu);
rnp = rdp->mynode;
mask = rdp->grpmask;
raw_spin_lock_irqsave_rcu_node(rnp, flags);
@@ -4053,7 +4050,7 @@ void rcu_report_dead(unsigned int cpu)
raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
raw_spin_unlock(&rcu_state.ofl_lock);
 
-   per_cpu(rcu_cpu_started, cpu) = 0;
+   rdp->cpu_started = false;
 }
 
 /*
diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h
index c96ae35..309bc7f 100644
--- a/kernel/rcu/tree.h
+++ b/kernel/rcu/tree.h
@@ -156,6 +156,7 @@ struct rcu_data {
boolbeenonline; /* CPU online at least once. */
boolgpwrap; /* Possible ->gp_seq wrap. */
boolexp_deferred_qs; /* This CPU awaiting a deferred QS? */
+   boolcpu_started;/* RCU watching this onlining CPU. */
struct rcu_node *mynode;/* This CPU's leaf of hierarchy */
unsigned long grpmask;  /* Mask to apply to leaf qsmask. */
unsigned long   ticks_this_gp;  /* The number of scheduling-clock */


[tip: core/rcu] torture: Add scftorture to the rcutorture scripting

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 80c9476e683ec37ba45fd8e6a5c5081bea207e1a
Gitweb:
https://git.kernel.org/tip/80c9476e683ec37ba45fd8e6a5c5081bea207e1a
Author:Paul E. McKenney 
AuthorDate:Wed, 24 Jun 2020 17:57:07 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:32 -07:00

torture: Add scftorture to the rcutorture scripting

This commit updates the rcutorture scripting to include the new scftorture
torture-test module.

Signed-off-by: Paul E. McKenney 
---
 tools/testing/selftests/rcutorture/bin/kvm-recheck-scf.sh   | 38 
++
 tools/testing/selftests/rcutorture/bin/kvm.sh   |  2 +-
 tools/testing/selftests/rcutorture/configs/scf/CFLIST   |  2 ++
 tools/testing/selftests/rcutorture/configs/scf/CFcommon |  2 ++
 tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT|  9 +
 tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT.boot   |  1 +
 tools/testing/selftests/rcutorture/configs/scf/PREEMPT  |  9 +
 tools/testing/selftests/rcutorture/configs/scf/ver_functions.sh | 30 
++
 8 files changed, 92 insertions(+), 1 deletion(-)
 create mode 100755 tools/testing/selftests/rcutorture/bin/kvm-recheck-scf.sh
 create mode 100644 tools/testing/selftests/rcutorture/configs/scf/CFLIST
 create mode 100644 tools/testing/selftests/rcutorture/configs/scf/CFcommon
 create mode 100644 tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT
 create mode 100644 
tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT.boot
 create mode 100644 tools/testing/selftests/rcutorture/configs/scf/PREEMPT
 create mode 100644 
tools/testing/selftests/rcutorture/configs/scf/ver_functions.sh

diff --git a/tools/testing/selftests/rcutorture/bin/kvm-recheck-scf.sh 
b/tools/testing/selftests/rcutorture/bin/kvm-recheck-scf.sh
new file mode 100755
index 000..671bfee
--- /dev/null
+++ b/tools/testing/selftests/rcutorture/bin/kvm-recheck-scf.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Analyze a given results directory for rcutorture progress.
+#
+# Usage: kvm-recheck-rcu.sh resdir
+#
+# Copyright (C) Facebook, 2020
+#
+# Authors: Paul E. McKenney 
+
+i="$1"
+if test -d "$i" -a -r "$i"
+then
+   :
+else
+   echo Unreadable results directory: $i
+   exit 1
+fi
+. functions.sh
+
+configfile=`echo $i | sed -e 's/^.*\///'`
+nscfs="`grep 'scf_invoked_count ver:' $i/console.log 2> /dev/null | tail -1 | 
sed -e 's/^.* scf_invoked_count ver: //' -e 's/ .*$//' | tr -d '\015'`"
+if test -z "$nscfs"
+then
+   echo "$configfile --- "
+else
+   dur="`sed -e 's/^.* scftorture.shutdown_secs=//' -e 's/ .*$//' < 
$i/qemu-cmd 2> /dev/null`"
+   if test -z "$dur"
+   then
+   rate=""
+   else
+   nscfss=`awk -v nscfs=$nscfs -v dur=$dur '
+   BEGIN { print nscfs / dur }' < /dev/null`
+   rate=" ($nscfss/s)"
+   fi
+   echo "${configfile} --- ${nscfs} SCF handler invocations$rate"
+fi
diff --git a/tools/testing/selftests/rcutorture/bin/kvm.sh 
b/tools/testing/selftests/rcutorture/bin/kvm.sh
index e655983..44dfdd9 100755
--- a/tools/testing/selftests/rcutorture/bin/kvm.sh
+++ b/tools/testing/selftests/rcutorture/bin/kvm.sh
@@ -184,7 +184,7 @@ do
shift
;;
--torture)
-   checkarg --torture "(suite name)" "$#" "$2" 
'^\(lock\|rcu\|rcuperf\|refscale\)$' '^--'
+   checkarg --torture "(suite name)" "$#" "$2" 
'^\(lock\|rcu\|rcuperf\|refscale\|scf\)$' '^--'
TORTURE_SUITE=$2
shift
if test "$TORTURE_SUITE" = rcuperf || test "$TORTURE_SUITE" = 
refscale
diff --git a/tools/testing/selftests/rcutorture/configs/scf/CFLIST 
b/tools/testing/selftests/rcutorture/configs/scf/CFLIST
new file mode 100644
index 000..4d62eb4
--- /dev/null
+++ b/tools/testing/selftests/rcutorture/configs/scf/CFLIST
@@ -0,0 +1,2 @@
+NOPREEMPT
+PREEMPT
diff --git a/tools/testing/selftests/rcutorture/configs/scf/CFcommon 
b/tools/testing/selftests/rcutorture/configs/scf/CFcommon
new file mode 100644
index 000..c11ab91
--- /dev/null
+++ b/tools/testing/selftests/rcutorture/configs/scf/CFcommon
@@ -0,0 +1,2 @@
+CONFIG_SCF_TORTURE_TEST=y
+CONFIG_PRINTK_TIME=y
diff --git a/tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT 
b/tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT
new file mode 100644
index 000..b8429d6
--- /dev/null
+++ b/tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT
@@ -0,0 +1,9 @@
+CONFIG_SMP=y
+CONFIG_PREEMPT_NONE=y
+CONFIG_PREEMPT_VOLUNTARY=n
+CONFIG_PREEMPT=n
+CONFIG_HZ_PERIODIC=n
+CONFIG_NO_HZ_IDLE=n
+CONFIG_NO_HZ_FULL=y
+CONFIG_DEBUG_LOCK_ALLOC=n
+CONFIG_PROVE_LOCKING=n
diff --git a/tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT.boot 
b/tools/testing/selftests/rcutorture

[tip: core/rcu] kvm: mmu: page_track: Fix RCU list API usage

2020-10-08 Thread tip-bot2 for Madhuparna Bhowmik
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: df9a30fd1f70a757df193acd7396622eee23e527
Gitweb:
https://git.kernel.org/tip/df9a30fd1f70a757df193acd7396622eee23e527
Author:Madhuparna Bhowmik 
AuthorDate:Sun, 12 Jul 2020 18:40:03 +05:30
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:23 -07:00

kvm: mmu: page_track: Fix RCU list API usage

Use hlist_for_each_entry_srcu() instead of hlist_for_each_entry_rcu()
as it also checkes if the right lock is held.
Using hlist_for_each_entry_rcu() with a condition argument will not
report the cases where a SRCU protected list is traversed using
rcu_read_lock(). Hence, use hlist_for_each_entry_srcu().

Signed-off-by: Madhuparna Bhowmik 
Signed-off-by: Paul E. McKenney 
Acked-by: Paolo Bonzini 
Cc: 
---
 arch/x86/kvm/mmu/page_track.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kvm/mmu/page_track.c b/arch/x86/kvm/mmu/page_track.c
index a84a141..8443a67 100644
--- a/arch/x86/kvm/mmu/page_track.c
+++ b/arch/x86/kvm/mmu/page_track.c
@@ -229,7 +229,8 @@ void kvm_page_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, 
const u8 *new,
return;
 
idx = srcu_read_lock(&head->track_srcu);
-   hlist_for_each_entry_rcu(n, &head->track_notifier_list, node)
+   hlist_for_each_entry_srcu(n, &head->track_notifier_list, node,
+   srcu_read_lock_held(&head->track_srcu))
if (n->track_write)
n->track_write(vcpu, gpa, new, bytes, n);
srcu_read_unlock(&head->track_srcu, idx);
@@ -254,7 +255,8 @@ void kvm_page_track_flush_slot(struct kvm *kvm, struct 
kvm_memory_slot *slot)
return;
 
idx = srcu_read_lock(&head->track_srcu);
-   hlist_for_each_entry_rcu(n, &head->track_notifier_list, node)
+   hlist_for_each_entry_srcu(n, &head->track_notifier_list, node,
+   srcu_read_lock_held(&head->track_srcu))
if (n->track_flush_slot)
n->track_flush_slot(kvm, slot, n);
srcu_read_unlock(&head->track_srcu, idx);


[tip: core/rcu] rcu/nocb: Add a warning for non-GP kthread running GP code

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 4569c5ee95d5695bfd794ae968c2d59b3e69129a
Gitweb:
https://git.kernel.org/tip/4569c5ee95d5695bfd794ae968c2d59b3e69129a
Author:Paul E. McKenney 
AuthorDate:Wed, 05 Aug 2020 10:35:16 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:37:54 -07:00

rcu/nocb: Add a warning for non-GP kthread running GP code

This commit increases RCU's ability to defend itself by emitting a warning
if one of the nocb CB kthreads invokes the GP kthread's wait function.
This warning augments a similar check that is carried out at the end
of rcutorture testing and when RCU CPU stall warnings are emitted.
The problem with those checks is that the miscreants have long since
departed and disposed of any and all evidence.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree_plugin.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 4d63ee3..cb1e8c8 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -1926,6 +1926,7 @@ static void nocb_gp_wait(struct rcu_data *my_rdp)
 * nearest grace period (if any) to wait for next.  The CB kthreads
 * and the global grace-period kthread are awakened if needed.
 */
+   WARN_ON_ONCE(my_rdp->nocb_gp_rdp != my_rdp);
for (rdp = my_rdp; rdp; rdp = rdp->nocb_next_cb_rdp) {
trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("Check"));
rcu_nocb_lock_irqsave(rdp, flags);


[tip: core/rcu] scftorture: Summarize per-thread statistics

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: dba3142b37f343734bf61dbce2914acb76e69fb6
Gitweb:
https://git.kernel.org/tip/dba3142b37f343734bf61dbce2914acb76e69fb6
Author:Paul E. McKenney 
AuthorDate:Tue, 30 Jun 2020 16:13:37 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:33 -07:00

scftorture: Summarize per-thread statistics

This commit summarizes the per-thread statistics, providing counts of
the number of single, many, and all calls, both no-wait and wait, and,
for the single case, the number where the target CPU was offline.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 22 ++
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 5f19845..09a6242 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -128,13 +128,27 @@ DEFINE_TORTURE_RANDOM_PERCPU(scf_torture_rand);
 static void scf_torture_stats_print(void)
 {
int cpu;
+   int i;
long long invoked_count = 0;
bool isdone = READ_ONCE(scfdone);
+   struct scf_statistics scfs = {};
 
for_each_possible_cpu(cpu)
invoked_count += data_race(per_cpu(scf_invoked_count, cpu));
-   pr_alert("%s scf_invoked_count %s: %lld ",
-SCFTORT_FLAG, isdone ? "VER" : "ver", invoked_count);
+   for (i = 0; i < nthreads; i++) {
+   scfs.n_single += scf_stats_p[i].n_single;
+   scfs.n_single_ofl += scf_stats_p[i].n_single_ofl;
+   scfs.n_single_wait += scf_stats_p[i].n_single_wait;
+   scfs.n_single_wait_ofl += scf_stats_p[i].n_single_wait_ofl;
+   scfs.n_many += scf_stats_p[i].n_many;
+   scfs.n_many_wait += scf_stats_p[i].n_many_wait;
+   scfs.n_all += scf_stats_p[i].n_all;
+   scfs.n_all_wait += scf_stats_p[i].n_all_wait;
+   }
+   pr_alert("%s scf_invoked_count %s: %lld single: %lld/%lld single_ofl: 
%lld/%lld many: %lld/%lld all: %lld/%lld ",
+SCFTORT_FLAG, isdone ? "VER" : "ver", invoked_count,
+scfs.n_single, scfs.n_single_wait, scfs.n_single_ofl, 
scfs.n_single_wait_ofl,
+scfs.n_many, scfs.n_many_wait, scfs.n_all, scfs.n_all_wait);
torture_onoff_stats();
pr_cont("\n");
 }
@@ -357,11 +371,11 @@ static void scf_torture_cleanup(void)
torture_stop_kthread("scftorture_invoker", 
scf_stats_p[i].task);
else
goto end;
-   kfree(scf_stats_p);
-   scf_stats_p = NULL;
smp_call_function(scf_cleanup_handler, NULL, 0);
torture_stop_kthread(scf_torture_stats, scf_torture_stats_task);
scf_torture_stats_print();  // -After- the stats thread is stopped!
+   kfree(scf_stats_p);  // -After- the last stats print has completed!
+   scf_stats_p = NULL;
 
if (atomic_read(&n_errs))
scftorture_print_module_parms("End of test: FAILURE");


[tip: core/rcu] scftorture: Add smp_call_function() torture test

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: e9d338a0b1799c988b678e8ccb66a442272e6aa3
Gitweb:
https://git.kernel.org/tip/e9d338a0b1799c988b678e8ccb66a442272e6aa3
Author:Paul E. McKenney 
AuthorDate:Wed, 24 Jun 2020 15:59:59 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:31 -07:00

scftorture: Add smp_call_function() torture test

This commit adds an smp_call_function() torture test that repeatedly
invokes this function and complains if things go badly awry.

Signed-off-by: Paul E. McKenney 
---
 Documentation/admin-guide/kernel-parameters.txt |  92 -
 kernel/Makefile |   2 +-
 kernel/scftorture.c | 350 +++-
 lib/Kconfig.debug   |  10 +-
 4 files changed, 454 insertions(+)
 create mode 100644 kernel/scftorture.c

diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index bdc1f33..91a5638 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4637,6 +4637,98 @@
Format: integer between 0 and 10
Default is 0.
 
+   scftorture.holdoff= [KNL]
+   Number of seconds to hold off before starting
+   test.  Defaults to zero for module insertion and
+   to 10 seconds for built-in smp_call_function()
+   tests.
+
+   scftorture.longwait= [KNL]
+   Request ridiculously long waits randomly selected
+   up to the chosen limit in seconds.  Zero (the
+   default) disables this feature.  Please note
+   that requesting even small non-zero numbers of
+   seconds can result in RCU CPU stall warnings,
+   softlockup complaints, and so on.
+
+   scftorture.nthreads= [KNL]
+   Number of kthreads to spawn to invoke the
+   smp_call_function() family of functions.
+   The default of -1 specifies a number of kthreads
+   equal to the number of CPUs.
+
+   scftorture.onoff_holdoff= [KNL]
+   Number seconds to wait after the start of the
+   test before initiating CPU-hotplug operations.
+
+   scftorture.onoff_interval= [KNL]
+   Number seconds to wait between successive
+   CPU-hotplug operations.  Specifying zero (which
+   is the default) disables CPU-hotplug operations.
+
+   scftorture.shutdown_secs= [KNL]
+   The number of seconds following the start of the
+   test after which to shut down the system.  The
+   default of zero avoids shutting down the system.
+   Non-zero values are useful for automated tests.
+
+   scftorture.stat_interval= [KNL]
+   The number of seconds between outputting the
+   current test statistics to the console.  A value
+   of zero disables statistics output.
+
+   scftorture.stutter_cpus= [KNL]
+   The number of jiffies to wait between each change
+   to the set of CPUs under test.
+
+   scftorture.use_cpus_read_lock= [KNL]
+   Use use_cpus_read_lock() instead of the default
+   preempt_disable() to disable CPU hotplug
+   while invoking one of the smp_call_function*()
+   functions.
+
+   scftorture.verbose= [KNL]
+   Enable additional printk() statements.
+
+   scftorture.weight_single= [KNL]
+   The probability weighting to use for the
+   smp_call_function_single() function with a zero
+   "wait" parameter.  A value of -1 selects the
+   default if all other weights are -1.  However,
+   if at least one weight has some other value, a
+   value of -1 will instead select a weight of zero.
+
+   scftorture.weight_single_wait= [KNL]
+   The probability weighting to use for the
+   smp_call_function_single() function with a
+   non-zero "wait" parameter.  See weight_single.
+
+   scftorture.weight_many= [KNL]
+   The probability weighting to use for the
+   smp_call_function_many() function with a zero
+   "wait" parameter.  See weight_single.
+   Note well that setting a high probability for
+   this weighting can place serious IPI load
+   on the 

[tip: core/rcu] scftorture: Add cond_resched() to test loop

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 65bd77f554336407f5fd7ced7a6df686767fba21
Gitweb:
https://git.kernel.org/tip/65bd77f554336407f5fd7ced7a6df686767fba21
Author:Paul E. McKenney 
AuthorDate:Thu, 23 Jul 2020 15:53:02 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:38 -07:00

scftorture: Add cond_resched() to test loop

Although the test loop does randomly delay, which would provide quiescent
states and so forth, it is possible for there to be a series of long
smp_call_function*() handler runtimes with no delays, which results in
softlockup and RCU CPU stall warning messages.  This commit therefore
inserts a cond_resched() into the main test loop.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index fc22bcc..554a521 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -420,6 +420,7 @@ static int scftorture_invoker(void *arg)
set_cpus_allowed_ptr(current, cpumask_of(cpu));
was_offline = false;
}
+   cond_resched();
} while (!torture_must_stop());
 
VERBOSE_SCFTORTOUT("scftorture_invoker %d ended", scfp->cpu);


[tip: core/rcu] rcu: Add READ_ONCE() to rcu_do_batch() access to rcu_cpu_stall_ftrace_dump

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 1ef5a442a113d140580b3b8bbd6f50c9f7746397
Gitweb:
https://git.kernel.org/tip/1ef5a442a113d140580b3b8bbd6f50c9f7746397
Author:Paul E. McKenney 
AuthorDate:Tue, 23 Jun 2020 20:57:59 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:08 -07:00

rcu: Add READ_ONCE() to rcu_do_batch() access to rcu_cpu_stall_ftrace_dump

Given that sysfs can change the value of rcu_cpu_stall_ftrace_dump at any
time, this commit adds a READ_ONCE() to the accesses to that variable.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree_stall.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
index a1780a6..0fde39b 100644
--- a/kernel/rcu/tree_stall.h
+++ b/kernel/rcu/tree_stall.h
@@ -623,7 +623,7 @@ static void check_cpu_stall(struct rcu_data *rdp)
 
/* We haven't checked in, so go dump stack. */
print_cpu_stall(gps);
-   if (rcu_cpu_stall_ftrace_dump)
+   if (READ_ONCE(rcu_cpu_stall_ftrace_dump))
rcu_ftrace_dump(DUMP_ALL);
 
} else if (rcu_gp_in_progress() &&
@@ -632,7 +632,7 @@ static void check_cpu_stall(struct rcu_data *rdp)
 
/* They had a few time units to dump stack, so complain. */
print_other_cpu_stall(gs2, gps);
-   if (rcu_cpu_stall_ftrace_dump)
+   if (READ_ONCE(rcu_cpu_stall_ftrace_dump))
rcu_ftrace_dump(DUMP_ALL);
}
 }


[tip: core/rcu] rcu: Initialize at declaration time in rcu_exp_handler()

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 7487ea07dfa9bd782a13469cab18973ea0ab8c57
Gitweb:
https://git.kernel.org/tip/7487ea07dfa9bd782a13469cab18973ea0ab8c57
Author:Paul E. McKenney 
AuthorDate:Thu, 18 Jun 2020 09:51:12 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:03 -07:00

rcu: Initialize at declaration time in rcu_exp_handler()

This commit moves the initialization of the CONFIG_PREEMPT=n version of
the rcu_exp_handler() function's rdp and rnp local variables into their
respective declarations to save a couple lines of code.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree_exp.h | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h
index 1888c0e..8760b6e 100644
--- a/kernel/rcu/tree_exp.h
+++ b/kernel/rcu/tree_exp.h
@@ -732,11 +732,9 @@ static void rcu_exp_need_qs(void)
 /* Invoked on each online non-idle CPU for expedited quiescent state. */
 static void rcu_exp_handler(void *unused)
 {
-   struct rcu_data *rdp;
-   struct rcu_node *rnp;
+   struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
+   struct rcu_node *rnp = rdp->mynode;
 
-   rdp = this_cpu_ptr(&rcu_data);
-   rnp = rdp->mynode;
if (!(READ_ONCE(rnp->expmask) & rdp->grpmask) ||
__this_cpu_read(rcu_data.cpu_no_qs.b.exp))
return;


[tip: core/rcu] rcu/tree: Remove CONFIG_PREMPT_RCU check in force_qs_rnp()

2020-10-08 Thread tip-bot2 for Neeraj Upadhyay
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 9b1ce0acb5e65e9ea1e6b322562d072f9f7d1f6e
Gitweb:
https://git.kernel.org/tip/9b1ce0acb5e65e9ea1e6b322562d072f9f7d1f6e
Author:Neeraj Upadhyay 
AuthorDate:Mon, 22 Jun 2020 23:37:03 +05:30
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:06 -07:00

rcu/tree: Remove CONFIG_PREMPT_RCU check in force_qs_rnp()

Originally, the call to rcu_preempt_blocked_readers_cgp() from
force_qs_rnp() had to be conditioned on CONFIG_PREEMPT_RCU=y, as in
commit a77da14ce9af ("rcu: Yet another fix for preemption and CPU
hotplug").  However, there is now a CONFIG_PREEMPT_RCU=n definition of
rcu_preempt_blocked_readers_cgp() that unconditionally returns zero, so
invoking it is now safe.  In addition, the CONFIG_PREEMPT_RCU=n definition
of rcu_initiate_boost() simply releases the rcu_node structure's ->lock,
which is what happens when the "if" condition evaluates to false.

This commit therefore drops the IS_ENABLED(CONFIG_PREEMPT_RCU) check,
so that rcu_initiate_boost() is called only in CONFIG_PREEMPT_RCU=y
kernels when there are readers blocking the current grace period.
This does not change the behavior, but reduces code-reader confusion by
eliminating non-CONFIG_PREEMPT_RCU=y calls to rcu_initiate_boost().

Signed-off-by: Neeraj Upadhyay 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 4770d77..acc926f 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2533,8 +2533,7 @@ static void force_qs_rnp(int (*f)(struct rcu_data *rdp))
raw_spin_lock_irqsave_rcu_node(rnp, flags);
rcu_state.cbovldnext |= !!rnp->cbovldmask;
if (rnp->qsmask == 0) {
-   if (!IS_ENABLED(CONFIG_PREEMPT_RCU) ||
-   rcu_preempt_blocked_readers_cgp(rnp)) {
+   if (rcu_preempt_blocked_readers_cgp(rnp)) {
/*
 * No point in scanning bits because they
 * are all zero.  But we might need to


[tip: core/rcu] rcu: Add READ_ONCE() to rcu_do_batch() access to rcu_divisor

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: b5374b2df0ac1c78895b8eb8d9582a7bdc67257d
Gitweb:
https://git.kernel.org/tip/b5374b2df0ac1c78895b8eb8d9582a7bdc67257d
Author:Paul E. McKenney 
AuthorDate:Tue, 23 Jun 2020 17:09:27 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:06 -07:00

rcu: Add READ_ONCE() to rcu_do_batch() access to rcu_divisor

Given that sysfs can change the value of rcu_divisor at any time, this
commit adds a READ_ONCE to the sole access to that variable.  While in
the area, this commit also adds bounds checking, clamping the value to
a shift that makes sense for a signed long.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index acc926f..1dca14c 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2362,6 +2362,7 @@ int rcutree_dead_cpu(unsigned int cpu)
  */
 static void rcu_do_batch(struct rcu_data *rdp)
 {
+   int div;
unsigned long flags;
const bool offloaded = IS_ENABLED(CONFIG_RCU_NOCB_CPU) &&
   rcu_segcblist_is_offloaded(&rdp->cblist);
@@ -2390,7 +2391,9 @@ static void rcu_do_batch(struct rcu_data *rdp)
rcu_nocb_lock(rdp);
WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
pending = rcu_segcblist_n_cbs(&rdp->cblist);
-   bl = max(rdp->blimit, pending >> rcu_divisor);
+   div = READ_ONCE(rcu_divisor);
+   div = div < 0 ? 7 : div > sizeof(long) * 8 - 2 ? sizeof(long) * 8 - 2 : 
div;
+   bl = max(rdp->blimit, pending >> div);
if (unlikely(bl > 100))
tlimit = local_clock() + rcu_resched_ns;
trace_rcu_batch_start(rcu_state.name,


[tip: core/rcu] rcu/trace: Use gp_seq_req in acceleration's rcu_grace_period tracepoint

2020-10-08 Thread tip-bot2 for Joel Fernandes (Google)
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: a7886e899fd8334a03d37e66ad10295d175725ea
Gitweb:
https://git.kernel.org/tip/a7886e899fd8334a03d37e66ad10295d175725ea
Author:Joel Fernandes (Google) 
AuthorDate:Thu, 18 Jun 2020 21:36:40 -04:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:04 -07:00

rcu/trace: Use gp_seq_req in acceleration's rcu_grace_period tracepoint

During acceleration of CB, the rsp's gp_seq is rcu_seq_snap'd. This is
the value used for acceleration - it is the value of gp_seq at which it
is safe the execute all callbacks in the callback list.

The rdp's gp_seq is not very useful for this scenario. Make
rcu_grace_period report the gp_seq_req instead as it allows one to
reason about how the acceleration works.

Signed-off-by: Joel Fernandes (Google) 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index eb36779..8969120 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1483,9 +1483,10 @@ static bool rcu_accelerate_cbs(struct rcu_node *rnp, 
struct rcu_data *rdp)
 
/* Trace depending on how much we were able to accelerate. */
if (rcu_segcblist_restempty(&rdp->cblist, RCU_WAIT_TAIL))
-   trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, 
TPS("AccWaitCB"));
+   trace_rcu_grace_period(rcu_state.name, gp_seq_req, 
TPS("AccWaitCB"));
else
-   trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, 
TPS("AccReadyCB"));
+   trace_rcu_grace_period(rcu_state.name, gp_seq_req, 
TPS("AccReadyCB"));
+
return ret;
 }
 


[tip: core/rcu] rcu: Add READ_ONCE() to rcu_do_batch() access to rcu_kick_kthreads

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: fe63b723cc7ca3a91ea91274e0f2cba29452b3fa
Gitweb:
https://git.kernel.org/tip/fe63b723cc7ca3a91ea91274e0f2cba29452b3fa
Author:Paul E. McKenney 
AuthorDate:Tue, 23 Jun 2020 18:04:45 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:07 -07:00

rcu: Add READ_ONCE() to rcu_do_batch() access to rcu_kick_kthreads

Given that sysfs can change the value of rcu_kick_kthreads at any time,
this commit adds a READ_ONCE() to the sole access to that variable.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree_stall.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
index b5d3b47..a1780a6 100644
--- a/kernel/rcu/tree_stall.h
+++ b/kernel/rcu/tree_stall.h
@@ -158,7 +158,7 @@ static void rcu_stall_kick_kthreads(void)
 {
unsigned long j;
 
-   if (!rcu_kick_kthreads)
+   if (!READ_ONCE(rcu_kick_kthreads))
return;
j = READ_ONCE(rcu_state.jiffies_kick_kthreads);
if (time_after(jiffies, j) && rcu_state.gp_kthread &&
@@ -580,7 +580,7 @@ static void check_cpu_stall(struct rcu_data *rdp)
unsigned long js;
struct rcu_node *rnp;
 
-   if ((rcu_stall_is_suppressed() && !rcu_kick_kthreads) ||
+   if ((rcu_stall_is_suppressed() && !READ_ONCE(rcu_kick_kthreads)) ||
!rcu_gp_in_progress())
return;
rcu_stall_kick_kthreads();


[tip: core/rcu] rcu/trace: Print negative GP numbers correctly

2020-10-08 Thread tip-bot2 for Joel Fernandes (Google)
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: c30068f41a0e899f870e0158a2c69c68d738bf96
Gitweb:
https://git.kernel.org/tip/c30068f41a0e899f870e0158a2c69c68d738bf96
Author:Joel Fernandes (Google) 
AuthorDate:Thu, 18 Jun 2020 21:36:39 -04:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:04 -07:00

rcu/trace: Print negative GP numbers correctly

GP numbers start from -300 and gp_seq numbers start of -1200 (for a
shift of 2). These negative numbers are printed as unsigned long which
not only takes up more text space, but is rather confusing to the reader
as they have to constantly expend energy to truncate the number. Just
print the negative numbering directly.

Cc: Uladzislau Rezki (Sony) 
Signed-off-by: Joel Fernandes (Google) 
Signed-off-by: Paul E. McKenney 
---
 include/trace/events/rcu.h | 54 ++---
 1 file changed, 27 insertions(+), 27 deletions(-)

diff --git a/include/trace/events/rcu.h b/include/trace/events/rcu.h
index ced7123..155b5cb 100644
--- a/include/trace/events/rcu.h
+++ b/include/trace/events/rcu.h
@@ -74,17 +74,17 @@ TRACE_EVENT_RCU(rcu_grace_period,
 
TP_STRUCT__entry(
__field(const char *, rcuname)
-   __field(unsigned long, gp_seq)
+   __field(long, gp_seq)
__field(const char *, gpevent)
),
 
TP_fast_assign(
__entry->rcuname = rcuname;
-   __entry->gp_seq = gp_seq;
+   __entry->gp_seq = (long)gp_seq;
__entry->gpevent = gpevent;
),
 
-   TP_printk("%s %lu %s",
+   TP_printk("%s %ld %s",
  __entry->rcuname, __entry->gp_seq, __entry->gpevent)
 );
 
@@ -114,8 +114,8 @@ TRACE_EVENT_RCU(rcu_future_grace_period,
 
TP_STRUCT__entry(
__field(const char *, rcuname)
-   __field(unsigned long, gp_seq)
-   __field(unsigned long, gp_seq_req)
+   __field(long, gp_seq)
+   __field(long, gp_seq_req)
__field(u8, level)
__field(int, grplo)
__field(int, grphi)
@@ -124,16 +124,16 @@ TRACE_EVENT_RCU(rcu_future_grace_period,
 
TP_fast_assign(
__entry->rcuname = rcuname;
-   __entry->gp_seq = gp_seq;
-   __entry->gp_seq_req = gp_seq_req;
+   __entry->gp_seq = (long)gp_seq;
+   __entry->gp_seq_req = (long)gp_seq_req;
__entry->level = level;
__entry->grplo = grplo;
__entry->grphi = grphi;
__entry->gpevent = gpevent;
),
 
-   TP_printk("%s %lu %lu %u %d %d %s",
- __entry->rcuname, __entry->gp_seq, __entry->gp_seq_req, 
__entry->level,
+   TP_printk("%s %ld %ld %u %d %d %s",
+ __entry->rcuname, (long)__entry->gp_seq, 
(long)__entry->gp_seq_req, __entry->level,
  __entry->grplo, __entry->grphi, __entry->gpevent)
 );
 
@@ -153,7 +153,7 @@ TRACE_EVENT_RCU(rcu_grace_period_init,
 
TP_STRUCT__entry(
__field(const char *, rcuname)
-   __field(unsigned long, gp_seq)
+   __field(long, gp_seq)
__field(u8, level)
__field(int, grplo)
__field(int, grphi)
@@ -162,14 +162,14 @@ TRACE_EVENT_RCU(rcu_grace_period_init,
 
TP_fast_assign(
__entry->rcuname = rcuname;
-   __entry->gp_seq = gp_seq;
+   __entry->gp_seq = (long)gp_seq;
__entry->level = level;
__entry->grplo = grplo;
__entry->grphi = grphi;
__entry->qsmask = qsmask;
),
 
-   TP_printk("%s %lu %u %d %d %lx",
+   TP_printk("%s %ld %u %d %d %lx",
  __entry->rcuname, __entry->gp_seq, __entry->level,
  __entry->grplo, __entry->grphi, __entry->qsmask)
 );
@@ -197,17 +197,17 @@ TRACE_EVENT_RCU(rcu_exp_grace_period,
 
TP_STRUCT__entry(
__field(const char *, rcuname)
-   __field(unsigned long, gpseq)
+   __field(long, gpseq)
__field(const char *, gpevent)
),
 
TP_fast_assign(
__entry->rcuname = rcuname;
-   __entry->gpseq = gpseq;
+   __entry->gpseq = (long)gpseq;
__entry->gpevent = gpevent;
),
 
-   TP_printk("%s %lu %s",
+   TP_printk("%s %ld %s",
  __entry->rcuname, __entry->gpseq, __entry->gpevent)
 );
 
@@ -316,17 +316,17 @@ TRACE_EVENT_RCU(rcu_preempt_task,
 
TP_STRUCT__entry(
__field(const char *, rcuname)
-   __field(unsigned long, gp_seq)
+   __field(long, gp_seq)
__field(int, pid)
),
 
TP_fast_assign(
__entry->rcuname = rcuname;
-   __entry->gp_seq = gp_seq;

[tip: core/rcu] rcu: Remove KCSAN stubs from update.c

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: beb27bd649a08655b6e15b71265fccad9c00bd2c
Gitweb:
https://git.kernel.org/tip/beb27bd649a08655b6e15b71265fccad9c00bd2c
Author:Paul E. McKenney 
AuthorDate:Wed, 17 Jun 2020 13:26:20 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:03 -07:00

rcu: Remove KCSAN stubs from update.c

KCSAN is now in mainline, so this commit removes the stubs for the
data_race(), ASSERT_EXCLUSIVE_WRITER(), and ASSERT_EXCLUSIVE_ACCESS()
macros.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/update.c | 13 -
 1 file changed, 13 deletions(-)

diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c
index 2de49b5..5f7713a 100644
--- a/kernel/rcu/update.c
+++ b/kernel/rcu/update.c
@@ -53,19 +53,6 @@
 #endif
 #define MODULE_PARAM_PREFIX "rcupdate."
 
-#ifndef data_race
-#define data_race(expr)
\
-   ({  \
-   expr;   \
-   })
-#endif
-#ifndef ASSERT_EXCLUSIVE_WRITER
-#define ASSERT_EXCLUSIVE_WRITER(var) do { } while (0)
-#endif
-#ifndef ASSERT_EXCLUSIVE_ACCESS
-#define ASSERT_EXCLUSIVE_ACCESS(var) do { } while (0)
-#endif
-
 #ifndef CONFIG_TINY_RCU
 module_param(rcu_expedited, int, 0);
 module_param(rcu_normal, int, 0);


[tip: core/rcu] rcu: Remove KCSAN stubs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: ebc3505d507cf0aafdc31e4b2359c9b22b3927c8
Gitweb:
https://git.kernel.org/tip/ebc3505d507cf0aafdc31e4b2359c9b22b3927c8
Author:Paul E. McKenney 
AuthorDate:Wed, 17 Jun 2020 13:25:26 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:02 -07:00

rcu: Remove KCSAN stubs

KCSAN is now in mainline, so this commit removes the stubs for the
data_race(), ASSERT_EXCLUSIVE_WRITER(), and ASSERT_EXCLUSIVE_ACCESS()
macros.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 13 -
 1 file changed, 13 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 8ce77d9..eb36779 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -70,19 +70,6 @@
 #endif
 #define MODULE_PARAM_PREFIX "rcutree."
 
-#ifndef data_race
-#define data_race(expr)
\
-   ({  \
-   expr;   \
-   })
-#endif
-#ifndef ASSERT_EXCLUSIVE_WRITER
-#define ASSERT_EXCLUSIVE_WRITER(var) do { } while (0)
-#endif
-#ifndef ASSERT_EXCLUSIVE_ACCESS
-#define ASSERT_EXCLUSIVE_ACCESS(var) do { } while (0)
-#endif
-
 /* Data structures. */
 
 /*


[tip: core/rcu] rcu: Fix kerneldoc comments in rcupdate.h

2020-10-08 Thread tip-bot2 for Tobias Klauser
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 000601bb62330f18dc8f5d2d0b82e9aec3e207c4
Gitweb:
https://git.kernel.org/tip/000601bb62330f18dc8f5d2d0b82e9aec3e207c4
Author:Tobias Klauser 
AuthorDate:Thu, 09 Jul 2020 15:05:59 +02:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:08 -07:00

rcu: Fix kerneldoc comments in rcupdate.h

This commit fixes the kerneldoc comments for rcu_read_unlock_bh(),
rcu_read_unlock_sched() and rcu_head_after_call_rcu() so they e.g. get
properly linked in the API documentation. Also add parenthesis after
function names to match the notation used in other kerneldoc comments in
the same file.

Signed-off-by: Tobias Klauser 
Signed-off-by: Paul E. McKenney 
---
 include/linux/rcupdate.h | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index d15d46d..b47d6b6 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -709,8 +709,8 @@ static inline void rcu_read_lock_bh(void)
 "rcu_read_lock_bh() used illegally while idle");
 }
 
-/*
- * rcu_read_unlock_bh - marks the end of a softirq-only RCU critical section
+/**
+ * rcu_read_unlock_bh() - marks the end of a softirq-only RCU critical section
  *
  * See rcu_read_lock_bh() for more information.
  */
@@ -751,10 +751,10 @@ static inline notrace void 
rcu_read_lock_sched_notrace(void)
__acquire(RCU_SCHED);
 }
 
-/*
- * rcu_read_unlock_sched - marks the end of a RCU-classic critical section
+/**
+ * rcu_read_unlock_sched() - marks the end of a RCU-classic critical section
  *
- * See rcu_read_lock_sched for more information.
+ * See rcu_read_lock_sched() for more information.
  */
 static inline void rcu_read_unlock_sched(void)
 {
@@ -945,7 +945,7 @@ static inline void rcu_head_init(struct rcu_head *rhp)
 }
 
 /**
- * rcu_head_after_call_rcu - Has this rcu_head been passed to call_rcu()?
+ * rcu_head_after_call_rcu() - Has this rcu_head been passed to call_rcu()?
  * @rhp: The rcu_head structure to test.
  * @f: The function passed to call_rcu() along with @rhp.
  *


[tip: core/rcu] rcu: Add READ_ONCE() to rcu_do_batch() access to rcu_resched_ns

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: a2b354b9950bb859d8d959f951dda26725b041fb
Gitweb:
https://git.kernel.org/tip/a2b354b9950bb859d8d959f951dda26725b041fb
Author:Paul E. McKenney 
AuthorDate:Tue, 23 Jun 2020 17:49:40 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:07 -07:00

rcu: Add READ_ONCE() to rcu_do_batch() access to rcu_resched_ns

Given that sysfs can change the value of rcu_resched_ns at any time,
this commit adds a READ_ONCE() to the sole access to that variable.
While in the area, this commit also adds bounds checking, clamping the
value to at least a millisecond, but no longer than a second.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 1dca14c..da05afc 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2394,8 +2394,12 @@ static void rcu_do_batch(struct rcu_data *rdp)
div = READ_ONCE(rcu_divisor);
div = div < 0 ? 7 : div > sizeof(long) * 8 - 2 ? sizeof(long) * 8 - 2 : 
div;
bl = max(rdp->blimit, pending >> div);
-   if (unlikely(bl > 100))
-   tlimit = local_clock() + rcu_resched_ns;
+   if (unlikely(bl > 100)) {
+   long rrn = READ_ONCE(rcu_resched_ns);
+
+   rrn = rrn < NSEC_PER_MSEC ? NSEC_PER_MSEC : rrn > NSEC_PER_SEC 
? NSEC_PER_SEC : rrn;
+   tlimit = local_clock() + rrn;
+   }
trace_rcu_batch_start(rcu_state.name,
  rcu_segcblist_n_cbs(&rdp->cblist), bl);
rcu_segcblist_extract_done_cbs(&rdp->cblist, &rcl);


[tip: core/rcu] rculist: Introduce list/hlist_for_each_entry_srcu() macros

2020-10-08 Thread tip-bot2 for Madhuparna Bhowmik
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: ae2212a7216b674633bdc3bd2e24947a0665efb8
Gitweb:
https://git.kernel.org/tip/ae2212a7216b674633bdc3bd2e24947a0665efb8
Author:Madhuparna Bhowmik 
AuthorDate:Sun, 12 Jul 2020 18:40:02 +05:30
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:09 -07:00

rculist: Introduce list/hlist_for_each_entry_srcu() macros

list/hlist_for_each_entry_rcu() provides an optional cond argument
to specify the lock held in the updater side.
However for SRCU read side, not providing the cond argument results
into false positive as whether srcu_read_lock is held or not is not
checked implicitly. Therefore, on read side the lockdep expression
srcu_read_lock_held(srcu struct) can solve this issue.

However, the function still fails to check the cases where srcu
protected list is traversed with rcu_read_lock() instead of
srcu_read_lock(). Therefore, to remove the false negative,
this patch introduces two new list traversal primitives :
list_for_each_entry_srcu() and hlist_for_each_entry_srcu().

Both of the functions have non-optional cond argument
as it is required for both read and update side, and simply checks
if the cond is true. For regular read side the lockdep expression
srcu_read_lock_head() can be passed as the cond argument to
list/hlist_for_each_entry_srcu().

Suggested-by: Paolo Bonzini 
Tested-by: Suraj Upadhyay 
Tested-by: Naresh Kamboju 
[ paulmck: Add "true" per kbuild test robot feedback. ]
Signed-off-by: Madhuparna Bhowmik 
Signed-off-by: Paul E. McKenney 
---
 include/linux/rculist.h | 48 -
 1 file changed, 48 insertions(+)

diff --git a/include/linux/rculist.h b/include/linux/rculist.h
index 7a6fc99..f8633d3 100644
--- a/include/linux/rculist.h
+++ b/include/linux/rculist.h
@@ -63,9 +63,17 @@ static inline void INIT_LIST_HEAD_RCU(struct list_head *list)
RCU_LOCKDEP_WARN(!(cond) && !rcu_read_lock_any_held(),  \
 "RCU-list traversed in non-reader section!");  \
})
+
+#define __list_check_srcu(cond) \
+   ({   \
+   RCU_LOCKDEP_WARN(!(cond),\
+   "RCU-list traversed without holding the required lock!");\
+   })
 #else
 #define __list_check_rcu(dummy, cond, extra...)
\
({ check_arg_count_one(extra); })
+
+#define __list_check_srcu(cond) ({ })
 #endif
 
 /*
@@ -386,6 +394,25 @@ static inline void list_splice_tail_init_rcu(struct 
list_head *list,
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
 
 /**
+ * list_for_each_entry_srcu-   iterate over rcu list of given type
+ * @pos:   the type * to use as a loop cursor.
+ * @head:  the head for your list.
+ * @member:the name of the list_head within the struct.
+ * @cond:  lockdep expression for the lock required to traverse the list.
+ *
+ * This list-traversal primitive may safely run concurrently with
+ * the _rcu list-mutation primitives such as list_add_rcu()
+ * as long as the traversal is guarded by srcu_read_lock().
+ * The lockdep expression srcu_read_lock_held() can be passed as the
+ * cond argument from read side.
+ */
+#define list_for_each_entry_srcu(pos, head, member, cond)  \
+   for (__list_check_srcu(cond),   \
+pos = list_entry_rcu((head)->next, typeof(*pos), member);  \
+   &pos->member != (head); \
+   pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
+
+/**
  * list_entry_lockless - get the struct for this entry
  * @ptr:the &struct list_head pointer.
  * @type:   the type of the struct this is embedded in.
@@ -684,6 +711,27 @@ static inline void hlist_add_behind_rcu(struct hlist_node 
*n,
&(pos)->member)), typeof(*(pos)), member))
 
 /**
+ * hlist_for_each_entry_srcu - iterate over rcu list of given type
+ * @pos:   the type * to use as a loop cursor.
+ * @head:  the head for your list.
+ * @member:the name of the hlist_node within the struct.
+ * @cond:  lockdep expression for the lock required to traverse the list.
+ *
+ * This list-traversal primitive may safely run concurrently with
+ * the _rcu list-mutation primitives such as hlist_add_head_rcu()
+ * as long as the traversal is guarded by srcu_read_lock().
+ * The lockdep expression srcu_read_lock_held() can be passed as the
+ * cond argument from read side.
+ */
+#define hlist_for_each_entry_srcu(pos, head, member, cond) \
+   for (__list_check_srcu(cond),   \
+pos = hlist_entry_safe(rcu_dereference_raw(hlist_first_rcu(head)),\
+   typeof(*(pos)), member);

[tip: core/rcu] nocb: Remove show_rcu_nocb_state() false positive printout

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 2130c6b4f610ea65e9df71dfa79ee08f2fc17743
Gitweb:
https://git.kernel.org/tip/2130c6b4f610ea65e9df71dfa79ee08f2fc17743
Author:Paul E. McKenney 
AuthorDate:Mon, 22 Jun 2020 16:46:43 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:06 -07:00

nocb: Remove show_rcu_nocb_state() false positive printout

The rcu_data structure's ->nocb_timer field is used to defer wakeups of
the corresponding no-CBs CPU's grace-period kthread ("rcuog*"), and that
structure's ->nocb_defer_wakeup field is used to track such deferral.
This means that the show_rcu_nocb_state() printing an error when those
fields are set for a CPU not corresponding to a no-CBs grace-period
kthread is erroneous.

This commit therefore switches the check from ->nocb_timer to
->nocb_bypass_timer and removes the check of ->nocb_defer_wakeup.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree_plugin.h | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index bbc0c07..4d63ee3 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -2411,10 +2411,9 @@ static void show_rcu_nocb_state(struct rcu_data *rdp)
return;
 
waslocked = raw_spin_is_locked(&rdp->nocb_gp_lock);
-   wastimer = timer_pending(&rdp->nocb_timer);
+   wastimer = timer_pending(&rdp->nocb_bypass_timer);
wassleep = swait_active(&rdp->nocb_gp_wq);
-   if (!rdp->nocb_defer_wakeup && !rdp->nocb_gp_sleep &&
-   !waslocked && !wastimer && !wassleep)
+   if (!rdp->nocb_gp_sleep && !waslocked && !wastimer && !wassleep)
return;  /* Nothing untowards. */
 
pr_info("   nocb GP activity on CB-only CPU!!! %c%c%c%c %c\n",


[tip: core/rcu] scftorture: Check unexpected "switch" statement value

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: de77d4da54d10df97d265e7e99112bfc2fef7d4a
Gitweb:
https://git.kernel.org/tip/de77d4da54d10df97d265e7e99112bfc2fef7d4a
Author:Paul E. McKenney 
AuthorDate:Thu, 02 Jul 2020 12:15:37 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:37 -07:00

scftorture: Check unexpected "switch" statement value

This commit adds a "default" case to the switch statement in
scftorture_invoke_one() which contains a WARN_ON_ONCE() and an assignment
to ->scfc_out to suppress knock-on warnings.  These knock-on warnings
could otherwise cause the user to think that there was a memory-ordering
problem in smp_call_function() instead of a bug in scftorture.c itself.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 9180de7..d9c01c7 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -357,6 +357,10 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
}
smp_call_function(scf_handler, scfcp, scfsp->scfs_wait);
break;
+   default:
+   WARN_ON_ONCE(1);
+   if (scfcp)
+   scfcp->scfc_out = true;
}
if (scfcp && scfsp->scfs_wait) {
if (WARN_ON_ONCE(!scfcp->scfc_out))


[tip: core/rcu] nocb: Clarify RCU nocb CPU error message

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: e082c7b38185af0f59e55efff840939c35391f85
Gitweb:
https://git.kernel.org/tip/e082c7b38185af0f59e55efff840939c35391f85
Author:Paul E. McKenney 
AuthorDate:Mon, 22 Jun 2020 09:25:34 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:05 -07:00

nocb: Clarify RCU nocb CPU error message

A message of the form "rcu:!!! lDTs ." can be tracked down, but
doing so is not trivial.  This commit therefore eases this process by
adding text so that this error message now reads as follows:
"rcu:nocb GP activity on CB-only CPU!!! lDTs ."

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree_plugin.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 982fc5b..bbc0c07 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -2417,7 +2417,7 @@ static void show_rcu_nocb_state(struct rcu_data *rdp)
!waslocked && !wastimer && !wassleep)
return;  /* Nothing untowards. */
 
-   pr_info("   !!! %c%c%c%c %c\n",
+   pr_info("   nocb GP activity on CB-only CPU!!! %c%c%c%c %c\n",
"lL"[waslocked],
"dD"[!!rdp->nocb_defer_wakeup],
"tT"[wastimer],


[tip: core/rcu] srcu: Remove KCSAN stubs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: d9b60741318f6f8bcb2adc4beaef724c923fcb93
Gitweb:
https://git.kernel.org/tip/d9b60741318f6f8bcb2adc4beaef724c923fcb93
Author:Paul E. McKenney 
AuthorDate:Wed, 17 Jun 2020 13:24:04 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:03 -07:00

srcu: Remove KCSAN stubs

KCSAN is now in mainline, so this commit removes the stubs for the
data_race(), ASSERT_EXCLUSIVE_WRITER(), and ASSERT_EXCLUSIVE_ACCESS()
macros.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/srcutree.c | 13 -
 1 file changed, 13 deletions(-)

diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
index c100acf..c13348e 100644
--- a/kernel/rcu/srcutree.c
+++ b/kernel/rcu/srcutree.c
@@ -29,19 +29,6 @@
 #include "rcu.h"
 #include "rcu_segcblist.h"
 
-#ifndef data_race
-#define data_race(expr)
\
-   ({  \
-   expr;   \
-   })
-#endif
-#ifndef ASSERT_EXCLUSIVE_WRITER
-#define ASSERT_EXCLUSIVE_WRITER(var) do { } while (0)
-#endif
-#ifndef ASSERT_EXCLUSIVE_ACCESS
-#define ASSERT_EXCLUSIVE_ACCESS(var) do { } while (0)
-#endif
-
 /* Holdoff in nanoseconds for auto-expediting. */
 #define DEFAULT_SRCU_EXP_HOLDOFF (25 * 1000)
 static ulong exp_holdoff = DEFAULT_SRCU_EXP_HOLDOFF;


[tip: core/rcu] rcu/tree: Force quiescent state on callback overload

2020-10-08 Thread tip-bot2 for Neeraj Upadhyay
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 9c39245382de4d52a122641952900709d4a9950b
Gitweb:
https://git.kernel.org/tip/9c39245382de4d52a122641952900709d4a9950b
Author:Neeraj Upadhyay 
AuthorDate:Mon, 22 Jun 2020 00:07:27 +05:30
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:36:05 -07:00

rcu/tree: Force quiescent state on callback overload

On callback overload, it is necessary to quickly detect idle CPUs,
and rcu_gp_fqs_check_wake() checks for this condition.  Unfortunately,
the code following the call to this function does not repeat this check,
which means that in reality no actual quiescent-state forcing, instead
only a couple of quick and pointless wakeups at the beginning of the
grace period.

This commit therefore adds a check for the RCU_GP_FLAG_OVLD flag in
the post-wakeup "if" statement in rcu_gp_fqs_loop().

Fixes: 1fca4d12f4637 ("rcu: Expedite first two FQS scans under 
callback-overload conditions")
Reviewed-by: Joel Fernandes (Google) 
Signed-off-by: Neeraj Upadhyay 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 8969120..4770d77 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1884,7 +1884,7 @@ static void rcu_gp_fqs_loop(void)
break;
/* If time for quiescent-state forcing, do it. */
if (!time_after(rcu_state.jiffies_force_qs, jiffies) ||
-   (gf & RCU_GP_FLAG_FQS)) {
+   (gf & (RCU_GP_FLAG_FQS | RCU_GP_FLAG_OVLD))) {
trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq,
   TPS("fqsstart"));
rcu_gp_fqs(first_gp_fqs);


[tip: core/rcu] rcu: Make FQS more aggressive in complaining about offline CPUs

2020-10-08 Thread tip-bot2 for Joel Fernandes (Google)
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 666ca2907e6b75960ce2f0fe50afc5d8a46f296d
Gitweb:
https://git.kernel.org/tip/666ca2907e6b75960ce2f0fe50afc5d8a46f296d
Author:Joel Fernandes (Google) 
AuthorDate:Fri, 07 Aug 2020 13:07:20 -04:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:37:55 -07:00

rcu: Make FQS more aggressive in complaining about offline CPUs

The RCU grace-period kthread's force-quiescent state (FQS) loop should
never see an offline CPU that has not yet reported a quiescent state.
After all, the offline CPU should have reported a quiescent state
during the CPU-offline process, or, failing that, by rcu_gp_init()
if it ran concurrently with either the CPU going offline or the last
task on a leaf rcu_node structure exiting its RCU read-side critical
section while all CPUs corresponding to that structure are offline.
The FQS loop should therefore complain if it does see an offline CPU
that has not yet reported a quiescent state.

And it does, but only once the grace period has been in force for a
full second.  This commit therefore makes this warning more aggressive,
so that it will trigger as soon as the condition makes its appearance.

Light testing with TREE03 and hotplug shows no warnings.  This commit
also converts the warning to WARN_ON_ONCE() in order to stave off possible
log spam.

Signed-off-by: Joel Fernandes (Google) 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 23 +++
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 2c7afe4..396abe0 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1214,13 +1214,28 @@ static int rcu_implicit_dynticks_qs(struct rcu_data 
*rdp)
return 1;
}
 
-   /* If waiting too long on an offline CPU, complain. */
-   if (!(rdp->grpmask & rcu_rnp_online_cpus(rnp)) &&
-   time_after(jiffies, rcu_state.gp_start + HZ)) {
+   /*
+* Complain if a CPU that is considered to be offline from RCU's
+* perspective has not yet reported a quiescent state.  After all,
+* the offline CPU should have reported a quiescent state during
+* the CPU-offline process, or, failing that, by rcu_gp_init()
+* if it ran concurrently with either the CPU going offline or the
+* last task on a leaf rcu_node structure exiting its RCU read-side
+* critical section while all CPUs corresponding to that structure
+* are offline.  This added warning detects bugs in any of these
+* code paths.
+*
+* The rcu_node structure's ->lock is held here, which excludes
+* the relevant portions the CPU-hotplug code, the grace-period
+* initialization code, and the rcu_read_unlock() code paths.
+*
+* For more detail, please refer to the "Hotplug CPU" section
+* of RCU's Requirements documentation.
+*/
+   if (WARN_ON_ONCE(!(rdp->grpmask & rcu_rnp_online_cpus(rnp {
bool onl;
struct rcu_node *rnp1;
 
-   WARN_ON(1);  /* Offline CPUs are supposed to report QS! */
pr_info("%s: grp: %d-%d level: %d ->gp_seq %ld ->completedqs 
%ld\n",
__func__, rnp->grplo, rnp->grphi, rnp->level,
(long)rnp->gp_seq, (long)rnp->completedqs);


[tip: core/rcu] refperf: Avoid null pointer dereference when buf fails to allocate

2020-10-08 Thread tip-bot2 for Colin Ian King
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 58db5785b0d76be4582a32a7900acce88e691d36
Gitweb:
https://git.kernel.org/tip/58db5785b0d76be4582a32a7900acce88e691d36
Author:Colin Ian King 
AuthorDate:Thu, 16 Jul 2020 15:38:56 +01:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:35 -07:00

refperf: Avoid null pointer dereference when buf fails to allocate

Currently in the unlikely event that buf fails to be allocated it
is dereferenced a few times.  Use the errexit flag to determine if
buf should be written to to avoid the null pointer dereferences.

Addresses-Coverity: ("Dereference after null check")
Fixes: f518f154ecef ("refperf: Dynamically allocate experiment-summary output 
buffer")
Signed-off-by: Colin Ian King 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/refscale.c | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/kernel/rcu/refscale.c b/kernel/rcu/refscale.c
index d9291f8..952595c 100644
--- a/kernel/rcu/refscale.c
+++ b/kernel/rcu/refscale.c
@@ -546,9 +546,11 @@ static int main_func(void *arg)
// Print the average of all experiments
SCALEOUT("END OF TEST. Calculating average duration per loop 
(nanoseconds)...\n");
 
-   buf[0] = 0;
-   strcat(buf, "\n");
-   strcat(buf, "Runs\tTime(ns)\n");
+   if (!errexit) {
+   buf[0] = 0;
+   strcat(buf, "\n");
+   strcat(buf, "Runs\tTime(ns)\n");
+   }
 
for (exp = 0; exp < nruns; exp++) {
u64 avg;


[tip: core/rcu] scftorture: Adapt memory-ordering test to UP operation

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 9e66bf03f9c538863e614a72c5799bcd9579630e
Gitweb:
https://git.kernel.org/tip/9e66bf03f9c538863e614a72c5799bcd9579630e
Author:Paul E. McKenney 
AuthorDate:Fri, 03 Jul 2020 15:23:19 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:37 -07:00

scftorture: Adapt memory-ordering test to UP operation

On uniprocessor systems, smp_call_function() does nothing.  This commit
therefore avoids complaining about the lack of handler accesses in the
single-CPU case where there is no handler.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 04d3a42..fc22bcc 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -363,7 +363,8 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfcp->scfc_out = true;
}
if (scfcp && scfsp->scfs_wait) {
-   if (WARN_ON_ONCE(!scfcp->scfc_out))
+   if (WARN_ON_ONCE((num_online_cpus() > 1 || scfsp->scfs_prim == 
SCF_PRIM_SINGLE) &&
+!scfcp->scfc_out))
atomic_inc(&n_mb_out_errs); // Leak rather than trash!
else
kfree(scfcp);


[tip: core/rcu] scftorture: Prevent compiler from reducing race probabilities

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: ee7035d29576dcb59b1191e5f609517cacab1e56
Gitweb:
https://git.kernel.org/tip/ee7035d29576dcb59b1191e5f609517cacab1e56
Author:Paul E. McKenney 
AuthorDate:Wed, 01 Jul 2020 16:38:16 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:36 -07:00

scftorture: Prevent compiler from reducing race probabilities

Detecting smp_call_function() memory misordering requires close timing,
so it is necessary to have the checks immediately before and after
the call to the smp_call_function*() function under test.  This commit
therefore inserts barrier() calls to prevent the compiler from optimizing
memory-misordering detection down into the zone of extreme improbability.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 10 --
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 880c2ce..8349681 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -322,6 +322,7 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfp->n_single++;
if (scfcp) {
scfcp->scfc_cpu = cpu;
+   barrier(); // Prevent race-reduction compiler 
optimizations.
scfcp->scfc_in = true;
}
ret = smp_call_function_single(cpu, scf_handler_1, (void 
*)scfcp, scfsp->scfs_wait);
@@ -339,8 +340,10 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfp->n_many_wait++;
else
scfp->n_many++;
-   if (scfcp)
+   if (scfcp) {
+   barrier(); // Prevent race-reduction compiler 
optimizations.
scfcp->scfc_in = true;
+   }
smp_call_function_many(cpu_online_mask, scf_handler, scfcp, 
scfsp->scfs_wait);
break;
case SCF_PRIM_ALL:
@@ -348,8 +351,10 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
scfp->n_all_wait++;
else
scfp->n_all++;
-   if (scfcp)
+   if (scfcp) {
+   barrier(); // Prevent race-reduction compiler 
optimizations.
scfcp->scfc_in = true;
+   }
smp_call_function(scf_handler, scfcp, scfsp->scfs_wait);
break;
}
@@ -358,6 +363,7 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
atomic_inc(&n_mb_out_errs); // Leak rather than trash!
else
kfree(scfcp);
+   barrier(); // Prevent race-reduction compiler optimizations.
}
if (use_cpus_read_lock)
cpus_read_unlock();


[tip: core/rcu] rcutorture: Hoist OOM registry up one level

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 299c7d94f635ab93ffb0468aec6b6e2176ec5cbf
Gitweb:
https://git.kernel.org/tip/299c7d94f635ab93ffb0468aec6b6e2176ec5cbf
Author:Paul E. McKenney 
AuthorDate:Wed, 22 Jul 2020 10:45:12 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:35 -07:00

rcutorture: Hoist OOM registry up one level

Currently, registering and unregistering the OOM notifier is done
right before and after the test, respectively.  This will not work
well for multi-threaded tests, so this commit hoists this registering
and unregistering up into the rcu_torture_fwd_prog_init() and
rcu_torture_fwd_prog_cleanup() functions.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/rcutorture.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 2b3f04e..983f82f 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -2110,13 +2110,11 @@ static int rcu_torture_fwd_prog(void *args)
do {
schedule_timeout_interruptible(fwd_progress_holdoff * HZ);
WRITE_ONCE(rcu_fwd_emergency_stop, false);
-   register_oom_notifier(&rcutorture_oom_nb);
if (!IS_ENABLED(CONFIG_TINY_RCU) ||
rcu_inkernel_boot_has_ended())
rcu_torture_fwd_prog_nr(rfp, &tested, &tested_tries);
if (rcu_inkernel_boot_has_ended())
rcu_torture_fwd_prog_cr(rfp);
-   unregister_oom_notifier(&rcutorture_oom_nb);
 
/* Avoid slow periods, better to test when busy. */
stutter_wait("rcu_torture_fwd_prog");
@@ -2159,6 +2157,7 @@ static int __init rcu_torture_fwd_prog_init(void)
mutex_lock(&rcu_fwd_mutex);
rcu_fwds = rfp;
mutex_unlock(&rcu_fwd_mutex);
+   register_oom_notifier(&rcutorture_oom_nb);
return torture_create_kthread(rcu_torture_fwd_prog, rfp, fwd_prog_task);
 }
 
@@ -2171,6 +2170,7 @@ static void rcu_torture_fwd_prog_cleanup(void)
mutex_lock(&rcu_fwd_mutex);
rcu_fwds = NULL;
mutex_unlock(&rcu_fwd_mutex);
+   unregister_oom_notifier(&rcutorture_oom_nb);
kfree(rfp);
 }
 


[tip: core/rcu] doc: Drop doubled words from RCU Data-Structures.rst

2020-10-08 Thread tip-bot2 for Randy Dunlap
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 1b98b7c5eb2f94eddad541d6fc91f1d1995d644b
Gitweb:
https://git.kernel.org/tip/1b98b7c5eb2f94eddad541d6fc91f1d1995d644b
Author:Randy Dunlap 
AuthorDate:Fri, 03 Jul 2020 14:33:41 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 14:29:17 -07:00

doc: Drop doubled words from RCU Data-Structures.rst

Drop the doubled word "the".

Signed-off-by: Randy Dunlap 
Cc: Jonathan Corbet 
Cc: linux-...@vger.kernel.org
Cc: "Paul E. McKenney" 
Cc: Josh Triplett 
Cc: Steven Rostedt 
Cc: Mathieu Desnoyers 
Cc: Lai Jiangshan 
Cc: Joel Fernandes 
Cc: r...@vger.kernel.org
Signed-off-by: Paul E. McKenney 
---
 Documentation/RCU/Design/Data-Structures/Data-Structures.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Documentation/RCU/Design/Data-Structures/Data-Structures.rst 
b/Documentation/RCU/Design/Data-Structures/Data-Structures.rst
index 4a48e20..f4efd68 100644
--- a/Documentation/RCU/Design/Data-Structures/Data-Structures.rst
+++ b/Documentation/RCU/Design/Data-Structures/Data-Structures.rst
@@ -963,7 +963,7 @@ exit and perhaps also vice versa. Therefore, whenever the
 ``->dynticks_nesting`` field is incremented up from zero, the
 ``->dynticks_nmi_nesting`` field is set to a large positive number, and
 whenever the ``->dynticks_nesting`` field is decremented down to zero,
-the the ``->dynticks_nmi_nesting`` field is set to zero. Assuming that
+the ``->dynticks_nmi_nesting`` field is set to zero. Assuming that
 the number of misnested interrupts is not sufficient to overflow the
 counter, this approach corrects the ``->dynticks_nmi_nesting`` field
 every time the corresponding CPU enters the idle loop from process


[tip: core/rcu] rcutorture: Properly synchronize with OOM notifier

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 57f602022e82ee8fa6476d0e16ddbaf3eb86b245
Gitweb:
https://git.kernel.org/tip/57f602022e82ee8fa6476d0e16ddbaf3eb86b245
Author:Paul E. McKenney 
AuthorDate:Mon, 20 Jul 2020 08:34:07 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:34 -07:00

rcutorture: Properly synchronize with OOM notifier

The current rcutorture forward-progress code assumes that it is the
only cause of out-of-memory (OOM) events.  For script-based rcutorture
testing, this assumption is in fact correct.  However, testing based
on modprobe/rmmod might well encounter external OOM events, which could
happen at any time.

This commit therefore properly synchronizes the interaction between
rcutorture's forward-progress testing and its OOM notifier by adding a
global mutex.

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/rcutorture.c | 14 +-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 7942be4..2b3f04e 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -1796,6 +1796,7 @@ struct rcu_fwd {
unsigned long rcu_launder_gp_seq_start;
 };
 
+static DEFINE_MUTEX(rcu_fwd_mutex);
 static struct rcu_fwd *rcu_fwds;
 static bool rcu_fwd_emergency_stop;
 
@@ -2062,8 +2063,14 @@ static void rcu_torture_fwd_prog_cr(struct rcu_fwd *rfp)
 static int rcutorture_oom_notify(struct notifier_block *self,
 unsigned long notused, void *nfreed)
 {
-   struct rcu_fwd *rfp = rcu_fwds;
+   struct rcu_fwd *rfp;
 
+   mutex_lock(&rcu_fwd_mutex);
+   rfp = rcu_fwds;
+   if (!rfp) {
+   mutex_unlock(&rcu_fwd_mutex);
+   return NOTIFY_OK;
+   }
WARN(1, "%s invoked upon OOM during forward-progress testing.\n",
 __func__);
rcu_torture_fwd_cb_hist(rfp);
@@ -2081,6 +2088,7 @@ static int rcutorture_oom_notify(struct notifier_block 
*self,
smp_mb(); /* Frees before return to avoid redoing OOM. */
(*(unsigned long *)nfreed)++; /* Forward progress CBs freed! */
pr_info("%s returning after OOM processing.\n", __func__);
+   mutex_unlock(&rcu_fwd_mutex);
return NOTIFY_OK;
 }
 
@@ -2148,7 +2156,9 @@ static int __init rcu_torture_fwd_prog_init(void)
return -ENOMEM;
spin_lock_init(&rfp->rcu_fwd_lock);
rfp->rcu_fwd_cb_tail = &rfp->rcu_fwd_cb_head;
+   mutex_lock(&rcu_fwd_mutex);
rcu_fwds = rfp;
+   mutex_unlock(&rcu_fwd_mutex);
return torture_create_kthread(rcu_torture_fwd_prog, rfp, fwd_prog_task);
 }
 
@@ -2158,7 +2168,9 @@ static void rcu_torture_fwd_prog_cleanup(void)
 
torture_stop_kthread(rcu_torture_fwd_prog, fwd_prog_task);
rfp = rcu_fwds;
+   mutex_lock(&rcu_fwd_mutex);
rcu_fwds = NULL;
+   mutex_unlock(&rcu_fwd_mutex);
kfree(rfp);
 }
 


[tip: core/rcu] torture: Add gdb support

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: b67a91703a29b93f5b114052b0b8e0d84e717ad3
Gitweb:
https://git.kernel.org/tip/b67a91703a29b93f5b114052b0b8e0d84e717ad3
Author:Paul E. McKenney 
AuthorDate:Mon, 17 Aug 2020 16:44:48 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:54 -07:00

torture: Add gdb support

This commit adds a "--gdb" parameter to kvm.sh, which causes
"CONFIG_DEBUG_INFO=y" to be added to the Kconfig options, "nokaslr"
to be added to the boot parameters, and "-s -S" to be added to the qemu
arguments.  Furthermore, the scripting prints messages telling the user
how to start up gdb for the run in question.

Because of the interactive nature of gdb sessions, only one "--configs"
scenario is permitted when "--gdb" is specified.  For most torture types,
this means that a "--configs" argument is required, and that argument
must specify the single scenario of interest.

The usual cautions about breakpoints and timing apply, for example,
staring at your gdb prompt for too long will likely get you many
complaints, including RCU CPU stall warnings.  Omar Sandoval further
suggests using gdb's "hbreak" command instead of the "break" command on
systems supporting hardware breakpoints, and further using the "commands"
option because the resulting non-interactive breakpoints are less likely
to get you RCU CPU stall warnings.

Signed-off-by: Paul E. McKenney 
---
 tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh | 33 +--
 tools/testing/selftests/rcutorture/bin/kvm.sh| 21 -
 2 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh 
b/tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh
index e07779a..6dc2b49 100755
--- a/tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh
+++ b/tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh
@@ -66,6 +66,7 @@ config_override_param () {
 echo > $T/KcList
 config_override_param "$config_dir/CFcommon" KcList "`cat $config_dir/CFcommon 
2> /dev/null`"
 config_override_param "$config_template" KcList "`cat $config_template 2> 
/dev/null`"
+config_override_param "--gdb options" KcList "$TORTURE_KCONFIG_GDB_ARG"
 config_override_param "--kasan options" KcList "$TORTURE_KCONFIG_KASAN_ARG"
 config_override_param "--kcsan options" KcList "$TORTURE_KCONFIG_KCSAN_ARG"
 config_override_param "--kconfig argument" KcList "$TORTURE_KCONFIG_ARG"
@@ -152,7 +153,11 @@ qemu_append="`identify_qemu_append "$QEMU"`"
 boot_args="`configfrag_boot_params "$boot_args" "$config_template"`"
 # Generate kernel-version-specific boot parameters
 boot_args="`per_version_boot_params "$boot_args" $resdir/.config $seconds`"
-echo $QEMU $qemu_args -m $TORTURE_QEMU_MEM -kernel $KERNEL -append 
\"$qemu_append $boot_args\" > $resdir/qemu-cmd
+if test -n "$TORTURE_BOOT_GDB_ARG"
+then
+   boot_args="$boot_args $TORTURE_BOOT_GDB_ARG"
+fi
+echo $QEMU $qemu_args -m $TORTURE_QEMU_MEM -kernel $KERNEL -append 
\"$qemu_append $boot_args\" $TORTURE_QEMU_GDB_ARG > $resdir/qemu-cmd
 
 if test -n "$TORTURE_BUILDONLY"
 then
@@ -171,14 +176,26 @@ echo "NOTE: $QEMU either did not run or was interactive" 
> $resdir/console.log
 # Attempt to run qemu
 ( . $T/qemu-cmd; wait `cat  $resdir/qemu_pid`; echo $? > $resdir/qemu-retval ) 
&
 commandcompleted=0
-sleep 10 # Give qemu's pid a chance to reach the file
-if test -s "$resdir/qemu_pid"
+if test -z "$TORTURE_KCONFIG_GDB_ARG"
 then
-   qemu_pid=`cat "$resdir/qemu_pid"`
-   echo Monitoring qemu job at pid $qemu_pid
-else
-   qemu_pid=""
-   echo Monitoring qemu job at yet-as-unknown pid
+   sleep 10 # Give qemu's pid a chance to reach the file
+   if test -s "$resdir/qemu_pid"
+   then
+   qemu_pid=`cat "$resdir/qemu_pid"`
+   echo Monitoring qemu job at pid $qemu_pid
+   else
+   qemu_pid=""
+   echo Monitoring qemu job at yet-as-unknown pid
+   fi
+fi
+if test -n "$TORTURE_KCONFIG_GDB_ARG"
+then
+   echo Waiting for you to attach a debug session, for example: > /dev/tty
+   echo "gdb $base_resdir/vmlinux" > /dev/tty
+   echo 'After symbols load and the "(gdb)" prompt appears:' > /dev/tty
+   echo "target remote :1234" > /dev/tty
+   echo "continue" > /dev/tty
+   kstarttime=`gawk 'BEGIN { print systime() }' < /dev/null`
 fi
 while :
 do
diff --git a/tools/testing/selftests/rcutorture/bin/kvm.sh 
b/tools/testing/selftests/rcutorture/bin/kvm.sh
index fc15b52..c30047e 100755
--- a/tools/testing/selftests/rcutorture/bin/kvm.sh
+++ b/tools/testing/selftests/rcutorture/bin/kvm.sh
@@ -31,6 +31,9 @@ TORTURE_DEFCONFIG=defconfig
 TORTURE_BOOT_IMAGE=""
 TORTURE_INITRD="$KVM/initrd"; export TORTURE_INITRD
 TORTURE_KCONFIG_ARG=""
+TORTURE_KCONFIG_GDB_ARG=""
+TORTURE_BOOT_GDB_ARG=""
+TORTURE_QEMU_GDB_ARG=""
 TORTURE_KCONFIG_KASAN_ARG=""
 TORTURE_KCONFIG_KCSAN_ARG=""
 TORTURE_KM

[tip: core/rcu] scftorture: Block scftorture_invoker() kthreads for offline CPUs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: a7c072ef26644b632241d549869f10f8d2dd3b5c
Gitweb:
https://git.kernel.org/tip/a7c072ef26644b632241d549869f10f8d2dd3b5c
Author:Paul E. McKenney 
AuthorDate:Thu, 02 Jul 2020 14:15:33 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:37 -07:00

scftorture: Block scftorture_invoker() kthreads for offline CPUs

Currently, CPU-hotplug operations might result in all but two
of (say) 100 CPUs being offline, which in turn might result in
false-positive diagnostics due to overload.  This commit therefore
causes scftorture_invoker() kthreads for offline CPUs to loop blocking
for 200 milliseconds at a time, thus continuously adjusting the number
of threads to match the number of online CPUs.

Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 13 -
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index d9c01c7..04d3a42 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -381,11 +381,14 @@ static void scftorture_invoke_one(struct scf_statistics 
*scfp, struct torture_ra
 // smp_call_function() family of functions.
 static int scftorture_invoker(void *arg)
 {
+   int cpu;
DEFINE_TORTURE_RANDOM(rand);
struct scf_statistics *scfp = (struct scf_statistics *)arg;
+   bool was_offline = false;
 
VERBOSE_SCFTORTOUT("scftorture_invoker %d: task started", scfp->cpu);
-   set_cpus_allowed_ptr(current, cpumask_of(scfp->cpu % nr_cpu_ids));
+   cpu = scfp->cpu % nr_cpu_ids;
+   set_cpus_allowed_ptr(current, cpumask_of(cpu));
set_user_nice(current, MAX_NICE);
if (holdoff)
schedule_timeout_interruptible(holdoff * HZ);
@@ -408,6 +411,14 @@ static int scftorture_invoker(void *arg)
 
do {
scftorture_invoke_one(scfp, &rand);
+   while (cpu_is_offline(cpu) && !torture_must_stop()) {
+   schedule_timeout_interruptible(HZ / 5);
+   was_offline = true;
+   }
+   if (was_offline) {
+   set_cpus_allowed_ptr(current, cpumask_of(cpu));
+   was_offline = false;
+   }
} while (!torture_must_stop());
 
VERBOSE_SCFTORTOUT("scftorture_invoker %d ended", scfp->cpu);


[tip: core/rcu] lib: Add backtrace_idle parameter to force backtrace of idle CPUs

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 160c7ba34605d9b59ee406a1b4a61b0f942b1ae9
Gitweb:
https://git.kernel.org/tip/160c7ba34605d9b59ee406a1b4a61b0f942b1ae9
Author:Paul E. McKenney 
AuthorDate:Wed, 08 Jul 2020 16:25:43 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 14:24:25 -07:00

lib: Add backtrace_idle parameter to force backtrace of idle CPUs

Currently, the nmi_cpu_backtrace() declines to produce backtraces for
idle CPUs.  This is a good choice in the common case in which problems are
caused only by non-idle CPUs.  However, there are occasionally situations
in which idle CPUs are helping to cause problems.  This commit therefore
adds an nmi_backtrace.backtrace_idle kernel boot parameter that causes
nmi_cpu_backtrace() to dump stacks even of idle CPUs.

Signed-off-by: Paul E. McKenney 
Cc: Jonathan Corbet 
Cc: Thomas Gleixner 
Cc: Andrew Morton 
Cc: Greg Kroah-Hartman 
Cc: 
---
 Documentation/admin-guide/kernel-parameters.txt | 4 
 lib/nmi_backtrace.c | 6 +-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index bdc1f33..5e6d191 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -3073,6 +3073,10 @@
and gids from such clients.  This is intended to ease
migration from NFSv2/v3.
 
+   nmi_backtrace.backtrace_idle [KNL]
+   Dump stacks even of idle CPUs in response to an
+   NMI stack-backtrace request.
+
nmi_debug=  [KNL,SH] Specify one or more actions to take
when a NMI is triggered.
Format: [state][,regs][,debounce][,die]
diff --git a/lib/nmi_backtrace.c b/lib/nmi_backtrace.c
index 15ca78e..8abe187 100644
--- a/lib/nmi_backtrace.c
+++ b/lib/nmi_backtrace.c
@@ -85,12 +85,16 @@ void nmi_trigger_cpumask_backtrace(const cpumask_t *mask,
put_cpu();
 }
 
+// Dump stacks even for idle CPUs.
+static bool backtrace_idle;
+module_param(backtrace_idle, bool, 0644);
+
 bool nmi_cpu_backtrace(struct pt_regs *regs)
 {
int cpu = smp_processor_id();
 
if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) {
-   if (regs && cpu_in_idle(instruction_pointer(regs))) {
+   if (!READ_ONCE(backtrace_idle) && regs && 
cpu_in_idle(instruction_pointer(regs))) {
pr_warn("NMI backtrace for cpu %d skipped: idling at 
%pS\n",
cpu, (void *)instruction_pointer(regs));
} else {


[tip: core/rcu] rcu: Remove unused __rcu_is_watching() function

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 7f2a53c231fe5d9522c3b695ab454203904031ac
Gitweb:
https://git.kernel.org/tip/7f2a53c231fe5d9522c3b695ab454203904031ac
Author:Paul E. McKenney 
AuthorDate:Mon, 17 Aug 2020 10:37:22 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:37:56 -07:00

rcu: Remove unused __rcu_is_watching() function

The x86/entry work removed all uses of __rcu_is_watching(), therefore
this commit removes it entirely.

Cc: Andy Lutomirski 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: Borislav Petkov 
Cc: "H. Peter Anvin" 
Cc: 
Signed-off-by: Paul E. McKenney 
---
 include/linux/rcutiny.h | 1 -
 include/linux/rcutree.h | 1 -
 kernel/entry/common.c   | 2 +-
 kernel/rcu/tree.c   | 5 -
 4 files changed, 1 insertion(+), 8 deletions(-)

diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h
index 5cc9637..7c1ecdb 100644
--- a/include/linux/rcutiny.h
+++ b/include/linux/rcutiny.h
@@ -103,7 +103,6 @@ static inline void rcu_scheduler_starting(void) { }
 static inline void rcu_end_inkernel_boot(void) { }
 static inline bool rcu_inkernel_boot_has_ended(void) { return true; }
 static inline bool rcu_is_watching(void) { return true; }
-static inline bool __rcu_is_watching(void) { return true; }
 static inline void rcu_momentary_dyntick_idle(void) { }
 static inline void kfree_rcu_scheduler_running(void) { }
 static inline bool rcu_gp_might_be_stalled(void) { return false; }
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h
index d2f4064..59eb5cd 100644
--- a/include/linux/rcutree.h
+++ b/include/linux/rcutree.h
@@ -64,7 +64,6 @@ extern int rcu_scheduler_active __read_mostly;
 void rcu_end_inkernel_boot(void);
 bool rcu_inkernel_boot_has_ended(void);
 bool rcu_is_watching(void);
-bool __rcu_is_watching(void);
 #ifndef CONFIG_PREEMPTION
 void rcu_all_qs(void);
 #endif
diff --git a/kernel/entry/common.c b/kernel/entry/common.c
index 9852e0d..ad794a1 100644
--- a/kernel/entry/common.c
+++ b/kernel/entry/common.c
@@ -278,7 +278,7 @@ noinstr irqentry_state_t irqentry_enter(struct pt_regs 
*regs)
 * terminate a grace period, if and only if the timer interrupt is
 * not nested into another interrupt.
 *
-* Checking for __rcu_is_watching() here would prevent the nesting
+* Checking for rcu_is_watching() here would prevent the nesting
 * interrupt to invoke rcu_irq_enter(). If that nested interrupt is
 * the tick then rcu_flavor_sched_clock_irq() would wrongfully
 * assume that it is the first interupt and eventually claim
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 396abe0..2323622 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1077,11 +1077,6 @@ static void rcu_disable_urgency_upon_qs(struct rcu_data 
*rdp)
}
 }
 
-noinstr bool __rcu_is_watching(void)
-{
-   return !rcu_dynticks_curr_cpu_in_eqs();
-}
-
 /**
  * rcu_is_watching - see if RCU thinks that the current CPU is not idle
  *


[tip: core/rcu] doc: Drop doubled words from RCU requirements documentation

2020-10-08 Thread tip-bot2 for Randy Dunlap
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 7f45d6f8ae383ed01070883b3c74ee51c9740065
Gitweb:
https://git.kernel.org/tip/7f45d6f8ae383ed01070883b3c74ee51c9740065
Author:Randy Dunlap 
AuthorDate:Fri, 03 Jul 2020 14:33:42 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 14:29:17 -07:00

doc: Drop doubled words from RCU requirements documentation

Drop the doubled words "to" and "for".

Signed-off-by: Randy Dunlap 
Cc: Jonathan Corbet 
Cc: linux-...@vger.kernel.org
Cc: "Paul E. McKenney" 
Cc: Josh Triplett 
Cc: Steven Rostedt 
Cc: Mathieu Desnoyers 
Cc: Lai Jiangshan 
Cc: Joel Fernandes 
Cc: r...@vger.kernel.org
Signed-off-by: Paul E. McKenney 
---
 Documentation/RCU/Design/Requirements/Requirements.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Documentation/RCU/Design/Requirements/Requirements.rst 
b/Documentation/RCU/Design/Requirements/Requirements.rst
index 8f41ad0..1ae79a1 100644
--- a/Documentation/RCU/Design/Requirements/Requirements.rst
+++ b/Documentation/RCU/Design/Requirements/Requirements.rst
@@ -2162,7 +2162,7 @@ scheduling-clock interrupt be enabled when RCU needs it 
to be:
this sort of thing.
 #. If a CPU is in a portion of the kernel that is absolutely positively
no-joking guaranteed to never execute any RCU read-side critical
-   sections, and RCU believes this CPU to to be idle, no problem. This
+   sections, and RCU believes this CPU to be idle, no problem. This
sort of thing is used by some architectures for light-weight
exception handlers, which can then avoid the overhead of
``rcu_irq_enter()`` and ``rcu_irq_exit()`` at exception entry and
@@ -2431,7 +2431,7 @@ However, there are legitimate preemptible-RCU 
implementations that do
 not have this property, given that any point in the code outside of an
 RCU read-side critical section can be a quiescent state. Therefore,
 *RCU-sched* was created, which follows “classic” RCU in that an
-RCU-sched grace period waits for for pre-existing interrupt and NMI
+RCU-sched grace period waits for pre-existing interrupt and NMI
 handlers. In kernels built with ``CONFIG_PREEMPT=n``, the RCU and
 RCU-sched APIs have identical implementations, while kernels built with
 ``CONFIG_PREEMPT=y`` provide a separate implementation for each.


[tip: core/rcu] docs: Fix typo in synchronize_rcu() function name

2020-10-08 Thread tip-bot2 for Tobias Klauser
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 77f808607a62c3685381a5732a88b30bad8893b5
Gitweb:
https://git.kernel.org/tip/77f808607a62c3685381a5732a88b30bad8893b5
Author:Tobias Klauser 
AuthorDate:Thu, 02 Jul 2020 18:28:10 +02:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 14:29:16 -07:00

docs: Fix typo in synchronize_rcu() function name

s/sychronize_rcu/synchronize_rcu/

Signed-off-by: Tobias Klauser 
Signed-off-by: Paul E. McKenney 
---
 Documentation/RCU/whatisRCU.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Documentation/RCU/whatisRCU.rst b/Documentation/RCU/whatisRCU.rst
index c7f147b..fb3ff76 100644
--- a/Documentation/RCU/whatisRCU.rst
+++ b/Documentation/RCU/whatisRCU.rst
@@ -360,7 +360,7 @@ order to amortize their overhead over many uses of the 
corresponding APIs.
 
 There are at least three flavors of RCU usage in the Linux kernel. The diagram
 above shows the most common one. On the updater side, the rcu_assign_pointer(),
-sychronize_rcu() and call_rcu() primitives used are the same for all three
+synchronize_rcu() and call_rcu() primitives used are the same for all three
 flavors. However for protection (on the reader side), the primitives used vary
 depending on the flavor:
 


[tip: core/rcu] rcu: Clarify comments about FQS loop reporting quiescent states

2020-10-08 Thread tip-bot2 for Joel Fernandes (Google)
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: f37599e6f06da47e49c3408afe66c5b6e83a90bd
Gitweb:
https://git.kernel.org/tip/f37599e6f06da47e49c3408afe66c5b6e83a90bd
Author:Joel Fernandes (Google) 
AuthorDate:Fri, 07 Aug 2020 13:07:19 -04:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:37:55 -07:00

rcu: Clarify comments about FQS loop reporting quiescent states

Since at least v4.19, the FQS loop no longer reports quiescent states
for offline CPUs except in emergency situations.

This commit therefore fixes the comment in rcu_gp_init() to match the
current code.

Signed-off-by: Joel Fernandes (Google) 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 11 +++
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 52108dd..2c7afe4 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1706,10 +1706,13 @@ static bool rcu_gp_init(void)
raw_spin_unlock_irq_rcu_node(rnp);
 
/*
-* Apply per-leaf buffered online and offline operations to the
-* rcu_node tree.  Note that this new grace period need not wait
-* for subsequent online CPUs, and that quiescent-state forcing
-* will handle subsequent offline CPUs.
+* Apply per-leaf buffered online and offline operations to
+* the rcu_node tree. Note that this new grace period need not
+* wait for subsequent online CPUs, and that RCU hooks in the CPU
+* offlining path, when combined with checks in this function,
+* will handle CPUs that are currently going offline or that will
+* go offline later.  Please also refer to "Hotplug CPU" section
+* of RCU's Requirements documentation.
 */
rcu_state.gp_state = RCU_GP_ONOFF;
rcu_for_each_leaf_node(rnp) {


[tip: core/rcu] scftorture: Make symbol 'scf_torture_rand' static

2020-10-08 Thread tip-bot2 for Wei Yongjun
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 9a52a574676f8d4aa55f69319231ce6c343b00bb
Gitweb:
https://git.kernel.org/tip/9a52a574676f8d4aa55f69319231ce6c343b00bb
Author:Wei Yongjun 
AuthorDate:Thu, 02 Jul 2020 09:56:50 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:38:36 -07:00

scftorture: Make symbol 'scf_torture_rand' static

The sparse tool complains as follows

kernel/scftorture.c:124:1: warning:
 symbol '__pcpu_scope_scf_torture_rand' was not declared. Should it be static?

And this per-CPU variable is not used outside of scftorture.c,
so this commit marks it static.

Reported-by: Hulk Robot 
Signed-off-by: Wei Yongjun 
Signed-off-by: Paul E. McKenney 
---
 kernel/scftorture.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/scftorture.c b/kernel/scftorture.c
index 8349681..9180de7 100644
--- a/kernel/scftorture.c
+++ b/kernel/scftorture.c
@@ -134,7 +134,7 @@ static atomic_t n_alloc_errs;
 static bool scfdone;
 static char *bangstr = "";
 
-DEFINE_TORTURE_RANDOM_PERCPU(scf_torture_rand);
+static DEFINE_TORTURE_RANDOM_PERCPU(scf_torture_rand);
 
 // Print torture statistics.  Caller must ensure serialization.
 static void scf_torture_stats_print(void)


[tip: core/rcu] rcutorture: Properly set rcu_fwds for OOM handling

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: c8fa63714763b7795a3f5fb7ed6d000763e6dccc
Gitweb:
https://git.kernel.org/tip/c8fa63714763b7795a3f5fb7ed6d000763e6dccc
Author:Paul E. McKenney 
AuthorDate:Sun, 19 Jul 2020 14:40:31 -07:00
Committer: Paul E. McKenney 
CommitterDate: Mon, 24 Aug 2020 18:45:34 -07:00

rcutorture: Properly set rcu_fwds for OOM handling

The conversion of rcu_fwds to dynamic allocation failed to actually
allocate the required structure.  This commit therefore allocates it,
frees it, and updates rcu_fwds accordingly.  While in the area, it
abstracts the cleanup actions into rcu_torture_fwd_prog_cleanup().

Fixes: 5155be9994e5 ("rcutorture: Dynamically allocate rcu_fwds structure")
Reported-by: kernel test robot 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/rcutorture.c | 13 -
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index c8206ff..7942be4 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -2148,9 +2148,20 @@ static int __init rcu_torture_fwd_prog_init(void)
return -ENOMEM;
spin_lock_init(&rfp->rcu_fwd_lock);
rfp->rcu_fwd_cb_tail = &rfp->rcu_fwd_cb_head;
+   rcu_fwds = rfp;
return torture_create_kthread(rcu_torture_fwd_prog, rfp, fwd_prog_task);
 }
 
+static void rcu_torture_fwd_prog_cleanup(void)
+{
+   struct rcu_fwd *rfp;
+
+   torture_stop_kthread(rcu_torture_fwd_prog, fwd_prog_task);
+   rfp = rcu_fwds;
+   rcu_fwds = NULL;
+   kfree(rfp);
+}
+
 /* Callback function for RCU barrier testing. */
 static void rcu_torture_barrier_cbf(struct rcu_head *rcu)
 {
@@ -2448,7 +2459,7 @@ rcu_torture_cleanup(void)
show_rcu_gp_kthreads();
rcu_torture_read_exit_cleanup();
rcu_torture_barrier_cleanup();
-   torture_stop_kthread(rcu_torture_fwd_prog, fwd_prog_task);
+   rcu_torture_fwd_prog_cleanup();
torture_stop_kthread(rcu_torture_stall, stall_task);
torture_stop_kthread(rcu_torture_writer, writer_task);
 


[tip: core/rcu] smp: Make symbol 'csd_bug_count' static

2020-10-08 Thread tip-bot2 for Wei Yongjun
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 2b722160f1a7929f38dfb648c7bbb45f96e65a5b
Gitweb:
https://git.kernel.org/tip/2b722160f1a7929f38dfb648c7bbb45f96e65a5b
Author:Wei Yongjun 
AuthorDate:Mon, 06 Jul 2020 21:49:41 +08:00
Committer: Paul E. McKenney 
CommitterDate: Fri, 04 Sep 2020 11:53:12 -07:00

smp: Make symbol 'csd_bug_count' static

The sparse tool complains as follows:

kernel/smp.c:107:10: warning:
 symbol 'csd_bug_count' was not declared. Should it be static?

Because variable is not used outside of smp.c, this commit marks it
static.

Reported-by: Hulk Robot 
Signed-off-by: Wei Yongjun 
Signed-off-by: Paul E. McKenney 
Cc: Peter Zijlstra 
Cc: Ingo Molnar 
Cc: Thomas Gleixner 
Cc: Sebastian Andrzej Siewior 
---
 kernel/smp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/smp.c b/kernel/smp.c
index c5d3188..b25383d 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -106,7 +106,7 @@ static DEFINE_PER_CPU(smp_call_func_t, cur_csd_func);
 static DEFINE_PER_CPU(void *, cur_csd_info);
 
 #define CSD_LOCK_TIMEOUT (5ULL * NSEC_PER_SEC)
-atomic_t csd_bug_count = ATOMIC_INIT(0);
+static atomic_t csd_bug_count = ATOMIC_INIT(0);
 
 /* Record current CSD work for current CPU, NULL to erase. */
 static void csd_lock_record(call_single_data_t *csd)


[tip: core/rcu] rcu: Shrink each possible cpu krcp

2020-10-08 Thread tip-bot2 for Zqiang
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: 70060b8770d34f83e9fa4c3526db013dd2773611
Gitweb:
https://git.kernel.org/tip/70060b8770d34f83e9fa4c3526db013dd2773611
Author:Zqiang 
AuthorDate:Fri, 14 Aug 2020 14:45:57 +08:00
Committer: Paul E. McKenney 
CommitterDate: Thu, 03 Sep 2020 09:40:13 -07:00

rcu: Shrink each possible cpu krcp

CPUs can go offline shortly after kfree_call_rcu() has been invoked,
which can leave memory stranded until those CPUs come back online.
This commit therefore drains the kcrp of each CPU, not just the
ones that happen to be online.

Acked-by: Joel Fernandes 
Signed-off-by: Zqiang 
Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/tree.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 2323622..9245064 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -3450,7 +3450,7 @@ kfree_rcu_shrink_count(struct shrinker *shrink, struct 
shrink_control *sc)
unsigned long count = 0;
 
/* Snapshot count of all CPUs */
-   for_each_online_cpu(cpu) {
+   for_each_possible_cpu(cpu) {
struct kfree_rcu_cpu *krcp = per_cpu_ptr(&krc, cpu);
 
count += READ_ONCE(krcp->count);
@@ -3465,7 +3465,7 @@ kfree_rcu_shrink_scan(struct shrinker *shrink, struct 
shrink_control *sc)
int cpu, freed = 0;
unsigned long flags;
 
-   for_each_online_cpu(cpu) {
+   for_each_possible_cpu(cpu) {
int count;
struct kfree_rcu_cpu *krcp = per_cpu_ptr(&krc, cpu);
 
@@ -3498,7 +3498,7 @@ void __init kfree_rcu_scheduler_running(void)
int cpu;
unsigned long flags;
 
-   for_each_online_cpu(cpu) {
+   for_each_possible_cpu(cpu) {
struct kfree_rcu_cpu *krcp = per_cpu_ptr(&krc, cpu);
 
raw_spin_lock_irqsave(&krcp->lock, flags);


[tip: core/rcu] smp: Add source and destination CPUs to __call_single_data

2020-10-08 Thread tip-bot2 for Paul E. McKenney
The following commit has been merged into the core/rcu branch of tip:

Commit-ID: e48c15b796d412ede883bb2ef7779b2a142f7962
Gitweb:
https://git.kernel.org/tip/e48c15b796d412ede883bb2ef7779b2a142f7962
Author:Paul E. McKenney 
AuthorDate:Mon, 29 Jun 2020 17:21:32 -07:00
Committer: Paul E. McKenney 
CommitterDate: Fri, 04 Sep 2020 11:50:50 -07:00

smp: Add source and destination CPUs to __call_single_data

This commit adds a destination CPU to __call_single_data, and is inspired
by an earlier commit by Peter Zijlstra.  This version adds #ifdef to
permit use by 32-bit systems and supplying the destination CPU for all
smp_call_function*() requests, not just smp_call_function_single().

If need be, 32-bit systems could be accommodated by shrinking the flags
field to 16 bits (the atomic_t variant is currently unused) and by
providing only eight bits for CPU on such systems.

It is not clear that the addition of the fields to __call_single_node
are really needed.

[ paulmck: Apply Boqun Feng feedback on 32-bit builds. ]
Link: 
https://lore.kernel.org/lkml/20200615164048.gc2...@hirez.programming.kicks-ass.net/
Cc: Peter Zijlstra 
Cc: Ingo Molnar 
Cc: Thomas Gleixner 
Cc: Sebastian Andrzej Siewior 
Cc: Frederic Weisbecker 
Signed-off-by: Paul E. McKenney 
---
 include/linux/smp.h   | 3 +++
 include/linux/smp_types.h | 3 +++
 kernel/smp.c  | 6 ++
 3 files changed, 12 insertions(+)

diff --git a/include/linux/smp.h b/include/linux/smp.h
index 80d557e..9f13966 100644
--- a/include/linux/smp.h
+++ b/include/linux/smp.h
@@ -26,6 +26,9 @@ struct __call_single_data {
struct {
struct llist_node llist;
unsigned int flags;
+#ifdef CONFIG_64BIT
+   u16 src, dst;
+#endif
};
};
smp_call_func_t func;
diff --git a/include/linux/smp_types.h b/include/linux/smp_types.h
index 364b3ae..2e8461a 100644
--- a/include/linux/smp_types.h
+++ b/include/linux/smp_types.h
@@ -61,6 +61,9 @@ struct __call_single_node {
unsigned intu_flags;
atomic_ta_flags;
};
+#ifdef CONFIG_64BIT
+   u16 src, dst;
+#endif
 };
 
 #endif /* __LINUX_SMP_TYPES_H */
diff --git a/kernel/smp.c b/kernel/smp.c
index d0ae8eb..865a876 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -375,6 +375,9 @@ int smp_call_function_single(int cpu, smp_call_func_t func, 
void *info,
 
csd->func = func;
csd->info = info;
+#ifdef CONFIG_64BIT
+   csd->dst = cpu;
+#endif
 
err = generic_exec_single(cpu, csd);
 
@@ -540,6 +543,9 @@ static void smp_call_function_many_cond(const struct 
cpumask *mask,
csd->flags |= CSD_TYPE_SYNC;
csd->func = func;
csd->info = info;
+#ifdef CONFIG_64BIT
+   csd->dst = cpu;
+#endif
if (llist_add(&csd->llist, &per_cpu(call_single_queue, cpu)))
__cpumask_set_cpu(cpu, cfd->cpumask_ipi);
}


Re: [PATCH v4] mmc: core: don't set limits.discard_granularity as 0

2020-10-08 Thread Ulf Hansson
On Fri, 2 Oct 2020 at 03:39, Coly Li  wrote:
>
> In mmc_queue_setup_discard() the mmc driver queue's discard_granularity
> might be set as 0 (when card->pref_erase > max_discard) while the mmc
> device still declares to support discard operation. This is buggy and
> triggered the following kernel warning message,
>
> WARNING: CPU: 0 PID: 135 at __blkdev_issue_discard+0x200/0x294
> CPU: 0 PID: 135 Comm: f2fs_discard-17 Not tainted 5.9.0-rc6 #1
> Hardware name: Google Kevin (DT)
> pstate: 0005 (nzcv daif -PAN -UAO BTYPE=--)
> pc : __blkdev_issue_discard+0x200/0x294
> lr : __blkdev_issue_discard+0x54/0x294
> sp : 800011dd3b10
> x29: 800011dd3b10 x28:  x27: 800011dd3cc4 x26: 
> 800011dd3e18 x25: 0004e69b x24: 0c40 x23: 
> f1deaaf0 x22: f2849200 x21: 002734d8 x20: 
> 0008 x19:  x18:  x17: 
>  x16:  x15:  x14: 
> 0394 x13:  x12:  x11: 
>  x10: 08b0 x9 : 800011dd3cb0 x8 : 
> 0004e69b x7 :  x6 : f1926400 x5 : 
> f1940800 x4 :  x3 : 0c40 x2 : 
> 0008 x1 : 002734d8 x0 :  Call trace:
> __blkdev_issue_discard+0x200/0x294
> __submit_discard_cmd+0x128/0x374
> __issue_discard_cmd_orderly+0x188/0x244
> __issue_discard_cmd+0x2e8/0x33c
> issue_discard_thread+0xe8/0x2f0
> kthread+0x11c/0x120
> ret_from_fork+0x10/0x1c
> ---[ end trace e4c8023d33dfe77a ]---
>
> This patch fixes the issue by setting discard_granularity as SECTOR_SIZE
> instead of 0 when (card->pref_erase > max_discard) is true. Now no more
> complain from __blkdev_issue_discard() for the improper value of discard
> granularity.
>
> This issue is exposed after commit b35fd7422c2f ("block: check queue's
> limits.discard_granularity in __blkdev_issue_discard()"), a "Fixes:" tag
> is also added for the commit to make sure people won't miss this patch
> after applying the change of __blkdev_issue_discard().
>
> Fixes: e056a1b5b67b ("mmc: queue: let host controllers specify maximum 
> discard timeout")
> Fixes: b35fd7422c2f ("block: check queue's limits.discard_granularity in 
> __blkdev_issue_discard()").
> Reported-and-tested-by: Vicente Bergas 
> Signed-off-by: Coly Li 
> Acked-by: Adrian Hunter 
> Cc: Ulf Hansson 

While waiting for a new version that uses the logical block size, I
instead decided to apply this for fixes as is, thanks!

Please base the new version on top of this one instead.

Kind regards
Uffe


> ---
> Changelog,
> v4, update to Reported-and-tested-by tag for Vicente Bergas.
> v3, add Fixes tag for both commits.
> v2, change commit id of the Fixes tag.
> v1, initial version.
>
>  drivers/mmc/core/queue.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c
> index 6c022ef0f84d..350d0cc4ee62 100644
> --- a/drivers/mmc/core/queue.c
> +++ b/drivers/mmc/core/queue.c
> @@ -190,7 +190,7 @@ static void mmc_queue_setup_discard(struct request_queue 
> *q,
> q->limits.discard_granularity = card->pref_erase << 9;
> /* granularity must not be greater than max. discard */
> if (card->pref_erase > max_discard)
> -   q->limits.discard_granularity = 0;
> +   q->limits.discard_granularity = SECTOR_SIZE;
> if (mmc_can_secure_erase_trim(card))
> blk_queue_flag_set(QUEUE_FLAG_SECERASE, q);
>  }
> --
> 2.26.2
>


Re: [GIT PULL tip/core/rcu] RCU commits for v5.10

2020-10-08 Thread Ingo Molnar


* Paul E. McKenney  wrote:

> Hello, Ingo!
> 
> This pull request contains the following changes:
> 
> 1.Documentation updates.
> 
>   https://lore.kernel.org/lkml/20200831175419.GA31013@paulmck-ThinkPad-P72
> 
> 2.Miscellaneous fixes.
> 
>   https://lore.kernel.org/lkml/20200831180050.GA32590@paulmck-ThinkPad-P72
> 
> 3.Torture-test updates.
> 
>   https://lore.kernel.org/lkml/20200831180348.GA416@paulmck-ThinkPad-P72
> 
> 4.New smp_call_function() torture test.
> 
>   https://lore.kernel.org/lkml/20200831180731.GA582@paulmck-ThinkPad-P72
> 
> 5.Strict grace periods for KASAN.  The point of this series is to find
>   RCU-usage bugs, so the corresponding new RCU_STRICT_GRACE_PERIOD
>   Kconfig option depends on both DEBUG_KERNEL and RCU_EXPERT, and is
>   further disabled by dfefault.  Finally, the help text includes
>   a goodly list of scary caveats.
> 
>   https://lore.kernel.org/lkml/20200831181101.GA950@paulmck-ThinkPad-P72
> 
> 6.Debugging for smp_call_function().
> 
>   https://lore.kernel.org/lkml/20200831181356.GA1224@paulmck-ThinkPad-P72

>  57 files changed, 1582 insertions(+), 421 deletions(-)

Pulled into tip:core/rcu, thanks a lot Paul!

Ingo


Re: [PATCH v3 1/5] fpga: dfl: rename the bus type "dfl" to "fpga-dfl"

2020-10-08 Thread Xu Yilun
Hi Greg:

On Mon, Sep 28, 2020 at 09:19:00PM -0700, Moritz Fischer wrote:
> Hi Xu,
> 
> On Tue, Sep 29, 2020 at 09:23:23AM +0800, Xu Yilun wrote:
> > Hi moritz:
> > 
> > On Sun, Sep 27, 2020 at 04:36:47PM +0800, Xu Yilun wrote:
> > > Hi Greg,
> > > 
> > > On Sun, Sep 27, 2020 at 09:54:01AM +0200, Greg KH wrote:
> > > > On Sun, Sep 27, 2020 at 03:37:54PM +0800, Xu Yilun wrote:
> > > > > Hi Greg,
> > > > > 
> > > > > On Sun, Sep 27, 2020 at 07:51:08AM +0200, Greg KH wrote:
> > > > > > On Sat, Sep 26, 2020 at 12:22:19PM -0700, Moritz Fischer wrote:
> > > > > > > Hi Greg,
> > > > > > > 
> > > > > > > On Sat, Sep 26, 2020 at 08:09:13AM +0200, Greg KH wrote:
> > > > > > > > On Sat, Sep 26, 2020 at 10:23:46AM +0800, Xu Yilun wrote:
> > > > > > > > > Hi greg,
> > > > > > > > > 
> > > > > > > > > About the bus naming, I summarized some questions we've 
> > > > > > > > > discussed to check
> > > > > > > > > with you. See inline.
> > > > > > > > > 
> > > > > > > > > On Thu, Sep 24, 2020 at 10:27:00AM -0700, Moritz Fischer 
> > > > > > > > > wrote:
> > > > > > > > > > Hi Xu,
> > > > > > > > > > 
> > > > > > > > > > On Fri, Sep 25, 2020 at 12:59:57AM +0800, Xu Yilun wrote:
> > > > > > > > > > > Now the DFL device drivers could be made as independent 
> > > > > > > > > > > modules and put
> > > > > > > > > > > in different subsystems according to their 
> > > > > > > > > > > functionalities. So the name
> > > > > > > > > > > should be descriptive and unique in the whole kernel.
> > > > > > > > > > > 
> > > > > > > > > > > The patch changes the naming of dfl bus related 
> > > > > > > > > > > structures, functions,
> > > > > > > > > > > APIs and documentations.
> > > > > > > > > > > 
> > > > > > > > > > > Signed-off-by: Xu Yilun 
> > > > > > > > > > > ---
> > > > > > > > > > >  Documentation/ABI/testing/sysfs-bus-dfl  |  15 --
> > > > > > > > > > >  Documentation/ABI/testing/sysfs-bus-fpga-dfl |  15 ++
> > > > > > > > > > >  MAINTAINERS  |   2 +-
> > > > > > > > > > >  drivers/fpga/dfl.c   | 254 
> > > > > > > > > > > ++-
> > > > > > > > > > >  drivers/fpga/dfl.h   |  77 
> > > > > > > > > > > 
> > > > > > > > > > >  5 files changed, 184 insertions(+), 179 deletions(-)
> > > > > > > > > > >  delete mode 100644 
> > > > > > > > > > > Documentation/ABI/testing/sysfs-bus-dfl
> > > > > > > > > > >  create mode 100644 
> > > > > > > > > > > Documentation/ABI/testing/sysfs-bus-fpga-dfl
> > > > > > > > > > > 
> > > > > > > > > > > diff --git a/Documentation/ABI/testing/sysfs-bus-dfl 
> > > > > > > > > > > b/Documentation/ABI/testing/sysfs-bus-dfl
> > > > > > > > > > > deleted file mode 100644
> > > > > > > > > > > index 23543be..000
> > > > > > > > > > > --- a/Documentation/ABI/testing/sysfs-bus-dfl
> > > > > > > > > > > +++ /dev/null
> > > > > > > > > > > @@ -1,15 +0,0 @@
> > > > > > > > > > > -What:/sys/bus/dfl/devices/dfl_dev.X/type
> > > > > > > > > > > -Date:Aug 2020
> > > > > > > > > > > -KernelVersion:   5.10
> > > > > > > > > > > -Contact: Xu Yilun 
> > > > > > > > > > > -Description: Read-only. It returns type of DFL FIU 
> > > > > > > > > > > of the device. Now DFL
> > > > > > > > > > > - supports 2 FIU types, 0 for FME, 1 for PORT.
> > > > > > > > > > > - Format: 0x%x
> > > > > > > > > > > -
> > > > > > > > > > > -What:
> > > > > > > > > > > /sys/bus/dfl/devices/dfl_dev.X/feature_id
> > > > > > > > > > > -Date:Aug 2020
> > > > > > > > > > > -KernelVersion:   5.10
> > > > > > > > > > > -Contact: Xu Yilun 
> > > > > > > > > > > -Description: Read-only. It returns feature 
> > > > > > > > > > > identifier local to its DFL FIU
> > > > > > > > > > > - type.
> > > > > > > > > > > - Format: 0x%x
> > > > > > > > > > 
> > > > > > > > > > You're changing userland facing ABI. I think that's 
> > > > > > > > > > something to avoid,
> > > > > > > > > > please check with Greg on the rules since this hasn't been 
> > > > > > > > > > in a release yet.
> > > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > I'm going to change the name of bus stuff for other 
> > > > > > > > > subsystems, to be
> > > > > > > > > aligned, I also consider change the bus_type.name and dfl 
> > > > > > > > > dev_name. But
> > > > > > > > > it will cause the changing of user ABIs. No user case for 
> > > > > > > > > these user ABI
> > > > > > > > > now cause they are just queued, is it good I change them?
> > > > > > > > 
> > > > > > > > Why change the user name here?  No need for that, right?  
> > > > > > > > Unless you
> > > > > > > > really want to, and think that no one will notice.  If so, 
> > > > > > > > fine, change
> > > > > > > > them :)
> > > > > > > 
> > > > > > > Let's leave it as is -- An FPGA is one possible implementation 
> > > > > > > and as for
> > > > > > > other buses, you wouldn't call it fpga-usb or usb-fpga just 
> > > > > >

Re: [PATCH v2 1/2] dt-bindings: pwm: renesas,tpu-pwm: Document r8a7742 support

2020-10-08 Thread Uwe Kleine-König
On Tue, Oct 06, 2020 at 09:19:09AM +0100, Lad Prabhakar wrote:
> Document r8a7742 specific compatible strings. No driver change is
> needed as the fallback compatible string "renesas,tpu" activates the
> right code in the driver.
> 
> Signed-off-by: Lad Prabhakar 
> Reviewed-by: Marian-Cristian Rotariu 
> 
> Reviewed-by: Geert Uytterhoeven 
> Acked-by: Rob Herring 

Acked-by: Uwe Kleine-König 

Which tree is this patch series supposed to go in via? pwm or renesas?

Best regards
Uwe

-- 
Pengutronix e.K.   | Uwe Kleine-König|
Industrial Linux Solutions | https://www.pengutronix.de/ |


signature.asc
Description: PGP signature


[tip: perf/urgent] perf: Fix task_function_call() error handling

2020-10-08 Thread tip-bot2 for Kajol Jain
The following commit has been merged into the perf/urgent branch of tip:

Commit-ID: 6d6b8b9f4fceab7266ca03d194f60ec72bd4b654
Gitweb:
https://git.kernel.org/tip/6d6b8b9f4fceab7266ca03d194f60ec72bd4b654
Author:Kajol Jain 
AuthorDate:Thu, 27 Aug 2020 12:17:32 +05:30
Committer: Ingo Molnar 
CommitterDate: Fri, 09 Oct 2020 08:18:33 +02:00

perf: Fix task_function_call() error handling

The error handling introduced by commit:

  2ed6edd33a21 ("perf: Add cond_resched() to task_function_call()")

looses any return value from smp_call_function_single() that is not
{0, -EINVAL}. This is a problem because it will return -EXNIO when the
target CPU is offline. Worse, in that case it'll turn into an infinite
loop.

Fixes: 2ed6edd33a21 ("perf: Add cond_resched() to task_function_call()")
Reported-by: Srikar Dronamraju 
Signed-off-by: Kajol Jain 
Signed-off-by: Peter Zijlstra (Intel) 
Signed-off-by: Ingo Molnar 
Reviewed-by: Barret Rhoden 
Tested-by: Srikar Dronamraju 
Link: https://lkml.kernel.org/r/20200827064732.20860-1-kj...@linux.ibm.com
---
 kernel/events/core.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 7ed5248..e8bf922 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -99,7 +99,7 @@ static void remote_function(void *data)
  * retry due to any failures in smp_call_function_single(), such as if the
  * task_cpu() goes offline concurrently.
  *
- * returns @func return value or -ESRCH when the process isn't running
+ * returns @func return value or -ESRCH or -ENXIO when the process isn't 
running
  */
 static int
 task_function_call(struct task_struct *p, remote_function_f func, void *info)
@@ -115,7 +115,8 @@ task_function_call(struct task_struct *p, remote_function_f 
func, void *info)
for (;;) {
ret = smp_call_function_single(task_cpu(p), remote_function,
   &data, 1);
-   ret = !ret ? data.ret : -EAGAIN;
+   if (!ret)
+   ret = data.ret;
 
if (ret != -EAGAIN)
break;


  1   2   3   4   5   6   7   8   9   10   >