From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9FB38C3ABC9 for ; Tue, 13 May 2025 10:08:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5AAF26B0092; Tue, 13 May 2025 06:07:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5138B6B0096; Tue, 13 May 2025 06:07:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1BDE66B0092; Tue, 13 May 2025 06:07:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id E3E2C6B0093 for ; Tue, 13 May 2025 06:07:51 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 50D80BA042 for ; Tue, 13 May 2025 10:07:53 +0000 (UTC) X-FDA: 83437458426.10.FE97E06 Received: from invmail4.hynix.com (exvmail4.hynix.com [166.125.252.92]) by imf03.hostedemail.com (Postfix) with ESMTP id 3D08A20004 for ; Tue, 13 May 2025 10:07:50 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf03.hostedemail.com: domain of byungchul@sk.com designates 166.125.252.92 as permitted sender) smtp.mailfrom=byungchul@sk.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747130871; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:in-reply-to: references:references; bh=eI0wxQs8Av/Gt2blExvC2kSpc/XGmn5hVx3MnxkoZZA=; b=c8i93H8P9zG8JVnIiwtpXCYvNkY7ndp/sJi9LcnqyXORY/UwG0qaYv7hJsKtg+n5d72MBx il7mDperqB0R9ykw019oWNMcKDfDxzqCk9E5mxABzrVsSuH7oN8l1fxVa6/10YFlhp8xZS mrE9IBe0E8VL0g+x0VWoFWl8UwbdVpg= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747130871; a=rsa-sha256; cv=none; b=Yt7Vtio2rp6OTrcF+hAfkN3kZuY5XilpthbO5gT46GPQ7md2SC7PTRl1Su2bg4dG1iAL71 lXhL6bctbvRQFN0azPmMSkjUc6SZuQXj5cUMhQ/mB4zBQhctNwQSYJ6LCvfa2qpcaDj1Fx 4YlsZcfdGHilT9RKeqsOGaa3AmNK9ds= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf03.hostedemail.com: domain of byungchul@sk.com designates 166.125.252.92 as permitted sender) smtp.mailfrom=byungchul@sk.com X-AuditID: a67dfc5b-669ff7000002311f-2a-682319ee2b9f From: Byungchul Park To: linux-kernel@vger.kernel.org Cc: kernel_team@skhynix.com, torvalds@linux-foundation.org, damien.lemoal@opensource.wdc.com, linux-ide@vger.kernel.org, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, will@kernel.org, tglx@linutronix.de, rostedt@goodmis.org, joel@joelfernandes.org, sashal@kernel.org, daniel.vetter@ffwll.ch, duyuyang@gmail.com, johannes.berg@intel.com, tj@kernel.org, tytso@mit.edu, willy@infradead.org, david@fromorbit.com, amir73il@gmail.com, gregkh@linuxfoundation.org, kernel-team@lge.com, linux-mm@kvack.org, akpm@linux-foundation.org, mhocko@kernel.org, minchan@kernel.org, hannes@cmpxchg.org, vdavydov.dev@gmail.com, sj@kernel.org, jglisse@redhat.com, dennis@kernel.org, cl@linux.com, penberg@kernel.org, rientjes@google.com, vbabka@suse.cz, ngupta@vflare.org, linux-block@vger.kernel.org, josef@toxicpanda.com, linux-fsdevel@vger.kernel.org, jack@suse.cz, jlayton@kernel.org, dan.j.williams@intel.com, hch@infradead.org, djwong@kernel.org, dri-devel@lists.freedesktop.org, rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, hamohammed.sa@gmail.com, harry.yoo@oracle.com, chris.p.wilson@intel.com, gwan-gyeong.mun@intel.com, max.byungchul.park@gmail.com, boqun.feng@gmail.com, longman@redhat.com, yskelg@gmail.com, yunseong.kim@ericsson.com, yeoreum.yun@arm.com, netdev@vger.kernel.org, matthew.brost@intel.com, her0gyugyu@gmail.com Subject: [PATCH v15 07/43] dept: distinguish each kernel context from another Date: Tue, 13 May 2025 19:06:54 +0900 Message-Id: <20250513100730.12664-8-byungchul@sk.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20250513100730.12664-1-byungchul@sk.com> References: <20250513100730.12664-1-byungchul@sk.com> X-Brightmail-Tracker: H4sIAAAAAAAAAzWSa0wTaRSG+b6Z+WZarZnU24hGsWowGi81ao6Ju9FE13GjidEYjfzQRia2 EYppFcVbqCBhixAWUnC9VpBSoSgWoyhWK2gRjIiIXAxUQaMQbsraIhfRUuOfkyfve973/Dkc paxkQjmd/qBk0GuiVEROy3vG5yzqnTZHuzStYj74vibTcOGGg0Dt9UIEjlsmDJ1PNkCjvxvB 8PMXFGRbahFcaWul4JbHi8BlP0Xg1YcJUO/rI1BlSSGQkHuDwMuuEQwtWRkYCp2b4a3tIw3P 0nMwZHcSOJ+dgAOjA8OgrYAFW/w8aLefY2GkTQ1V3gYGXG8Wwn+XWgjcd1XR4Cltx/Dq3gUC XscPBp55ntLgT5sOtf+mMlDUm0Ogy2+jwObrY6HObcXgsU6B4sRAYdL/owxUproxJF29iaG+ uQzBg+R3GJyOBgIVvm4MJU4LBUP5TxC0p/WwcPrMIAvnTWkIUk5n0ZDYsgKGvwUuX/yqBtPl YhqKvjegNX+IjksOJFZ091FiYslhccj3moguv5UWq3ME8e65VlZMfPCGFa3OQ2KJfYGYe78T i1f6fYzoLPiHiM7+DFY099Rjsbemht0yY5d8daQUpYuVDEv+3CPX5rpH8YG6HUcyBxJwPDq7 3ow4TuCXC64iMCNZEFvf2+kxJny40NQ0SI3xJD5MKEn9yJiRnKP4hnFC48VmNGZM5DcLeW3V wQDNzxPMmT1BVvArBNe1LPpX6SyhsNgdLJLxK4Xv+TVBXRnYSbcW0mOlAp8tE5yVzeRXYJrw yN5EpyOFFYUUIKVOHxut0UUtX6yN0+uOLN4bE+1EgfeynRiJKEX9tdvKEc8h1XjF087ZWiWj iTXGRZcjgaNUkxSmOwFJEamJOyoZYnYbDkVJxnI0naNVUxXL/Icjlfw+zUFpvyQdkAy/XczJ QuPR1dIImXpto3a9ZebGnV9e5x872V5VOjkjb1zYptH6mKQ8t+PshpQIj8Vr6BraWgcDZRtn 7T/e+35X9aBXpp27qvzx2vCHA4tuI9W2b2vK4oyf1cN/7Qwpq57LTNyecDOXPN+yqmN7zBJ/ yN+Z4Z51c2aE1bX6R1qSyaZPHaEWOklvUtFGrUa9gDIYNT8BgHO97loDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAAzWSe0hTYRjG/b5zzne22eJkVicrs0VUdpUyXiiioPBUFhVBEJIOPbXhNNnM NAi0LS1L0UTtojUvTdNZcwpZOREl80JmadZCLe1CIy9Um2XNahr98/Ljed73ef55JZRPBeMn UcfGi9pYpUZBZLRs32b9mtH5S1Xrc9Nmgst5noaCu2YCXXcqEZhrUzA4HoXAy/FhBL+ePKUg P7cLQdFgPwW1LQMIbOVnCXS/nwk9rjECbbkXCehL7hJ49tmNoS/vMoZK6154Y/pIQ0dWMYZ8 B4Hr+XrsGZ8wTJgqWDAlL4Oh8mssuAeDoG2gl4HmwjYGbK9XwdUbfQTqbW00tNQNYeh+UEBg wPyHgY6WVhrGMxdAV3YGA1WjxQQ+j5soMLnGWHjeaMTQYpwLFoMnNfXbbwYeZzRiSC2txtBj f4ig4fxbDFZzL4Fm1zCGGmsuBT/LHiEYyhxh4dylCRaup2QiuHgujwZDXzD8+uFpLnQGQcpN Cw1Vk71o21bBfMOMhObhMUow1JwSfrpeEME2bqSF9mJeuH+tnxUMDa9ZwWg9KdSUBwol9Q4s FH11MYK14gIRrF8vs0L6SA8WRjs72f2Ljsi2RIkadYKoXbc1QqYqafyN454fTsz5rsfJ6MrO dCSV8NxGvv9dOT3FhFvOv3o1QU2xLxfA12R8ZNKRTEJxvd78y0I7mjJmc3v5W4Pt0wc0t4xP zxmZZjkXzNtu59H/QhfzlZbG6SApt4mfLOuc1n08O1nGSjoLyYzIqwL5qmMTYpRqTfBaXbQq KVaduDbyRIwVeT7IdMadXYec3SFNiJMgxQx5q2OJyodRJuiSYpoQL6EUvvKUex5JHqVMOi1q T4RrT2pEXRNaIKEV8+S7D4sRPtxxZbwYLYpxova/iyVSv2R0XDrLf56yqkPXcTXCKzvA5jzg VZS65dscVbX4peGYY2Noon2yKZQsz97z5cPSBLt9x5FVOW7TSuf67er4FeFPH8d17ltoCdtz +2D4iNNgSUrTju4ivrXuwrAZUmqDpq756OpWx6JoQ9rO+OH6dv0T73t+3m5y4VBgqUYaWTIW 56+gdSplUCCl1Sn/AoqGLeo9AwAA X-CFilter-Loop: Reflected X-Stat-Signature: 49g7ctr171qdcggccfcogscny7bxp1px X-Rspam-User: X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 3D08A20004 X-HE-Tag: 1747130870-576270 X-HE-Meta: U2FsdGVkX1/t5DIrQq+MNZLoTNgIpVFr7h4YED6zc98hIGhqXMZy4lZMqyLj3f7hXbya/PnQP/XKsJVr0D1BGTg9dRThmE92jBygBb2qsBHuyXa6SBkpdmANsZGREC7/BKIWTCsqHBMzuYF8UwLc95QUkLP20T/xsw+ULrh35kC2K2uHBnaDu/ofew130qs6fX/CfqN7A0a4HhSaGg2NQm0bmlm43uyfqSod2KYoAo1DDadmzMXCfarvFrhiWw+j0kHBM808ZZ+2y7wtgaSp8fEwiRQudKLgv25FQZob/KE3iRQRHLfF2D3aIO7RBuxXsg/8Y68G+YuAgjKGNr+QqHeukVMjrBHlufMIASSezo9Ykfkzr0Sr0+1wKgd/VB/kJfplZlyvPz56xT6GfCmmWWt4HEI4VaO+9p7//nKBVnlbN7LAvnNfqajoMZqGQfsYdDh8RhZMvkeVuHlQPdvbn6A3h1WZg6dU84rLBaAwTRMf9LpBnsxslYyYZUPfBI3uTcwPUzri/gczH8WUv9w6AxFzOy/zekMIRzhRQY8xHeqEGWfGBVC4ue9whV9BVxaWT9F2tWwrxub4nMeilAFnt6GAhgr0Tt7XOEYbnJR9sYK/6m3ye3CG8efJq21za1PXBG9Ya0v6n85yR1DSfPh42WGehUq8X6Dt1eT7oyRpUxZ2GAnbWwPQLVR9TB9O/pKm3dsd5zPAT686NQvjb3KmbofqDlOf3ywwvx3iBIrKzFJ8yuXlyDzfzR3Jj45gr0tFPOpzYdjwAH8m8mftYteDwy6MjDOXrLMS/7eaBiuU+vLKOhLSrUip8fAqZaQZq8o/Oe9m2Blj0OjSqyszYxnHXXvL3YwmH1gRZUZ0WAcCrnFHy6Syoi13yNsofJf/p0nhINuCIjVEWRaS4oFNDrhbJ/Q6pIYKcFPInC/Mkte749dGP+kIKW4nsAyhQIOGlOT9EkcnMRTCp5kKZakC5cO TSFtD7Vb wnFXzskAxPZ2X96vAoDts9YRzCom0ePHpVFI3PNv9zMYhILxcm1MLQC8bOw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Each unique kernel context, in dept's point of view, should be identified on every entrance to kernel mode e.g. system call or user oriented fault. Otherwise, dept may track meaningless dependencies across different kernel context. Plus, in order to update kernel context id at the very beginning of each entrance, arch code support is required, that could be configured by CONFIG_ARCH_HAS_DEPT_SUPPORT. Signed-off-by: Byungchul Park --- include/linux/dept.h | 29 ++++++++++------- include/linux/sched.h | 10 +++--- kernel/dependency/dept.c | 67 ++++++++++++++++++++-------------------- lib/Kconfig.debug | 5 ++- 4 files changed, 61 insertions(+), 50 deletions(-) diff --git a/include/linux/dept.h b/include/linux/dept.h index dc50fa9d388b..138106869494 100644 --- a/include/linux/dept.h +++ b/include/linux/dept.h @@ -25,11 +25,16 @@ struct task_struct; #define DEPT_MAX_SUBCLASSES_USR (DEPT_MAX_SUBCLASSES / DEPT_MAX_SUBCLASSES_EVT) #define DEPT_MAX_SUBCLASSES_CACHE 2 -#define DEPT_SIRQ 0 -#define DEPT_HIRQ 1 -#define DEPT_IRQS_NR 2 -#define DEPT_SIRQF (1UL << DEPT_SIRQ) -#define DEPT_HIRQF (1UL << DEPT_HIRQ) +enum { + DEPT_CXT_SIRQ = 0, + DEPT_CXT_HIRQ, + DEPT_CXT_IRQS_NR, + DEPT_CXT_PROCESS = DEPT_CXT_IRQS_NR, + DEPT_CXTS_NR +}; + +#define DEPT_SIRQF (1UL << DEPT_CXT_SIRQ) +#define DEPT_HIRQF (1UL << DEPT_CXT_HIRQ) struct dept_ecxt; struct dept_iecxt { @@ -94,8 +99,8 @@ struct dept_class { /* * for tracking IRQ dependencies */ - struct dept_iecxt iecxt[DEPT_IRQS_NR]; - struct dept_iwait iwait[DEPT_IRQS_NR]; + struct dept_iecxt iecxt[DEPT_CXT_IRQS_NR]; + struct dept_iwait iwait[DEPT_CXT_IRQS_NR]; /* * classified by a map embedded in task_struct, @@ -207,8 +212,8 @@ struct dept_ecxt { /* * where the IRQ-enabled happened */ - unsigned long enirq_ip[DEPT_IRQS_NR]; - struct dept_stack *enirq_stack[DEPT_IRQS_NR]; + unsigned long enirq_ip[DEPT_CXT_IRQS_NR]; + struct dept_stack *enirq_stack[DEPT_CXT_IRQS_NR]; /* * where the event context started @@ -252,8 +257,8 @@ struct dept_wait { /* * where the IRQ wait happened */ - unsigned long irq_ip[DEPT_IRQS_NR]; - struct dept_stack *irq_stack[DEPT_IRQS_NR]; + unsigned long irq_ip[DEPT_CXT_IRQS_NR]; + struct dept_stack *irq_stack[DEPT_CXT_IRQS_NR]; /* * where the wait happened @@ -383,6 +388,7 @@ extern void dept_event(struct dept_map *m, unsigned long e_f, unsigned long ip, extern void dept_ecxt_exit(struct dept_map *m, unsigned long e_f, unsigned long ip); extern void dept_sched_enter(void); extern void dept_sched_exit(void); +extern void dept_update_cxt(void); static inline void dept_ecxt_enter_nokeep(struct dept_map *m) { @@ -430,6 +436,7 @@ struct dept_map { }; #define dept_ecxt_exit(m, e_f, ip) do { } while (0) #define dept_sched_enter() do { } while (0) #define dept_sched_exit() do { } while (0) +#define dept_update_cxt() do { } while (0) #define dept_ecxt_enter_nokeep(m) do { } while (0) #define dept_key_init(k) do { (void)(k); } while (0) #define dept_key_destroy(k) do { (void)(k); } while (0) diff --git a/include/linux/sched.h b/include/linux/sched.h index a1924b40feb5..802fca4d99b3 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -827,19 +827,19 @@ struct dept_task { int wait_hist_pos; /* - * sequential id to identify each IRQ context + * sequential id to identify each context */ - unsigned int irq_id[DEPT_IRQS_NR]; + unsigned int cxt_id[DEPT_CXTS_NR]; /* * for tracking IRQ-enabled points with cross-event */ - unsigned int wgen_enirq[DEPT_IRQS_NR]; + unsigned int wgen_enirq[DEPT_CXT_IRQS_NR]; /* * for keeping up-to-date IRQ-enabled points */ - unsigned long enirq_ip[DEPT_IRQS_NR]; + unsigned long enirq_ip[DEPT_CXT_IRQS_NR]; /* * for reserving a current stack instance at each operation @@ -893,7 +893,7 @@ struct dept_task { .wait_hist = { { .wait = NULL, } }, \ .ecxt_held_pos = 0, \ .wait_hist_pos = 0, \ - .irq_id = { 0U }, \ + .cxt_id = { 0U }, \ .wgen_enirq = { 0U }, \ .enirq_ip = { 0UL }, \ .stack = NULL, \ diff --git a/kernel/dependency/dept.c b/kernel/dependency/dept.c index 882f29a93483..a936a8d831c5 100644 --- a/kernel/dependency/dept.c +++ b/kernel/dependency/dept.c @@ -229,9 +229,9 @@ static struct dept_class *dep_tc(struct dept_dep *d) static const char *irq_str(int irq) { - if (irq == DEPT_SIRQ) + if (irq == DEPT_CXT_SIRQ) return "softirq"; - if (irq == DEPT_HIRQ) + if (irq == DEPT_CXT_HIRQ) return "hardirq"; return "(unknown)"; } @@ -409,7 +409,7 @@ static void initialize_class(struct dept_class *c) { int i; - for (i = 0; i < DEPT_IRQS_NR; i++) { + for (i = 0; i < DEPT_CXT_IRQS_NR; i++) { struct dept_iecxt *ie = &c->iecxt[i]; struct dept_iwait *iw = &c->iwait[i]; @@ -435,7 +435,7 @@ static void initialize_ecxt(struct dept_ecxt *e) { int i; - for (i = 0; i < DEPT_IRQS_NR; i++) { + for (i = 0; i < DEPT_CXT_IRQS_NR; i++) { e->enirq_stack[i] = NULL; e->enirq_ip[i] = 0UL; } @@ -451,7 +451,7 @@ static void initialize_wait(struct dept_wait *w) { int i; - for (i = 0; i < DEPT_IRQS_NR; i++) { + for (i = 0; i < DEPT_CXT_IRQS_NR; i++) { w->irq_stack[i] = NULL; w->irq_ip[i] = 0UL; } @@ -490,7 +490,7 @@ static void destroy_ecxt(struct dept_ecxt *e) { int i; - for (i = 0; i < DEPT_IRQS_NR; i++) + for (i = 0; i < DEPT_CXT_IRQS_NR; i++) if (e->enirq_stack[i]) put_stack(e->enirq_stack[i]); if (e->class) @@ -506,7 +506,7 @@ static void destroy_wait(struct dept_wait *w) { int i; - for (i = 0; i < DEPT_IRQS_NR; i++) + for (i = 0; i < DEPT_CXT_IRQS_NR; i++) if (w->irq_stack[i]) put_stack(w->irq_stack[i]); if (w->class) @@ -664,7 +664,7 @@ static void print_diagram(struct dept_dep *d) const char *tc_n = tc->sched_map ? "" : (tc->name ?: "(unknown)"); irqf = e->enirqf & w->irqf; - for_each_set_bit(irq, &irqf, DEPT_IRQS_NR) { + for_each_set_bit(irq, &irqf, DEPT_CXT_IRQS_NR) { if (!firstline) pr_warn("\nor\n\n"); firstline = false; @@ -697,7 +697,7 @@ static void print_dep(struct dept_dep *d) const char *tc_n = tc->sched_map ? "" : (tc->name ?: "(unknown)"); irqf = e->enirqf & w->irqf; - for_each_set_bit(irq, &irqf, DEPT_IRQS_NR) { + for_each_set_bit(irq, &irqf, DEPT_CXT_IRQS_NR) { pr_warn("%s has been enabled:\n", irq_str(irq)); print_ip_stack(e->enirq_ip[irq], e->enirq_stack[irq]); pr_warn("\n"); @@ -865,7 +865,7 @@ static void bfs(void *root, struct bfs_ops *ops, void *in, void **out) */ static unsigned long cur_enirqf(void); -static int cur_irq(void); +static int cur_cxt(void); static unsigned int cur_ctxt_id(void); static struct dept_iecxt *iecxt(struct dept_class *c, int irq) @@ -1442,7 +1442,7 @@ static void add_dep(struct dept_ecxt *e, struct dept_wait *w) if (d) { check_dl_bfs(d); - for (i = 0; i < DEPT_IRQS_NR; i++) { + for (i = 0; i < DEPT_CXT_IRQS_NR; i++) { struct dept_iwait *fiw = iwait(fc, i); struct dept_iecxt *found_ie; struct dept_iwait *found_iw; @@ -1486,7 +1486,7 @@ static void add_wait(struct dept_class *c, unsigned long ip, struct dept_task *dt = dept_task(); struct dept_wait *w; unsigned int wg; - int irq; + int cxt; int i; if (DEPT_WARN_ON(!valid_class(c))) @@ -1502,9 +1502,9 @@ static void add_wait(struct dept_class *c, unsigned long ip, w->wait_stack = get_current_stack(); w->sched_sleep = sched_sleep; - irq = cur_irq(); - if (irq < DEPT_IRQS_NR) - add_iwait(c, irq, w); + cxt = cur_cxt(); + if (cxt == DEPT_CXT_HIRQ || cxt == DEPT_CXT_SIRQ) + add_iwait(c, cxt, w); /* * Avoid adding dependency between user aware nested ecxt and @@ -1578,7 +1578,7 @@ static struct dept_ecxt_held *add_ecxt(struct dept_map *m, eh->sub_l = sub_l; irqf = cur_enirqf(); - for_each_set_bit(irq, &irqf, DEPT_IRQS_NR) + for_each_set_bit(irq, &irqf, DEPT_CXT_IRQS_NR) add_iecxt(c, irq, e, false); del_ecxt(e); @@ -1727,7 +1727,7 @@ static void do_event(struct dept_map *m, struct dept_map *real_m, add_dep(eh->ecxt, wh->wait); } - for (i = 0; i < DEPT_IRQS_NR; i++) { + for (i = 0; i < DEPT_CXT_IRQS_NR; i++) { struct dept_ecxt *e; if (before(dt->wgen_enirq[i], wg)) @@ -1774,7 +1774,7 @@ static void disconnect_class(struct dept_class *c) call_rcu(&d->rh, del_dep_rcu); } - for (i = 0; i < DEPT_IRQS_NR; i++) { + for (i = 0; i < DEPT_CXT_IRQS_NR; i++) { stale_iecxt(iecxt(c, i)); stale_iwait(iwait(c, i)); } @@ -1799,27 +1799,21 @@ static unsigned long cur_enirqf(void) return 0UL; } -static int cur_irq(void) +static int cur_cxt(void) { if (lockdep_softirq_context(current)) - return DEPT_SIRQ; + return DEPT_CXT_SIRQ; if (lockdep_hardirq_context()) - return DEPT_HIRQ; - return DEPT_IRQS_NR; + return DEPT_CXT_HIRQ; + return DEPT_CXT_PROCESS; } static unsigned int cur_ctxt_id(void) { struct dept_task *dt = dept_task(); - int irq = cur_irq(); + int cxt = cur_cxt(); - /* - * Normal process context - */ - if (irq == DEPT_IRQS_NR) - return 0U; - - return dt->irq_id[irq] | (1UL << irq); + return dt->cxt_id[cxt] | (1UL << cxt); } static void enirq_transition(int irq) @@ -1876,7 +1870,7 @@ static void dept_enirq(unsigned long ip) flags = dept_enter(); - for_each_set_bit(irq, &irqf, DEPT_IRQS_NR) { + for_each_set_bit(irq, &irqf, DEPT_CXT_IRQS_NR) { dt->enirq_ip[irq] = ip; enirq_transition(irq); } @@ -1922,6 +1916,13 @@ void noinstr dept_hardirqs_off(void) dept_task()->hardirqs_enabled = false; } +void noinstr dept_update_cxt(void) +{ + struct dept_task *dt = dept_task(); + + dt->cxt_id[DEPT_CXT_PROCESS] += 1UL << DEPT_CXTS_NR; +} + /* * Ensure it's the outmost softirq context. */ @@ -1929,7 +1930,7 @@ void dept_softirq_enter(void) { struct dept_task *dt = dept_task(); - dt->irq_id[DEPT_SIRQ] += 1UL << DEPT_IRQS_NR; + dt->cxt_id[DEPT_CXT_SIRQ] += 1UL << DEPT_CXTS_NR; } /* @@ -1939,7 +1940,7 @@ void noinstr dept_hardirq_enter(void) { struct dept_task *dt = dept_task(); - dt->irq_id[DEPT_HIRQ] += 1UL << DEPT_IRQS_NR; + dt->cxt_id[DEPT_CXT_HIRQ] += 1UL << DEPT_CXTS_NR; } void dept_sched_enter(void) diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index d1aeb206b19a..a626631f6bec 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -1365,9 +1365,12 @@ config DEBUG_PREEMPT menu "Lock Debugging (spinlocks, mutexes, etc...)" +config ARCH_HAS_DEPT_SUPPORT + bool + config DEPT bool "Dependency tracking (EXPERIMENTAL)" - depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT + depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT && ARCH_HAS_DEPT_SUPPORT select DEBUG_SPINLOCK select DEBUG_MUTEXES select DEBUG_RT_MUTEXES if RT_MUTEXES -- 2.17.1