Received: by 2002:ac0:8845:0:0:0:0:0 with SMTP id g63csp403655img; Tue, 26 Feb 2019 02:05:31 -0800 (PST) X-Google-Smtp-Source: AHgI3IYAsaOkNnMB+wweXX8C+l2SJ5Wi18RF9TN41hzTxjrE6AC4ozqj2sqL+nHl8ayIU3AP06+M X-Received: by 2002:a17:902:e90b:: with SMTP id cs11mr24703266plb.197.1551175531383; Tue, 26 Feb 2019 02:05:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551175531; cv=none; d=google.com; s=arc-20160816; b=buVrSGhSUVe463N+B0+z5wsp0gB4uybNCdgXBFakWSulve8UKelUqZ99zXLTQ/Zqgk 5LsGlO0HdAMLm1QSzmDJuItYga/6LCbxCUReiGZ0fCBIjPq/MgrZJ6eH+o8OTzVs0ZQg 2TCnPLtMPZuwXzqflT12WWKDuCsxYn6+WZuaxXZKcnV8K+cmlpf/sapXYw+7dXZXfwI1 DCBzmmcz2woFggJMQ23MGkHTsfM/UiT6KKtnw9C7/Kma55Ho7HjIWIX+lARA4tPKOK8U UqH9o1w4lwI6u4cFCtpOx3ukqtDFH+O5V811NgN5OU9qQZ9mzr4ALdqTgcsgwFohq4gZ 4CrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=n+jUDdI2PpKwpVRi6ruVp/981RSiWdh1cpdFbLlcUpk=; b=SbgDrkKoch3RxmsbaFKs0MvmXlpNQSD3MPlcXsEeDouHh8g01yPdyhkStY8SipM7tu FQeSBVd9rxkPNz5Skr1rMOBVRDC4iSph5eeKNX1MWY8GMfk1dzI1AerlngH31b0cT9JR KNCN9TBjL0JoErGBz67wnQzpUs16m1a3KNmYWRSX3Y6ESuNPRcIMoFbc1rkMM3jLye4w 2XV0SWQBgs5bfwHRuhEqLTEretI7jSnsC0KR/S0F6At/l3JPTiah0JC7JvVAjuni/dxi ynHi1OvXY7Li+ea0SIetAAW4m/1qknaDdaQYOwjECvF5iYukGAUtlc/Olf4kCfJn9kbo wpkw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=qOR8TDW7; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h22si11423443pgv.198.2019.02.26.02.05.16; Tue, 26 Feb 2019 02:05:31 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=qOR8TDW7; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727975AbfBZKDn (ORCPT + 99 others); Tue, 26 Feb 2019 05:03:43 -0500 Received: from mail-pf1-f193.google.com ([209.85.210.193]:43087 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727813AbfBZKDm (ORCPT ); Tue, 26 Feb 2019 05:03:42 -0500 Received: by mail-pf1-f193.google.com with SMTP id q17so5991648pfh.10 for ; Tue, 26 Feb 2019 02:03:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=n+jUDdI2PpKwpVRi6ruVp/981RSiWdh1cpdFbLlcUpk=; b=qOR8TDW77OYZA/VuM5grouRb4TSg2OQQuC7xQdm13KF1CIOyNoAvgdH3NWrWYs4taQ /6FUk/cLD+SeuUz/L69gg3QUjY8W5Z8ln65ymJNaHM2ZyOJx+n28mOekxCn9CJVUOHPg 80ndxiLaFPAVxIttc6BUs8yVMASP1KIs0TsENXlnXtDdpUJc6VL4R4gx6i0kzXU16zLn pbyV/D0VCRNtXo9QiGjX/0c5BMuMZPxah2BS1SuuPWJGt3Y4JJPzc5Fiux2hd2cd9OFr 2sK8SzlWwfv/GoWCpZwhB3LrnEFPRpGjUHFNQGEfgxe/+cmeKhQOgqgBhCeOAHz/O+By yLdw== 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:in-reply-to :references; bh=n+jUDdI2PpKwpVRi6ruVp/981RSiWdh1cpdFbLlcUpk=; b=rJty7BZM10PWh3mOoY0pDIm6AipgJzaTHmT3q6zHZO+IuPkaXFNxZjMkhLYuxQyCbq bF6u2D9XEyfYZXjI08CLP+UTWqaucej3YUP3drNbEGTUbGJRRkBzTSfRs9bLMGIUipBi aAkrgG9jOv3StZnwChNtT0UmX12ZxbLTT7k1nBvcEGdwH5imcoSQAs2gvWZphQa2A6/p K0dZxK/DxvTfW9hs73CAxjvtoB3NrVdJBwJco9wEFeUpRjnPE6Pytg55CTl/8RNney0I KShPV5FQwBZHj3pJc696jNORENYruG8ozgeU49w1q2BC1FOUx/K0tvaVC+PIbogPlQPS MEMA== X-Gm-Message-State: AHQUAuaewuHZYpQ9HcxmGqK8T4FEreN7gTNZYWdIqF6BtGN/Zr0reX7E CZJGvB5jCSU3ilUgzhVqUnU= X-Received: by 2002:a62:6702:: with SMTP id b2mr24856732pfc.244.1551175421819; Tue, 26 Feb 2019 02:03:41 -0800 (PST) Received: from localhost.localdomain ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id y6sm12045520pfy.87.2019.02.26.02.03.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Feb 2019 02:03:41 -0800 (PST) From: Yuyang Du To: peterz@infradead.org, mingo@kernel.org Cc: linux-kernel@vger.kernel.org, Yuyang Du Subject: [PATCH 2/8] locking/lockdep: Add description and explanation in lockdep design doc Date: Tue, 26 Feb 2019 18:03:21 +0800 Message-Id: <20190226100327.19340-3-duyuyang@gmail.com> X-Mailer: git-send-email 2.17.2 (Apple Git-113) In-Reply-To: <20190226100327.19340-1-duyuyang@gmail.com> References: <20190226100327.19340-1-duyuyang@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org More words are added to lockdep design document regarding the key concepts, which can help to understand the design as well as to read the reports. Signed-off-by: Yuyang Du --- Documentation/locking/lockdep-design.txt | 89 +++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 25 deletions(-) diff --git a/Documentation/locking/lockdep-design.txt b/Documentation/locking/lockdep-design.txt index 49f58a0..621d8f4 100644 --- a/Documentation/locking/lockdep-design.txt +++ b/Documentation/locking/lockdep-design.txt @@ -10,56 +10,95 @@ Lock-class The basic object the validator operates upon is a 'class' of locks. A class of locks is a group of locks that are logically the same with -respect to locking rules, even if the locks may have multiple (possibly -tens of thousands of) instantiations. For example a lock in the inode -struct is one class, while each inode has its own instantiation of that -lock class. - -The validator tracks the 'state' of lock-classes, and it tracks -dependencies between different lock-classes. The validator maintains a -rolling proof that the state and the dependencies are correct. - -Unlike an lock instantiation, the lock-class itself never goes away: when -a lock-class is used for the first time after bootup it gets registered, -and all subsequent uses of that lock-class will be attached to this -lock-class. +respect to locking rules, even if the locks may have multiple (possibly tens +of thousands of) instantiations. For example a lock in the inode struct is +one class, while each inode has its own instantiation of that lock class. + +The validator tracks the 'usage state' of lock-classes, and it tracks the +dependencies between different lock-classes. The dependency can be +understood as lock order, where L1 -> L2 suggests L1 depends on L2, which +can also be expressed as a forward dependency (L1 -> L2) or a backward +dependency (L2 <- L1). From lockdep's perspective, the two locks (L1 and L2) +are not necessarily related as opposed to in some modules an order must be +followed. Here it just means that order ever happened. The validator +maintains a continuing effort to prove that the lock usages and their +dependencies are correct or the validator will shoot a splat if they are +potentially incorrect. + +Unlike a lock instance, a lock-class itself never goes away: when a +lock-class's instance is used for the first time after bootup the class gets +registered, and all (subsequent) instances of that lock-class will be mapped +to the lock-class. State ----- -The validator tracks lock-class usage history into 4 * nSTATEs + 1 separate -state bits: +The validator tracks lock-class usage history and divides the usage into +(4 usages * n STATEs + 1) categories: +Where the 4 usages can be: - 'ever held in STATE context' - 'ever held as readlock in STATE context' - 'ever held with STATE enabled' - 'ever held as readlock with STATE enabled' -Where STATE can be either one of (kernel/locking/lockdep_states.h) - - hardirq - - softirq +Where the n STATEs are coded in kernel/locking/lockdep_states.h and as of +now they include: +- hardirq +- softirq +Where the last 1 category is: - 'ever used' [ == !unused ] -When locking rules are violated, these state bits are presented in the -locking error messages, inside curlies. A contrived example: +When locking rules are violated, these usage bits are presented in the +locking error messages, inside curlies, with a total of 2 * n STATEs bits. +See a contrived example: modprobe/2287 is trying to acquire lock: - (&sio_locks[i].lock){-.-...}, at: [] mutex_lock+0x21/0x24 + (&sio_locks[i].lock){-.-.}, at: [] mutex_lock+0x21/0x24 but task is already holding lock: - (&sio_locks[i].lock){-.-...}, at: [] mutex_lock+0x21/0x24 + (&sio_locks[i].lock){-.-.}, at: [] mutex_lock+0x21/0x24 -The bit position indicates STATE, STATE-read, for each of the states listed -above, and the character displayed in each indicates: +For a given lock, the bit positions from left to right indicate the usage +of the lock and readlock (if exists), for each of the n STATEs listed +above respectively, and the character displayed at each bit position +indicates: '.' acquired while irqs disabled and not in irq context '-' acquired in irq context '+' acquired with irqs enabled '?' acquired in irq context with irqs enabled. -Unused mutexes cannot be part of the cause of an error. +The bits are illustrated with an example: + + (&sio_locks[i].lock){-.-.}, at: [] mutex_lock+0x21/0x24 + |||| + ||| \-> softirq disabled and not in softirq context + || \--> acquired in softirq context + | \---> hardirq disabled and not in hardirq context + \----> acquired in hardirq context + + +For a given STATE, whether the lock is ever acquired in that STATE context +and whether that STATE is enabled yields four possible cases as shown in the +table below. It is worth noting that the bit character is able to indicate +which exact case is for the lock as of the reporting time. + + ------------------------------------------------- + | | enabled in irq | disabled in irq | + ------------------------------------------------- + | ever in irq | ? | - | + ------------------------------------------------- + | never in irq | + | . | + ------------------------------------------------- + +The character '-' suggests irq is disabled because if otherwise, the +charactor '?' would have been shown instead. Similar deduction can be +applied for '+' too. + +Unused locks (e.g., mutexes) cannot be part of the cause of an error. Single-lock state rules: -- 1.8.3.1