From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936581AbdIYWTD (ORCPT ); Mon, 25 Sep 2017 18:19:03 -0400 Received: from mail-pg0-f67.google.com ([74.125.83.67]:37081 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936031AbdIYWTB (ORCPT ); Mon, 25 Sep 2017 18:19:01 -0400 X-Google-Smtp-Source: AOwi7QCK5SF00P9TYWUygakCX3dOc2nvZ2GIqBKgqpCPRSsXFwPidiiNe90Q3tAfd11E1TxXvIZjbg== From: Boqun Feng To: linux-kernel@vger.kernel.org Cc: Ingo Molnar , Peter Zijlstra , Gautham R Shenoy , Byungchul Park , Boqun Feng Subject: [RFC tip/locking/lockdep v3 07/14] lockdep: Adjust check_redundant() for recursive read change Date: Tue, 26 Sep 2017 06:18:41 +0800 Message-Id: <20170925221848.6646-8-boqun.feng@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20170925221848.6646-1-boqun.feng@gmail.com> References: <20170925221848.6646-1-boqun.feng@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As we have four kinds of dependencies now, check_redundant() should only report redundant if we have a dependency path which is equal or _stronger_ than the current dependency. For example if in check_prev_add() we have: prev->read == 2 && next->read != 2 , we should only report redundant if we find a path like: prev--(RN)-->....--(*N)-->next and if we have: prev->read == 2 && next->read == 2 , we could report redundant if we find a path like: prev--(RN)-->....--(*N)-->next or prev--(RN)-->....--(*R)-->next To do so, we need to pass the recursive-read status of @next into check_redundant(). This patch changes the parameter of check_redundant() and the match function to achieve this. Signed-off-by: Boqun Feng --- kernel/locking/lockdep.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index a68f7df8adc5..f55c9012025e 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -1337,9 +1337,12 @@ print_circular_bug_header(struct lock_list *entry, unsigned int depth, return 0; } -static inline int class_equal(struct lock_list *entry, void *data) +static inline int hlock_equal(struct lock_list *entry, void *data) { - return entry->class == data; + struct held_lock *hlock = (struct held_lock *)data; + + return hlock_class(hlock) == entry->class && + (hlock->read == 2 || !entry->is_rr); } static inline int hlock_conflict(struct lock_list *entry, void *data) @@ -1481,14 +1484,14 @@ check_noncircular(struct lock_list *root, struct held_lock *target, } static noinline enum bfs_result -check_redundant(struct lock_list *root, struct lock_class *target, +check_redundant(struct lock_list *root, struct held_lock *target, struct lock_list **target_entry) { enum bfs_result result; debug_atomic_inc(nr_redundant_checks); - result = __bfs_forwards(root, target, class_equal, target_entry); + result = __bfs_forwards(root, target, hlock_equal, target_entry); return result; } @@ -2055,7 +2058,7 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev, * Is the -> link redundant? */ bfs_init_root(&this, prev); - ret = check_redundant(&this, hlock_class(next), &target_entry); + ret = check_redundant(&this, next, &target_entry); if (ret == BFS_RMATCH) { debug_atomic_inc(nr_redundant); return 2; -- 2.14.1