Received: by 10.223.176.46 with SMTP id f43csp3879471wra; Tue, 23 Jan 2018 00:13:42 -0800 (PST) X-Google-Smtp-Source: AH8x226Rj5ngJ9qrJH/c6na4f1cBu5jUKawtyQxR5r8bv+ZFkLzN4BoathZr60cfVqf7ngw0yZEv X-Received: by 10.98.75.146 with SMTP id d18mr9894312pfj.11.1516695222039; Tue, 23 Jan 2018 00:13:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516695222; cv=none; d=google.com; s=arc-20160816; b=IgALMTvqtQwEXEOoIl+ucJArU9ulUtDLNQbFVmCDWpsMzJkbnJuNLEqJiK2mxB5HSL UxN8swqUSfUN4ZA9rB/Ml4zWRAOL4gov4BlSy4nH+3oFYyUTrdkALkIWYTRhBP5wGpqI D50ItGAvmve+0dqU9+9xiDRITXYDAiL5d+XihLcwfFh9K6l/9X+Nuee4ZHfz8BLdbLCF bkntR9AdimsOp+rnvzz3GeB/qkrTWAuS38mv5wPs6bhPFfS0+nc/8bBBFvV7FQgKeH3i zV9WAzO6v3N1FrCYuCMSOhcjM0NHQ/jw/oL5Gj6D1wjBPt6tYHfZ0yGAqfOgfb30YFZL vBzw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from:arc-authentication-results; bh=IsDg38Uv9H73bXzImfyiEeUBeAwJ95VrMl7lHOKUGbk=; b=ofyUuUnTMKqhKjAzfVx5SNpr+uhUOYZkt/aSYhhTEKZFdGhtIWRrSuHqcqk92WeZ/a qnUwi+KrFr7xJHigCgp5YzadtzQfrR9+5PL+w//4KA3PvWMNPJSKTAVyjEneht7WqNGR VSwATQBBhZMkcPuOchXRhzXE3b1r9wxTXAY7VT3/uzB7OnkkGiHmzUHd9xhUQMc4r3i2 m+Zv3818MdFgD1jlH+7BomhbALeD8SFaFfN1z3IfsEPYqWmSS7dn1WwpPZJ+H+1zDlyR mUJwkI8E8iBO2ZODQgl9kbhugv2s4/dJMB1+6Gb7Rk1xxAdMk6E0AeDkZWbSjg/TmNrJ UypA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d9si4400367pgp.285.2018.01.23.00.13.27; Tue, 23 Jan 2018 00:13:41 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751431AbeAWIMa (ORCPT + 99 others); Tue, 23 Jan 2018 03:12:30 -0500 Received: from szxga06-in.huawei.com ([45.249.212.32]:38672 "EHLO huawei.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1751209AbeAWIIq (ORCPT ); Tue, 23 Jan 2018 03:08:46 -0500 Received: from DGGEMS409-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 47B3B9240C030; Tue, 23 Jan 2018 16:08:32 +0800 (CST) Received: from huawei.com (10.175.102.37) by DGGEMS409-HUB.china.huawei.com (10.3.19.209) with Microsoft SMTP Server id 14.3.361.1; Tue, 23 Jan 2018 16:08:25 +0800 From: To: CC: , , , , Subject: [PATCH RFC 00/16] A new RCU implementation based on a fast consensus protocol Date: Tue, 23 Jan 2018 15:59:25 +0800 Message-ID: <1516694381-20333-1-git-send-email-lianglihao@huawei.com> X-Mailer: git-send-email 1.7.12.4 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.102.37] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Lihao Liang Dear Paul, This patch set implements a preemptive version of RCU (PRCU) based on the following paper: Fast Consensus Using Bounded Staleness for Scalable Read-mostly Synchronization. Haibo Chen, Heng Zhang, Ran Liu, Binyu Zang, and Haibing Guan. IEEE Transactions on Parallel and Distributed Systems (TPDS), 2016. https://dl.acm.org/citation.cfm?id=3024114.3024143 We have also added preliminary callback-handling support. Thus, the current version provides APIs prcu_read_lock(), prcu_read_unlock(), synchronize_prcu(), call_prcu(), and prcu_barrier(). This is an experimental patch, so it would be good to have some feedback. Known shortcoming is that the grace-period version is incremented in synchronize_prcu(). If call_prcu() or prcu_barrier() is called but there is no synchronized_prcu() invoked, callbacks cannot be invoked. Later version should address this issue, e.g. adding a grace-period expedition mechanism. Others include to use a a hierarchical structure, taking into account the NUMA topology, to send IPI in synchronize_prcu(). We have tested the implementation using rcutorture on both an x86 and ARM64 machine. PRCU passed 1h and 3h tests on all the newly added config files except PRCU07 reported BUG in a 1h run. [ 1593.604201] ---[ end trace b3bae911bec86152 ]--- [ 1594.629450] prcu-torture:torture_onoff task: offlining 14 [ 1594.755553] smpboot: CPU 14 is now offline [ 1594.757732] prcu-torture:torture_onoff task: offlined 14 [ 1597.765149] prcu-torture:torture_onoff task: onlining 11 [ 1597.766795] smpboot: Booting Node 0 Processor 11 APIC 0xb [ 1597.804102] prcu-torture:torture_onoff task: onlined 11 [ 1599.365098] prcu-torture: rtc: ffffffffb0277b90 ver: 66358 tfle: 0 rta: 66358 rtaf: 0 rtf: 66349 rtmbe: 0 rtbe: 1 rtbke: 0 rtbre: 0 rtbf: 0 rtb: 0 nt: 2233418 onoff: 191/191:199/199 34,199:59,5102 10403:0 (HZ=1000) barrier: 188/189:1 cbflood: 225 [ 1599.367946] prcu-torture: !!! [ 1599.367966] ------------[ cut here ]------------ We have also compared PRCU with TREE RCU using rcuperf with gp_exp set to true, that is synchronize_rcu_expedited was tested. The rcuperf results are as follows (average grace-period duration in ms of ten 10min runs): 16*Intel Xeon CPU@2.4GHz, 16GB memory, Ubuntu Linux 3.13.0-47-generic CPUs 2 4 8 12 15 16 PRCU 0.14 1.07 4.15 8.02 10.79 15.16 TREE 49.30 104.75 277.55 390.82 620.82 1381.54 64*Cortex-A72 CPU@2.4GHz, 130GB memory, Ubuntu Linux 4.10.0-21.23-generic CPUs 2 4 8 16 32 48 63 64 PRCU 0.23 19.69 38.28 63.21 95.41 167.18 252.01 1841.44 TREE 416.73 901.89 1060.86 743.00 920.66 1325.21 1646.20 23806.27 Best wishes, Lihao. Lihao Liang (15): rcutorture: Add PRCU rcu_torture_ops rcutorture: Add PRCU test config files rcuperf: Add PRCU rcu_perf_ops rcuperf: Add PRCU test config files rcuperf: Set gp_exp to true for tests to run prcu: Implement call_prcu() API prcu: Implement PRCU callback processing prcu: Implement prcu_barrier() API rcutorture: Test call_prcu() and prcu_barrier() rcutorture: Add basic ARM64 support to run scripts prcu: Add PRCU Kconfig parameter prcu: Comment source code rcuperf: Add config files with various CONFIG_NR_CPUS rcutorture: Add scripts to run experiments Add GPLv2 license Heng Zhang (1): prcu: Add PRCU implementation include/linux/interrupt.h | 3 + include/linux/prcu.h | 122 +++++ include/linux/rcupdate.h | 1 + init/Kconfig | 7 + init/main.c | 2 + kernel/rcu/Makefile | 1 + kernel/rcu/prcu.c | 497 +++++++++++++++++++++ kernel/rcu/rcuperf.c | 33 +- kernel/rcu/rcutorture.c | 40 +- kernel/rcu/tree.c | 1 + kernel/sched/core.c | 2 + kernel/time/timer.c | 2 + kvm.sh | 452 +++++++++++++++++++ run-rcuperf.sh | 26 ++ .../testing/selftests/rcutorture/bin/functions.sh | 17 +- .../selftests/rcutorture/configs/rcu/CFLIST | 5 + .../selftests/rcutorture/configs/rcu/PRCU02 | 27 ++ .../selftests/rcutorture/configs/rcu/PRCU02.boot | 1 + .../selftests/rcutorture/configs/rcu/PRCU03 | 23 + .../selftests/rcutorture/configs/rcu/PRCU03.boot | 2 + .../selftests/rcutorture/configs/rcu/PRCU06 | 26 ++ .../selftests/rcutorture/configs/rcu/PRCU06.boot | 5 + .../selftests/rcutorture/configs/rcu/PRCU07 | 25 ++ .../selftests/rcutorture/configs/rcu/PRCU07.boot | 2 + .../selftests/rcutorture/configs/rcu/PRCU09 | 19 + .../selftests/rcutorture/configs/rcu/PRCU09.boot | 1 + .../selftests/rcutorture/configs/rcuperf/CFLIST | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU | 20 + .../selftests/rcutorture/configs/rcuperf/PRCU-12 | 21 + .../rcutorture/configs/rcuperf/PRCU-12.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-14 | 21 + .../rcutorture/configs/rcuperf/PRCU-14.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-15 | 21 + .../rcutorture/configs/rcuperf/PRCU-15.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-16 | 21 + .../rcutorture/configs/rcuperf/PRCU-16.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-2 | 21 + .../rcutorture/configs/rcuperf/PRCU-2.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-32 | 21 + .../rcutorture/configs/rcuperf/PRCU-32.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-4 | 21 + .../rcutorture/configs/rcuperf/PRCU-4.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-48 | 21 + .../rcutorture/configs/rcuperf/PRCU-48.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-56 | 21 + .../rcutorture/configs/rcuperf/PRCU-56.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-60 | 21 + .../rcutorture/configs/rcuperf/PRCU-60.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-62 | 21 + .../rcutorture/configs/rcuperf/PRCU-62.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-64 | 21 + .../rcutorture/configs/rcuperf/PRCU-64.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU-8 | 21 + .../rcutorture/configs/rcuperf/PRCU-8.boot | 1 + .../selftests/rcutorture/configs/rcuperf/PRCU.boot | 1 + .../selftests/rcutorture/configs/rcuperf/TREE-12 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-14 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-15 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-16 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-2 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-32 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-4 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-48 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-56 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-60 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-62 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-64 | 21 + .../selftests/rcutorture/configs/rcuperf/TREE-8 | 21 + 68 files changed, 1918 insertions(+), 5 deletions(-) create mode 100644 include/linux/prcu.h create mode 100644 kernel/rcu/prcu.c create mode 100755 kvm.sh create mode 100755 run-rcuperf.sh create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU02 create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU02.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU03 create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU03.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU06 create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU06.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU07 create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU07.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU09 create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/PRCU09.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-12 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-12.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-14 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-14.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-15 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-15.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-16 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-16.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-2 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-2.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-32 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-32.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-4 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-4.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-48 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-48.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-56 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-56.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-60 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-60.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-62 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-62.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-64 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-64.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-8 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU-8.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/PRCU.boot create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-12 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-14 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-15 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-16 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-2 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-32 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-4 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-48 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-56 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-60 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-62 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-64 create mode 100644 tools/testing/selftests/rcutorture/configs/rcuperf/TREE-8 -- 2.14.1.729.g59c0ea183