linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/28] Optimize IRQ usage checks and other small bits
@ 2019-04-24 10:19 Yuyang Du
  2019-04-24 10:19 ` [PATCH 01/28] locking/lockdep: Change all print_*() return type to void Yuyang Du
                   ` (28 more replies)
  0 siblings, 29 replies; 52+ messages in thread
From: Yuyang Du @ 2019-04-24 10:19 UTC (permalink / raw)
  To: peterz, will.deacon, mingo
  Cc: bvanassche, ming.lei, frederic, tglx, linux-kernel, Yuyang Du

It would be desirable to optimize IRQ usage related checks as they
traverse dependency graph multiple times, especially for irq-unsafe
usage checks with backward search since most of the locks are
irq-unsafe.

This series completely removes backward dependencies. The idea is to
mark locks whether they can be reached from irq-safe locks in forward
graph traverses after irq-safe locks are encountered.

As a result, this series not only cuts the dependency list entries by
half and saves memory, but also significantly reduces both forward and
backward checks, which is briefly demonstrated on a simple workload:
Linux kernel build (i.e., make clean; reboot; make vmlinux -j8).

Results:

------
Before
------

direct dependencies:                  6900 [max: 32768]
max bfs queue depth:                   272
find-mask forwards checks:            2875
find-mask backwards checks:          50229

-----
After
-----

direct dependencies:                  3444 [max: 16384]   ( -  50 % )
max bfs queue depth:                   223                ( -  18 % )
find-mask forwards checks:             370                ( -  87 % )
find-mask backwards checks:              0                ( - 100 % )


The patches are organized as follows:

Patches 1 - 18
--------------
My previous small improvements. They are trivial but each is made for a
reason, so I still post them here. Please give them a look, Peter. I
have carried them for a while and rebased them a couple of times solving
confilicts.

Patches 19 - 28
---------------
The new IRQ check algorithm implementation is fairly long, so I tried to
divide it into as many patches as I can (actually this does not help
much). Also I tried to describe what it does in changelogs as detailed
as I can.

The performance numbers have not considered Frederic's recent big
improvements. Anyway, this series happened in parallel and I'd be happy
to rebase it.

HEAD: 7037e8d0af6c8ce5657c83e894c756ee1d33ce80

Thanks,
Yuyang

--

Yuyang Du (28):
  locking/lockdep: Change all print_*() return type to void
  locking/lockdep: Add description and explanation in lockdep design doc
  locking/lockdep: Adjust lock usage bit character checks
  locking/lockdep: Remove useless conditional macro
  locking/lockdep: Print the right depth for chain key colission
  locking/lockdep: Update obsolete struct field description
  locking/lockdep: Use lockdep_init_task for task initiation
    consistently
  locking/lockdep: Define INITIAL_CHAIN_KEY for chain keys to start with
  locking/lockdep: Change the range of class_idx in held_lock struct
  locking/lockdep: Remove unused argument in validate_chain() and
    check_deadlock()
  locking/lockdep: Update comment
  locking/lockdep: Change type of the element field in circular_queue
  locking/lockdep: Change the return type of __cq_dequeue()
  locking/lockdep: Avoid constant checks in __bfs by using offset
    reference
  locking/lockdep: Update comments on dependency search
  locking/lockdep: Add explanation to lock usage rules in lockdep design
    doc
  locking/lockdep: Remove redundant argument in check_deadlock
  locking/lockdep: Remove unused argument in __lock_release
  locking/lockdep: Optimize irq usage check when marking lock usage bit
  locking/lockdep: Refactorize check_noncircular and check_redundant
  locking/lockdep: Consolidate lock usage bit initialization
  locking/lockdep: Adjust new bit cases in mark_lock
  locking/lockdep: Update irqsafe lock bitmaps
  locking/lockdep: Remove !dir in lock irq usage check
  locking/lockdep: Implement new IRQ usage checking algorithm
  locking/lockdep: Remove __bfs
  locking/lockdep: Remove locks_before
  locking/lockdep: Reduce lock_list_entries by half

 Documentation/locking/lockdep-design.txt |  107 +++-
 include/linux/lockdep.h                  |   51 +-
 init/init_task.c                         |    2 +
 kernel/fork.c                            |    3 -
 kernel/locking/lockdep.c                 | 1033 ++++++++++++++++++------------
 kernel/locking/lockdep_internals.h       |   19 +-
 kernel/locking/lockdep_proc.c            |    1 -
 7 files changed, 757 insertions(+), 459 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 52+ messages in thread

end of thread, other threads:[~2019-05-07  2:22 UTC | newest]

Thread overview: 52+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).