Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp864986ybk; Sat, 9 May 2020 22:18:21 -0700 (PDT) X-Google-Smtp-Source: APiQypLkR+MUr5kNCrYcfax7q7bZ2iMT/vBgLYz2mvncR6ueNA3wDvbRMsxOUwVWTdTwpeH5y0Jt X-Received: by 2002:a05:6402:b4c:: with SMTP id bx12mr8765236edb.247.1589087901574; Sat, 09 May 2020 22:18:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589087901; cv=none; d=google.com; s=arc-20160816; b=g/T+cY3LoKAcz1GqN44BK+y1JAOIc90g+B2otx/BdNz9DZRX5Bt93T/wGaScYTCqBC 8r6BXGYkfn73phn9PSjYtOLfvuNXZ0oKqtJAw0i5Ea2E9pYrrCMeS6vVkKSKV9hoTfEr Z+3eGOGDHN2TDkRtOLZxxlppFFoGWI7Qb/C/UI3li/t4AgogSxPS+fjyNfFiMSH1KIok uFIGC5FIAzF230QiyKbPovhxNLIv2yttbijOX5RGvtDPLvYQmpev0X0jFgsjnGcWlc/P V20ImgIiM4d7ZasFQzku0I/i80XEhqI/wsErg0zPqMvykcc1ZpF07IVV3Mu1B9cgBD6j vnug== 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=eZQOBtTOiht/0OTixgCTPb48WYjmKFlAenmS+UqHqNA=; b=X0CynEbvRI6VvkFf2Ax3+364Mm0ANIw+IFw3V8ozzmORGRliy7F6VyVAHOUiRs6AQ+ fghPj4605N2cCY8Rls+Uipl4Anh0LqUebLFjuW8dHWfWHHeg8FEbxPympqyD6YtoiFVE 0J953K2FrufKVZL5yOjXH/cCWiZSD9czwB40YORV5aKHMbw/NjeB7+wf162EXJPW32xX XBNxvFAmCJF6vCc12YOGbm9opG/7M28JtbUJSzxyhMdy/yJBl2LQVKkN3OW6NhTrcYMj SyBkY2TUklSvFUlMtYxxE3DZ+lRa/PpUlYdJZZcqRyGkYCKnGnRaO8e5dBJSSDeeYrCh lLgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lca.pw header.s=google header.b=ZQroANp8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cn24si211192edb.340.2020.05.09.22.17.59; Sat, 09 May 2020 22:18:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@lca.pw header.s=google header.b=ZQroANp8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728390AbgEJFQK (ORCPT + 99 others); Sun, 10 May 2020 01:16:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41784 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728332AbgEJFQK (ORCPT ); Sun, 10 May 2020 01:16:10 -0400 Received: from mail-qk1-x741.google.com (mail-qk1-x741.google.com [IPv6:2607:f8b0:4864:20::741]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 38947C061A0C for ; Sat, 9 May 2020 22:16:10 -0700 (PDT) Received: by mail-qk1-x741.google.com with SMTP id b188so6323389qkd.9 for ; Sat, 09 May 2020 22:16:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lca.pw; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=eZQOBtTOiht/0OTixgCTPb48WYjmKFlAenmS+UqHqNA=; b=ZQroANp8fgUbLE8O4nFaXlsn7+z6JZjkWLsveqku+AYSLiUyGrfjpC2D7qEkXrb0nV T1EgclBvDaia3VA+43Ew95hkDX2T6KgjVwcCfslouE+D1RS7CLU7qWtdj1yOiqASSZVW m477xibSv/upulyLQtawU1erZ0Ths74iNxOsBZhfdKWwn2g7EioloXZwbH61oI2q3B1x wwCYrnVj3QN+D2gJYSRxT8ofiSkYD8J/qMwawq6ciCszISikJhlxzwAFnmr6D+Z3IB2F MOrLayOAYJzfUxBysfxc/aLCiXqc/jRBWiyvWvURGPYrPv36G+atA+WWIhcGhKSFKUq9 fniQ== 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=eZQOBtTOiht/0OTixgCTPb48WYjmKFlAenmS+UqHqNA=; b=KI06KBQzdoYCHK36lqtSijgycWqp+FNDR54YFB0MUythbz7Otm5V+3Z1MAm7b7ckL8 HBgy9hcoHY72XdGkiQMVK91q1yqDxyS1P72lzZ2XKmEz90hhnnmsTwFHzJCxOXIOwojX cBsKHQb81VVSit85rRm7KvJBzuOk1CKGUP3Bp8eHvVg8H9XFhzn+TQYvU8P2WBwWNVU5 4dImqnepkKIspZm/gZmdDw4LQMvdabqUCap+0EXpNCtgZfSigg9JON5BZ42nK9cc064x zcqCMpCt4rRBG9hXB7b+cadv1a6naEl4bm/M8xMPlwlJeZbLuhguMlJIwokykY/xPOvD ptAA== X-Gm-Message-State: AGi0PuaWqvZur7LePpld1P/ynkDNNcMp+fU5tlnA8/pGhv27N91mdihK AA8zSNpRHj9aVdRzpBrRLFUyuQ== X-Received: by 2002:a37:4b02:: with SMTP id y2mr8924162qka.178.1589087769424; Sat, 09 May 2020 22:16:09 -0700 (PDT) Received: from ovpn-112-80.rdu2.redhat.com (pool-71-184-117-43.bstnma.fios.verizon.net. [71.184.117.43]) by smtp.gmail.com with ESMTPSA id 127sm5215177qkj.59.2020.05.09.22.16.08 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 09 May 2020 22:16:08 -0700 (PDT) From: Qian Cai To: mpe@ellerman.id.au Cc: benh@kernel.crashing.org, paulus@samba.org, aik@ozlabs.ru, paulmck@kernel.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Qian Cai Subject: [PATCH] powerpc/mm/book3s64/iommu: fix some RCU-list locks Date: Sun, 10 May 2020 01:15:59 -0400 Message-Id: <20200510051559.1959-1-cai@lca.pw> X-Mailer: git-send-email 2.21.0 (Apple Git-122.2) 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 It is safe to traverse mm->context.iommu_group_mem_list with either mem_list_mutex or the RCU read lock held. Silence a few RCU-list false positive warnings and fix a few missing RCU read locks. arch/powerpc/mm/book3s64/iommu_api.c:330 RCU-list traversed in non-reader section!! other info that might help us debug this: rcu_scheduler_active = 2, debug_locks = 1 2 locks held by qemu-kvm/4305: #0: c000000bc3fe4d68 (&container->lock){+.+.}-{3:3}, at: tce_iommu_ioctl.part.9+0xc7c/0x1870 [vfio_iommu_spapr_tce] #1: c000000001501910 (mem_list_mutex){+.+.}-{3:3}, at: mm_iommu_get+0x50/0x190 ==== arch/powerpc/mm/book3s64/iommu_api.c:132 RCU-list traversed in non-reader section!! other info that might help us debug this: rcu_scheduler_active = 2, debug_locks = 1 2 locks held by qemu-kvm/4305: #0: c000000bc3fe4d68 (&container->lock){+.+.}-{3:3}, at: tce_iommu_ioctl.part.9+0xc7c/0x1870 [vfio_iommu_spapr_tce] #1: c000000001501910 (mem_list_mutex){+.+.}-{3:3}, at: mm_iommu_do_alloc+0x120/0x5f0 ==== arch/powerpc/mm/book3s64/iommu_api.c:292 RCU-list traversed in non-reader section!! other info that might help us debug this: rcu_scheduler_active = 2, debug_locks = 1 2 locks held by qemu-kvm/4312: #0: c000000ecafe23c8 (&vcpu->mutex){+.+.}-{3:3}, at: kvm_vcpu_ioctl+0xdc/0x950 [kvm] #1: c000000045e6c468 (&kvm->srcu){....}-{0:0}, at: kvmppc_h_put_tce+0x88/0x340 [kvm] ==== arch/powerpc/mm/book3s64/iommu_api.c:424 RCU-list traversed in non-reader section!! other info that might help us debug this: rcu_scheduler_active = 2, debug_locks = 1 2 locks held by qemu-kvm/4312: #0: c000000ecafe23c8 (&vcpu->mutex){+.+.}-{3:3}, at: kvm_vcpu_ioctl+0xdc/0x950 [kvm] #1: c000000045e6c468 (&kvm->srcu){....}-{0:0}, at: kvmppc_h_put_tce+0x88/0x340 [kvm] Signed-off-by: Qian Cai --- arch/powerpc/mm/book3s64/iommu_api.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/mm/book3s64/iommu_api.c b/arch/powerpc/mm/book3s64/iommu_api.c index fa05bbd1f682..bf0108b6f445 100644 --- a/arch/powerpc/mm/book3s64/iommu_api.c +++ b/arch/powerpc/mm/book3s64/iommu_api.c @@ -129,7 +129,8 @@ static long mm_iommu_do_alloc(struct mm_struct *mm, unsigned long ua, mutex_lock(&mem_list_mutex); - list_for_each_entry_rcu(mem2, &mm->context.iommu_group_mem_list, next) { + list_for_each_entry_rcu(mem2, &mm->context.iommu_group_mem_list, next, + lockdep_is_held(&mem_list_mutex)) { /* Overlap? */ if ((mem2->ua < (ua + (entries << PAGE_SHIFT))) && (ua < (mem2->ua + @@ -289,6 +290,7 @@ struct mm_iommu_table_group_mem_t *mm_iommu_lookup(struct mm_struct *mm, { struct mm_iommu_table_group_mem_t *mem, *ret = NULL; + rcu_read_lock(); list_for_each_entry_rcu(mem, &mm->context.iommu_group_mem_list, next) { if ((mem->ua <= ua) && (ua + size <= mem->ua + @@ -297,6 +299,7 @@ struct mm_iommu_table_group_mem_t *mm_iommu_lookup(struct mm_struct *mm, break; } } + rcu_read_unlock(); return ret; } @@ -327,7 +330,8 @@ struct mm_iommu_table_group_mem_t *mm_iommu_get(struct mm_struct *mm, mutex_lock(&mem_list_mutex); - list_for_each_entry_rcu(mem, &mm->context.iommu_group_mem_list, next) { + list_for_each_entry_rcu(mem, &mm->context.iommu_group_mem_list, next, + lockdep_is_held(&mem_list_mutex)) { if ((mem->ua == ua) && (mem->entries == entries)) { ret = mem; ++mem->used; @@ -421,6 +425,7 @@ bool mm_iommu_is_devmem(struct mm_struct *mm, unsigned long hpa, struct mm_iommu_table_group_mem_t *mem; unsigned long end; + rcu_read_lock(); list_for_each_entry_rcu(mem, &mm->context.iommu_group_mem_list, next) { if (mem->dev_hpa == MM_IOMMU_TABLE_INVALID_HPA) continue; @@ -437,6 +442,7 @@ bool mm_iommu_is_devmem(struct mm_struct *mm, unsigned long hpa, return true; } } + rcu_read_unlock(); return false; } -- 2.21.0 (Apple Git-122.2)