Re: [PATCH nf v2] netfilter: conntrack: connection timeout after re-register
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
* 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
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
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
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
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
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
# ./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
* 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)
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
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
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
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
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
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
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"
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
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
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
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
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()
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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()
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
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
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
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
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
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()
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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()
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()
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
* 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"
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
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
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;