Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp2389338ybi; Sat, 1 Jun 2019 15:32:38 -0700 (PDT) X-Google-Smtp-Source: APXvYqx7eL0VrQA5GKXGJqI8y6LIiuTDbLcW+jNVZcHlaoGgaz4y/l7IKoy4Cf6vr3VkUryrJuWN X-Received: by 2002:a17:902:1cb:: with SMTP id b69mr19832674plb.158.1559428358820; Sat, 01 Jun 2019 15:32:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559428358; cv=none; d=google.com; s=arc-20160816; b=qzNFKUdjzAiMxD+Go91yr+rJZ5sK4WTPYoble3lOUr/rpB40Vop/CwP/CiC69U4GOw JZt6+p6cuMELgkScP45S4xxGYi/eVqB1UPOWXBeNsKFrMPWckFgYyv6cbZHrKlN1/raf 7rCZsolnN3k8nuVCOBh+Eopa31RhcS14+ZUMBn3WCXrlvVoIoTR9cUdudQo6PG5O6mc8 xCq+G9s3D48m+PFOv8rY9RtEPrm5qb3YEY1pGlOWefvUQqXs7NeUX0MxCngbkr7YZhwb 1gpY2FjnLDxkEMusUKC7pBvf+vxpdRcjwEU74NJEPqllP53S00hwesaEwip1M+LwG1kP uauw== 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=aBGnU4B8yz6TY7rs1ttpv6dYzM78JOOLHwHJBrwnlj0=; b=UAHXjOWJ+78mGG6ybz58/Yrw/ZB66aq9pyculZI6ubfgqrV5T2k7yr8NDS/EmxuAUt rXPU/OpUC4WRe4TiLAbORMTpBr26gt9kBjkmsNuwRq1PAfntEWidJl/ISbSQ6Iezgdmz AMT2f3Xgq/iQk3pBLcJWIdhaK2hCjfpkIYRCTBxyehGJ0xvpz+OJczhFYriFwOL+DCxF nP160aNXsC4tD9ct7WDomzX/NBcZbtdFASlR5XAl2ww3ufl9Tb9suSWMx5YA2KIVF6Iz FxAxIrAfY8W7dsQ2S7WhPikkb1iVgnuQMNvNhEFZJGY+vqaMwjT0muNtbSME7VgPQ3KI GSxg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=CQwWpjN2; 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 q4si11517654pgc.108.2019.06.01.15.31.41; Sat, 01 Jun 2019 15:32:38 -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=CQwWpjN2; 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 S1726674AbfFAW1r (ORCPT + 99 others); Sat, 1 Jun 2019 18:27:47 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:36288 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726496AbfFAW1r (ORCPT ); Sat, 1 Jun 2019 18:27:47 -0400 Received: by mail-pg1-f195.google.com with SMTP id a3so6058849pgb.3 for ; Sat, 01 Jun 2019 15:27:46 -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=aBGnU4B8yz6TY7rs1ttpv6dYzM78JOOLHwHJBrwnlj0=; b=CQwWpjN2M/JQgAh0nRmAFns5qtmUi/CfZMZrB2mQoTB9+Qo1tSEc1Kpz0C1BNh1MMF Qoe6ipWnbmIlLMqdCsoERG9eceVDsizaAa+20vynwx8xh51jXlOaCvVKdu7AF8PI2hsW 7P7wjWs83oqjTUezNSxGTAR88321VMSmNnCfo= 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=aBGnU4B8yz6TY7rs1ttpv6dYzM78JOOLHwHJBrwnlj0=; b=Of5qxPA3wbklaobhnfRMavN7NNbESbV3fLZRW/T2N0hHvRhCI7YWmCJNp1e/z8r+s3 9xTMrhLuX7jyzSEqtvJSSObtIz6/YVvpb0SefEBj2gSr1HMa6jOUZljD+kcsa9wWRPBo kgvUsM5lK2/Ukg9GwdPHistyNS5i7hhclTsQxj7iLijoHTXg8QbY23rAmz0aZKPC9rFK KXGzdzGsX3/4+fyj0w2USCk/xygEeCZ6Zd9yTjJ74P0XFsZ73lAa9zdxUSIZqCSHg9pr uPWs8ySKKSRJ38nHyBzEu5VoYsZcb/FrThMwWKDNCPt+W9ZPTBoSPtHe2DrWzR2K6Y0p ghfA== X-Gm-Message-State: APjAAAVYRX522QM9IYEWXLWFk3xktf6bpXECiwGLwRffA3C2UEphi3Ve 4qIrZNqIT5GI0ccUEPivF86Krao3S2pPJg== X-Received: by 2002:a63:6848:: with SMTP id d69mr18759474pgc.0.1559428065507; Sat, 01 Jun 2019 15:27:45 -0700 (PDT) Received: from joelaf.cam.corp.google.com ([2620:15c:6:12:9c46:e0da:efbf:69cc]) by smtp.gmail.com with ESMTPSA id t33sm9908018pjb.1.2019.06.01.15.27.40 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Sat, 01 Jun 2019 15:27:44 -0700 (PDT) From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org Cc: "Joel Fernandes (Google)" , Alexey Kuznetsov , Bjorn Helgaas , Borislav Petkov , "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" , rcu@vger.kernel.org, Steven Rostedt , Tejun Heo , Thomas Gleixner , x86@kernel.org (maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)) Subject: [RFC 0/6] Harden list_for_each_entry_rcu() and family Date: Sat, 1 Jun 2019 18:27:32 -0400 Message-Id: <20190601222738.6856-1-joel@joelfernandes.org> X-Mailer: git-send-email 2.22.0.rc1.311.g5d7573a151-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, Please consider this as an RFC / proof-of-concept to gather some feedback. 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_enry_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, 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. Now, 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. This series 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). 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 one. Also in the future, we can extend these checks to list_entry_rcu() and other list macros as well. 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 | 40 ++++++++++++++++++++++++++++++---- include/linux/rcupdate.h | 7 ++++++ kernel/rcu/update.c | 26 ++++++++++++++++++++++ kernel/workqueue.c | 5 ++--- net/ipv4/fib_frontend.c | 3 ++- 10 files changed, 101 insertions(+), 17 deletions(-) -- 2.22.0.rc1.311.g5d7573a151-goog