Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp157813ybi; Thu, 11 Jul 2019 16:46:40 -0700 (PDT) X-Google-Smtp-Source: APXvYqwr+T5PQN3rABtLA1GPwwFnR7oM1vKaKNcpLp0W6dKdtb9CwqonsMuCP2xg6L0vaapLKDCt X-Received: by 2002:a65:6401:: with SMTP id a1mr7251292pgv.42.1562888800652; Thu, 11 Jul 2019 16:46:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562888800; cv=none; d=google.com; s=arc-20160816; b=DP7FDpyyV3U8t2b/VAj6uCsD3dpi5hT7jnpOQh0ZwaRVkT1TjPUkaUt+KI09JU8Fn6 BVCXB3tamfJrWrF0GFcUEMyAZuEkZDDkVo8JDIoJ8g0rOst7BcuMjd+TKmbSeFr3u/X6 044z5s6B/oesHL3t7i/B4c4WjKc4bK+imdCNLyjXeiT207E9CBoNgAxJMevJI+WXJXUO 09wrMFXoAmozYLedvIgi4i9pXTDJ8sxPZrOwo5/a0W3CEG/e3P5gSt0ovDayS6kaFaXU QdAewMc1HEKoRZJyi3eoExE5xVzCtpvtu4x8tNA0GO/32bl+MfkPBB1V4ynz4sDXKQqs Y8Bw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=tghsUW8vZE4uu9yXB3UzdXY9yotoHS+3md0iqX4wNrc=; b=ZerSNXF3t9y4xJi9SCYX3dEcRbe1ozX7MO01BmBh3ypIouh6r+/tRAuKAiea4nv91J B8tg2ytaY165JYQB5yaIk+sxI6XwiG5R96yijIJzuzXQSkB7uSt66nlGCU1lw/i0pvk9 OgXl1npJV8hJk1skAY7/GSHd1OMB40ec+fJmRHs9d5UnC5IJIDODF9Hh9QY7TovChRSk U510+DyWgZF51k+R7IMo6ZUkKv3JQIA4gUYZiD3vVa19vVNz/Lo98w6WJUfE+C87ya0I xsRU6ohv4xkwcYVGZkxVuwKdwYFwARt8dkuftCFY8v4C8/a4L0TgdN5J1HYGGRy5qDfy 76yw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=CNNjweAs; 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 68si6083855ple.89.2019.07.11.16.46.25; Thu, 11 Jul 2019 16:46:40 -0700 (PDT) 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; dkim=pass header.i=@joelfernandes.org header.s=google header.b=CNNjweAs; 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 S1729516AbfGKXoQ (ORCPT + 99 others); Thu, 11 Jul 2019 19:44:16 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:40852 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729220AbfGKXoQ (ORCPT ); Thu, 11 Jul 2019 19:44:16 -0400 Received: by mail-pg1-f193.google.com with SMTP id w10so3662440pgj.7 for ; Thu, 11 Jul 2019 16:44:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=tghsUW8vZE4uu9yXB3UzdXY9yotoHS+3md0iqX4wNrc=; b=CNNjweAsrPvkDGMoc+Bl+izOV7h5rnwQiW5+Qq/Rcn6ALDGWghfqH0nMSbAeMYrkM3 /J4tlfNNWxLzUUkUKEp92qZboOdyapuZ2tNTxJAxNF/w1Fu6FzqjLGB2pNaL8BS+RrH5 Dd+Ya7ZpvGKyq0zNFBJG83LhPAEugUpO1kKJ8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=tghsUW8vZE4uu9yXB3UzdXY9yotoHS+3md0iqX4wNrc=; b=DojcaZFGCDjDy1rrB3+M/WTAAUP+BiX/+/JeijpkjpxMnwiKQa17dhuB9l7IaIZDQf sEk6c2AsMYAJqZkNHa+VZcgb1AXIk1C7sWPMHji180UBG4MCBoB81TcvOsXcfMfNVEHg R327aW0GnB7+XGcmAFt6vuzpUS1sJjTyNQjOZx3DqjcH5+FFhPBYFtVC6NhfWikYper8 i3yXZAuPDGx6IIj67rR7TfaXW49TnPZFv95WO0TofXfpWejScVYF8qdufQH0+JWmSZXN CIFxG6bNmfRjmxRzsN5QV4/vrgW1wvMeppm6DtqtLOKvpZ7iJY5p1ofxdy58SIVa360x Gjrg== X-Gm-Message-State: APjAAAW3SdTHNHHeSnXmJFicLV4AkFOcHOKal364IuynAX1lOkSZXPvd tiF5MxHXMFipakmKDPMP3/ymB+mk X-Received: by 2002:a63:89c7:: with SMTP id v190mr6903311pgd.299.1562888654760; Thu, 11 Jul 2019 16:44:14 -0700 (PDT) Received: from joelaf.cam.corp.google.com ([2620:15c:6:12:9c46:e0da:efbf:69cc]) by smtp.gmail.com with ESMTPSA id t10sm6163450pjr.13.2019.07.11.16.44.11 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 11 Jul 2019 16:44:13 -0700 (PDT) From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org Cc: "Joel Fernandes (Google)" , Alexey Kuznetsov , Bjorn Helgaas , Borislav Petkov , c0d1n61at3@gmail.com, "David S. Miller" , edumazet@google.com, Greg Kroah-Hartman , Hideaki YOSHIFUJI , "H. Peter Anvin" , Ingo Molnar , Josh Triplett , keescook@chromium.org, kernel-hardening@lists.openwall.com, Lai Jiangshan , Len Brown , linux-acpi@vger.kernel.org, linux-pci@vger.kernel.org, linux-pm@vger.kernel.org, Mathieu Desnoyers , neilb@suse.com, netdev@vger.kernel.org, oleg@redhat.com, "Paul E. McKenney" , Pavel Machek , peterz@infradead.org, "Rafael J. Wysocki" , Rasmus Villemoes , rcu@vger.kernel.org, Steven Rostedt , Tejun Heo , Thomas Gleixner , will@kernel.org, x86@kernel.org (maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)) Subject: [PATCH v1 0/6] Harden list_for_each_entry_rcu() and family Date: Thu, 11 Jul 2019 19:43:55 -0400 Message-Id: <20190711234401.220336-1-joel@joelfernandes.org> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, This series aims to provide lockdep checking to RCU list macros. RCU has a number of primitives for "consumption" of an RCU protected pointer. Most of the time, these consumers make sure that such accesses are under a RCU reader-section (such as rcu_dereference{,sched,bh} or under a lock, such as with rcu_dereference_protected()). However, there are other ways to consume RCU pointers, such as by list_for_each_entry_rcu or hlist_for_each_enry_rcu. Unlike the rcu_dereference family, these consumers do no lockdep checking at all. And with the growing number of RCU list uses (1000+), it is possible for bugs to creep in and go unnoticed which lockdep checks can catch. Since RCU consolidation efforts last year, the different traditional RCU flavors (preempt, bh, sched) are all consolidated. In other words, any of these flavors can cause a reader section to occur and all of them must cease before the reader section is considered to be unlocked. Thanks to this, we can generically check if we are in an RCU reader. This is what patch 1 does. Note that the list_for_each_entry_rcu and family are different from the rcu_dereference family in that, there is no _bh or _sched version of this macro. They are used under many different RCU reader flavors, and also SRCU. Patch 1 adds a new internal function rcu_read_lock_any_held() which checks if any reader section is active at all, when these macros are called. If no reader section exists, then the optional fourth argument to list_for_each_entry_rcu() can be a lockdep expression which is evaluated (similar to how rcu_dereference_check() works). If no lockdep expression is passed, and we are not in a reader, then a splat occurs. Just take off the lockdep expression after applying the patches, by using the following diff and see what happens: +++ b/arch/x86/pci/mmconfig-shared.c @@ -55,7 +55,7 @@ static void list_add_sorted(struct pci_mmcfg_region *new) struct pci_mmcfg_region *cfg; /* keep list sorted by segment and starting bus number */ - list_for_each_entry_rcu(cfg, &pci_mmcfg_list, list, pci_mmcfg_lock_held()) { + list_for_each_entry_rcu(cfg, &pci_mmcfg_list, list) { The optional argument trick to list_for_each_entry_rcu() can also be used in the future to possibly remove rcu_dereference_{,bh,sched}_protected() API and we can pass an optional lockdep expression to rcu_dereference() itself. Thus eliminating 3 more RCU APIs. Note that some list macro wrappers already do their own lockdep checking in the caller side. These can be eliminated in favor of the built-in lockdep checking in the list macro that this series adds. For example, workqueue code has a assert_rcu_or_wq_mutex() function which is called in for_each_wq(). This series replaces that in favor of the built-in check. Also in the future, we can extend these checks to list_entry_rcu() and other list macros as well, if needed. Joel Fernandes (Google) (6): rcu: Add support for consolidated-RCU reader checking ipv4: add lockdep condition to fix for_each_entry driver/core: Convert to use built-in RCU list checking workqueue: Convert for_each_wq to use built-in list check x86/pci: Pass lockdep condition to pcm_mmcfg_list iterator acpi: Use built-in RCU list checking for acpi_ioremaps list arch/x86/pci/mmconfig-shared.c | 5 +++-- drivers/acpi/osl.c | 6 ++++-- drivers/base/base.h | 1 + drivers/base/core.c | 10 ++++++++++ drivers/base/power/runtime.c | 15 ++++++++++----- include/linux/rculist.h | 29 ++++++++++++++++++++++++----- include/linux/rcupdate.h | 7 +++++++ kernel/rcu/Kconfig.debug | 11 +++++++++++ kernel/rcu/update.c | 26 ++++++++++++++++++++++++++ kernel/workqueue.c | 5 ++--- net/ipv4/fib_frontend.c | 3 ++- 11 files changed, 100 insertions(+), 18 deletions(-) -- 2.22.0.410.gd8fdbe21b5-goog