From: Peter Zijlstra <peterz@infradead.org>
To: Yuyang Du <duyuyang@gmail.com>
Cc: will.deacon@arm.com, mingo@kernel.org, bvanassche@acm.org,
ming.lei@redhat.com, frederic@kernel.org, tglx@linutronix.de,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 19/28] locking/lockdep: Optimize irq usage check when marking lock usage bit
Date: Thu, 25 Apr 2019 21:32:47 +0200 [thread overview]
Message-ID: <20190425193247.GU12232@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20190424101934.51535-20-duyuyang@gmail.com>
On Wed, Apr 24, 2019 at 06:19:25PM +0800, Yuyang Du wrote:
After only a quick read of these next patches; this is the one that
worries me most.
You did mention Frederic's patches, but I'm not entirely sure you're
aware why he's doing them. He's preparing to split the softirq state
into one state per softirq vector.
See here:
https://lkml.kernel.org/r/20190228171242.32144-14-frederic@kernel.org
https://lkml.kernel.org/r/20190228171242.32144-15-frederic@kernel.org
IOW he's going to massively explode this storage.
> diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
> index 7c2fefa..0e209b8 100644
> --- a/include/linux/lockdep.h
> +++ b/include/linux/lockdep.h
> @@ -72,6 +72,11 @@ struct lock_trace {
> };
>
> #define LOCKSTAT_POINTS 4
> +/*
> + * For hardirq and softirq, each has one for irqsafe lock that reaches
> + * this lock and one for irqsafe-read lock that reaches this lock.
> + */
> +#define LOCK_IRQ_SAFE_LOCKS 4
This is going to be 2*(1+10) if I counted correctly.
> /*
> * The lock-class itself. The order of the structure members matters.
> @@ -114,6 +119,15 @@ struct lock_class {
> int name_version;
> const char *name;
>
> + /*
> + * irqsafe_lock indicates whether there is an IRQ safe lock
> + * reaches this lock_class in the dependency graph, and if so
> + * points to it; irqsafe_distance measures the distance from the
> + * IRQ safe locks, used for keeping the shortest.
> + */
> + struct lock_class *irqsafe_lock[LOCK_IRQ_SAFE_LOCKS];
> + int irqsafe_distance[LOCK_IRQ_SAFE_LOCKS];
Which makes this 264 additional bytes to struct lock_class, which is
immense, given that we're talking about 8192 instances of this, for a
total of over 2M of data.
> +
> #ifdef CONFIG_LOCK_STAT
> unsigned long contention_point[LOCKSTAT_POINTS];
> unsigned long contending_point[LOCKSTAT_POINTS];
> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
> index 6e79bd6..a3138c9 100644
> --- a/kernel/locking/lockdep.c
> +++ b/kernel/locking/lockdep.c
> @@ -1101,6 +1101,7 @@ static bool is_dynamic_key(const struct lock_class_key *key)
> struct lockdep_subclass_key *key;
> struct hlist_head *hash_head;
> struct lock_class *class;
> + int i;
>
> DEBUG_LOCKS_WARN_ON(!irqs_disabled());
>
> @@ -1153,6 +1154,9 @@ static bool is_dynamic_key(const struct lock_class_key *key)
> WARN_ON_ONCE(!list_empty(&class->locks_before));
> WARN_ON_ONCE(!list_empty(&class->locks_after));
> class->name_version = count_matching_names(class);
> + for (i = 0; i < ARRAY_SIZE(class->irqsafe_distance); i++)
> + class->irqsafe_distance[i] = INT_MAX;
> +
> /*
> * We use RCU's safe list-add method to make
> * parallel walking of the hash-list safe:
> @@ -2896,6 +2900,10 @@ static void print_usage_bug_scenario(struct held_lock *lock)
> return 1;
> }
>
> +static DECLARE_BITMAP(lock_classes_hardirq_safe, MAX_LOCKDEP_KEYS);
> +static DECLARE_BITMAP(lock_classes_hardirq_safe_read, MAX_LOCKDEP_KEYS);
> +static DECLARE_BITMAP(lock_classes_softirq_safe, MAX_LOCKDEP_KEYS);
> +static DECLARE_BITMAP(lock_classes_softirq_safe_read, MAX_LOCKDEP_KEYS);
That will need being written like:
#define LOCKDEP_STATE(__STATE) \
static DECLARE_BITMAP(lock_classes_##__STATE##_safe, MAX_LOCKDEP_KEYS); \
static DECLARE_BITMAP(lock_classes_##__STATE##_safe_read, MAX_LOCKDEP_KEYS);
#include "lockdep_states.h"
#undef LOCKDEP_STATE
And will thereby generate 22 bitmaps, each being 1kb of storage.
> /*
> * print irq inversion bug:
> @@ -5001,6 +5009,12 @@ void __init lockdep_init(void)
> + sizeof(lock_chains)
> + sizeof(lock_chains_in_use)
> + sizeof(chain_hlocks)
> +#ifdef CONFIG_TRACE_IRQFLAGS
> + + sizeof(lock_classes_hardirq_safe)
> + + sizeof(lock_classes_hardirq_safe_read)
> + + sizeof(lock_classes_softirq_safe)
> + + sizeof(lock_classes_softirq_safe_read)
another macro generator here.
> +#endif
> #endif
> ) / 1024
> );
Now, I would normally not care too much about memory costs for a debug
feature, except there's architectures that need to keep their image size
small, see the comment that goes along with CONFIG_LOCKDEP_SMALL in
lockdep_internals.h.
next prev parent reply other threads:[~2019-04-25 19:33 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-24 10:19 [PATCH 00/28] Optimize IRQ usage checks and other small bits Yuyang Du
2019-04-24 10:19 ` [PATCH 01/28] locking/lockdep: Change all print_*() return type to void Yuyang Du
2019-04-24 10:19 ` [PATCH 02/28] locking/lockdep: Add description and explanation in lockdep design doc Yuyang Du
2019-04-25 14:01 ` Peter Zijlstra
2019-04-26 5:41 ` Yuyang Du
2019-04-24 10:19 ` [PATCH 03/28] locking/lockdep: Adjust lock usage bit character checks Yuyang Du
2019-04-24 10:19 ` [PATCH 04/28] locking/lockdep: Remove useless conditional macro Yuyang Du
2019-04-24 10:19 ` [PATCH 05/28] locking/lockdep: Print the right depth for chain key colission Yuyang Du
2019-04-24 10:19 ` [PATCH 06/28] locking/lockdep: Update obsolete struct field description Yuyang Du
2019-04-24 10:19 ` [PATCH 07/28] locking/lockdep: Use lockdep_init_task for task initiation consistently Yuyang Du
2019-04-24 10:19 ` [PATCH 08/28] locking/lockdep: Define INITIAL_CHAIN_KEY for chain keys to start with Yuyang Du
2019-04-24 10:19 ` [PATCH 09/28] locking/lockdep: Change the range of class_idx in held_lock struct Yuyang Du
2019-04-24 10:19 ` [PATCH 10/28] locking/lockdep: Remove unused argument in validate_chain() and check_deadlock() Yuyang Du
2019-04-24 10:19 ` [PATCH 11/28] locking/lockdep: Update comment Yuyang Du
2019-04-24 10:19 ` [PATCH 12/28] locking/lockdep: Change type of the element field in circular_queue Yuyang Du
2019-04-24 10:19 ` [PATCH 13/28] locking/lockdep: Change the return type of __cq_dequeue() Yuyang Du
2019-04-24 10:19 ` [PATCH 14/28] locking/lockdep: Avoid constant checks in __bfs by using offset reference Yuyang Du
2019-04-24 10:19 ` [PATCH 15/28] locking/lockdep: Update comments on dependency search Yuyang Du
2019-04-24 10:19 ` [PATCH 16/28] locking/lockdep: Add explanation to lock usage rules in lockdep design doc Yuyang Du
2019-04-24 10:19 ` [PATCH 17/28] locking/lockdep: Remove redundant argument in check_deadlock Yuyang Du
2019-04-24 10:19 ` [PATCH 18/28] locking/lockdep: Remove unused argument in __lock_release Yuyang Du
2019-04-24 10:19 ` [PATCH 19/28] locking/lockdep: Optimize irq usage check when marking lock usage bit Yuyang Du
2019-04-25 19:32 ` Peter Zijlstra [this message]
2019-04-26 6:57 ` Yuyang Du
2019-04-30 12:11 ` Peter Zijlstra
2019-05-06 3:05 ` Yuyang Du
2019-05-06 3:42 ` Yuyang Du
2019-05-07 1:47 ` Frederic Weisbecker
2019-05-07 2:21 ` Yuyang Du
2019-04-24 10:19 ` [PATCH 20/28] locking/lockdep: Refactorize check_noncircular and check_redundant Yuyang Du
2019-04-25 19:48 ` Peter Zijlstra
2019-04-26 6:48 ` Yuyang Du
2019-04-24 10:19 ` [PATCH 21/28] locking/lockdep: Consolidate lock usage bit initialization Yuyang Du
2019-04-24 10:19 ` [PATCH 22/28] locking/lockdep: Adjust new bit cases in mark_lock Yuyang Du
2019-04-25 19:52 ` Peter Zijlstra
2019-04-26 6:47 ` Yuyang Du
2019-04-24 10:19 ` [PATCH 23/28] locking/lockdep: Update irqsafe lock bitmaps Yuyang Du
2019-04-25 19:55 ` Peter Zijlstra
2019-04-26 6:45 ` Yuyang Du
2019-04-24 10:19 ` [PATCH 24/28] locking/lockdep: Remove !dir in lock irq usage check Yuyang Du
2019-04-25 20:03 ` Peter Zijlstra
2019-04-26 7:06 ` Yuyang Du
2019-04-26 7:25 ` Boqun Feng
2019-04-30 15:35 ` Peter Zijlstra
2019-04-24 10:19 ` [PATCH 25/28] locking/lockdep: Implement new IRQ usage checking algorithm Yuyang Du
2019-04-24 10:19 ` [PATCH 26/28] locking/lockdep: Remove __bfs Yuyang Du
2019-04-25 20:06 ` Peter Zijlstra
2019-04-26 6:35 ` Yuyang Du
2019-04-24 10:19 ` [PATCH 27/28] locking/lockdep: Remove locks_before Yuyang Du
2019-04-24 10:19 ` [PATCH 28/28] locking/lockdep: Reduce lock_list_entries by half Yuyang Du
2019-04-25 18:56 ` [PATCH 00/28] Optimize IRQ usage checks and other small bits Peter Zijlstra
2019-04-26 6:59 ` Yuyang Du
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190425193247.GU12232@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=bvanassche@acm.org \
--cc=duyuyang@gmail.com \
--cc=frederic@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.lei@redhat.com \
--cc=mingo@kernel.org \
--cc=tglx@linutronix.de \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox