linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/12] Series short description
@ 2018-11-05  1:30 NeilBrown
  2018-11-05  1:30 ` [PATCH 02/12] fs/locks: split out __locks_wake_up_blocks() NeilBrown
                   ` (12 more replies)
  0 siblings, 13 replies; 27+ messages in thread
From: NeilBrown @ 2018-11-05  1:30 UTC (permalink / raw)
  To: Jeff Layton, Alexander Viro
  Cc: J. Bruce Fields, Martin Wilck, linux-fsdevel, Frank Filz, linux-kernel

Here is the respin on this series with the file_lock properly
initlized for unlock requests.
I found one that I had missed before - in locks_remove_flock()
The change makes this code smaller!

Original series description:

If you have a many-core machine, and have many threads all wanting to
briefly lock a give file (udev is known to do this), you can get quite
poor performance.

When one thread releases a lock, it wakes up all other threads that
are waiting (classic thundering-herd) - one will get the lock and the
others go to sleep.
When you have few cores, this is not very noticeable: by the time the
4th or 5th thread gets enough CPU time to try to claim the lock, the
earlier threads have claimed it, done what was needed, and released.
With 50+ cores, the contention can easily be measured.

This patchset creates a tree of pending lock request in which siblings
don't conflict and each lock request does conflict with its parent.
When a lock is released, only requests which don't conflict with each
other a woken.

Testing shows that lock-acquisitions-per-second is now fairly stable even
as number of contending process goes to 1000.  Without this patch,
locks-per-second drops off steeply after a few 10s of processes.

There is a small cost to this extra complexity.
At 20 processes running a particular test on 72 cores, the lock
acquisitions per second drops from 1.8 million to 1.4 million with
this patch.  For 100 processes, this patch still provides 1.4 million
while without this patch there are about 700,000.

NeilBrown


---

NeilBrown (12):
      fs/locks: rename some lists and pointers.
      fs/locks: split out __locks_wake_up_blocks().
      NFS: use locks_copy_lock() to copy locks.
      gfs2: properly initial file_lock used for unlock.
      ocfs2: properly initial file_lock used for unlock.
      locks: use properly initialized file_lock when unlocking.
      fs/locks: allow a lock request to block other requests.
      fs/locks: always delete_block after waiting.
      fs/locks: change all *_conflict() functions to return bool.
      fs/locks: create a tree of dependent requests.
      locks: merge posix_unblock_lock() and locks_delete_block()
      VFS: locks: remove unnecessary white space.


 fs/cifs/file.c                  |    4 -
 fs/gfs2/file.c                  |   10 +-
 fs/lockd/svclock.c              |    2 
 fs/locks.c                      |  253 +++++++++++++++++++++------------------
 fs/nfs/nfs4proc.c               |    6 +
 fs/nfsd/nfs4state.c             |    6 -
 fs/ocfs2/locks.c                |   10 +-
 include/linux/fs.h              |   11 +-
 include/trace/events/filelock.h |   16 +-
 9 files changed, 173 insertions(+), 145 deletions(-)

--
Signature


^ permalink raw reply	[flat|nested] 27+ messages in thread
* [PATCH 00/12 v5] locks: avoid thundering-herd wake-ups
@ 2018-11-12  1:14 NeilBrown
  2018-11-12  1:14 ` [PATCH 04/12] gfs2: properly initial file_lock used for unlock NeilBrown
  0 siblings, 1 reply; 27+ messages in thread
From: NeilBrown @ 2018-11-12  1:14 UTC (permalink / raw)
  To: Jeff Layton, Alexander Viro
  Cc: J. Bruce Fields, Martin Wilck, linux-fsdevel, Frank Filz, linux-kernel

Changes:
 - field names improved as requested by Bruce.
   "fl_blocked_requests" is a list of blocked requests,
   linked through fl_block_member
 - the introductory text has been moved to a commit comment
   as suggested by Bruce
 - documentation added to locks.c as suggested by Bruce - I made
   a few little changes
 - flock_make_lock() now properly initialized a lock - using
   the code from Jeff
 - code actually compiles for ocfs2 and gfs2

Thanks,
NeilBrown


---

NeilBrown (12):
      fs/locks: rename some lists and pointers.
      fs/locks: split out __locks_wake_up_blocks().
      NFS: use locks_copy_lock() to copy locks.
      gfs2: properly initial file_lock used for unlock.
      ocfs2: properly initial file_lock used for unlock.
      locks: use properly initialized file_lock when unlocking.
      fs/locks: allow a lock request to block other requests.
      fs/locks: always delete_block after waiting.
      fs/locks: change all *_conflict() functions to return bool.
      fs/locks: create a tree of dependent requests.
      locks: merge posix_unblock_lock() and locks_delete_block()
      VFS: locks: remove unnecessary white space.


 fs/cifs/file.c                  |    4 
 fs/gfs2/file.c                  |   10 +
 fs/lockd/svclock.c              |    2 
 fs/locks.c                      |  319 ++++++++++++++++++++++++---------------
 fs/nfs/nfs4proc.c               |    6 -
 fs/nfsd/nfs4state.c             |    6 -
 fs/ocfs2/locks.c                |   10 +
 include/linux/fs.h              |   13 +-
 include/trace/events/filelock.h |   16 +-
 9 files changed, 230 insertions(+), 156 deletions(-)

--
Signature


^ permalink raw reply	[flat|nested] 27+ messages in thread
* [PATCH 00/12 v6] fs/locks: avoid thundering-herd wake-ups
@ 2018-11-29 23:04 NeilBrown
  2018-11-29 23:04 ` [PATCH 04/12] gfs2: properly initial file_lock used for unlock NeilBrown
  0 siblings, 1 reply; 27+ messages in thread
From: NeilBrown @ 2018-11-29 23:04 UTC (permalink / raw)
  To: Jeff Layton
  Cc: J. Bruce Fields, Martin Wilck, linux-fsdevel, Frank Filz, linux-kernel

This series has the fixes for the recently reported performance
regressions merged into the patches which caused them.
It also has a couple of little fixes that have been mentioned on the
list, and that Jeff had merged into his copy.

Thanks,
NeilBrown

---

NeilBrown (12):
      fs/locks: rename some lists and pointers.
      fs/locks: split out __locks_wake_up_blocks().
      NFS: use locks_copy_lock() to copy locks.
      gfs2: properly initial file_lock used for unlock.
      ocfs2: properly initial file_lock used for unlock.
      fs/locks: use properly initialized file_lock when unlocking.
      fs/locks: allow a lock request to block other requests.
      fs/locks: always delete_block after waiting.
      fs/locks: change all *_conflict() functions to return bool.
      fs/locks: create a tree of dependent requests.
      fs/locks: merge posix_unblock_lock() and locks_delete_block()
      fs/locks: locks: remove unnecessary white space.


 fs/cifs/file.c                  |    4 
 fs/gfs2/file.c                  |   10 +
 fs/lockd/svclock.c              |    2 
 fs/locks.c                      |  342 +++++++++++++++++++++++++--------------
 fs/nfs/nfs4proc.c               |    6 -
 fs/nfsd/nfs4state.c             |    6 -
 fs/ocfs2/locks.c                |   10 +
 include/linux/fs.h              |   13 +
 include/trace/events/filelock.h |   16 +-
 9 files changed, 252 insertions(+), 157 deletions(-)

--
Signature


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

end of thread, other threads:[~2018-11-29 23:06 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-05  1:30 [PATCH 00/12] Series short description NeilBrown
2018-11-05  1:30 ` [PATCH 02/12] fs/locks: split out __locks_wake_up_blocks() NeilBrown
2018-11-05  1:30 ` [PATCH 08/12] fs/locks: always delete_block after waiting NeilBrown
2018-11-05  1:30 ` [PATCH 06/12] locks: use properly initialized file_lock when unlocking NeilBrown
2018-11-05  1:30 ` [PATCH 01/12] fs/locks: rename some lists and pointers NeilBrown
2018-11-08 20:26   ` J. Bruce Fields
2018-11-09  0:32     ` NeilBrown
2018-11-09  3:11       ` J. Bruce Fields
2018-11-05  1:30 ` [PATCH 04/12] gfs2: properly initial file_lock used for unlock NeilBrown
2018-11-05 12:18   ` Jeff Layton
2018-11-06  1:48     ` NeilBrown
2018-11-06 13:20       ` Jeff Layton
2018-11-05  1:30 ` [PATCH 05/12] ocfs2: " NeilBrown
2018-11-05  1:30 ` [PATCH 07/12] fs/locks: allow a lock request to block other requests NeilBrown
2018-11-05  1:30 ` [PATCH 09/12] fs/locks: change all *_conflict() functions to return bool NeilBrown
2018-11-05  1:30 ` [PATCH 03/12] NFS: use locks_copy_lock() to copy locks NeilBrown
2018-11-05  1:30 ` [PATCH 11/12] locks: merge posix_unblock_lock() and locks_delete_block() NeilBrown
2018-11-05  1:30 ` [PATCH 10/12] fs/locks: create a tree of dependent requests NeilBrown
2018-11-08 21:30   ` J. Bruce Fields
2018-11-09  0:38     ` NeilBrown
2018-11-09  3:09       ` J. Bruce Fields
2018-11-09  6:24         ` NeilBrown
2018-11-09 15:08           ` J. Bruce Fields
2018-11-05  1:30 ` [PATCH 12/12] VFS: locks: remove unnecessary white space NeilBrown
2018-11-08 21:35 ` [PATCH 00/12] Series short description J. Bruce Fields
2018-11-12  1:14 [PATCH 00/12 v5] locks: avoid thundering-herd wake-ups NeilBrown
2018-11-12  1:14 ` [PATCH 04/12] gfs2: properly initial file_lock used for unlock NeilBrown
2018-11-29 23:04 [PATCH 00/12 v6] fs/locks: avoid thundering-herd wake-ups NeilBrown
2018-11-29 23:04 ` [PATCH 04/12] gfs2: properly initial file_lock used for unlock NeilBrown

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).