lkml.org 
[lkml]   [2019]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH v4 04/16] locking/rwsem: Implement a new locking scheme
On Tue, Apr 16, 2019 at 04:18:20PM +0200, Peter Zijlstra wrote:
> On Tue, Apr 16, 2019 at 09:32:38AM -0400, Waiman Long wrote:
> > On 04/16/2019 09:22 AM, Peter Zijlstra wrote:
> > > On Sat, Apr 13, 2019 at 01:22:47PM -0400, Waiman Long wrote:
> > >> +#define RWSEM_COUNT_LOCKED(c) ((c) & RWSEM_LOCK_MASK)
> > > The above doesn't seem to make it more readable or shorter.
> >
> > Fair enough. I can remove that macro.
>
> I did the same for the HANDOFF patch but seem to have misplaced the
> delta and have already refreshed the patch.

Had to redo it, so here goes:

---
--- a/kernel/locking/rwsem.c
+++ b/kernel/locking/rwsem.c
@@ -102,9 +102,6 @@
#define RWSEM_READ_FAILED_MASK (RWSEM_WRITER_MASK|RWSEM_FLAG_WAITERS|\
RWSEM_FLAG_HANDOFF)

-#define RWSEM_COUNT_HANDOFF(c) ((c) & RWSEM_FLAG_HANDOFF)
-#define RWSEM_COUNT_LOCKED_OR_HANDOFF(c) \
- ((c) & (RWSEM_LOCK_MASK|RWSEM_FLAG_HANDOFF))
/*
* All writes to owner are protected by WRITE_ONCE() to make sure that
* store tearing can't happen as optimistic spinners may read and use
@@ -365,7 +362,7 @@ static void __rwsem_mark_wake(struct rw_
/*
* Clear the handoff flag
*/
- if (woken && RWSEM_COUNT_HANDOFF(atomic_long_read(&sem->count)))
+ if (woken && (atomic_long_read(&sem->count) & RWSEM_FLAG_HANDOFF))
adjustment -= RWSEM_FLAG_HANDOFF;

if (adjustment)
@@ -387,7 +384,7 @@ static inline bool rwsem_try_write_lock(

retry:
if (count & RWSEM_LOCK_MASM)) {
- if (RWSEM_COUNT_HANDOFF(count) || (wstate != WRITER_HANDOFF))
+ if ((count & RWSEM_FLAG_HANDOFF) || (wstate != WRITER_HANDOFF))
return false;
/*
* The lock may become free just before setting handoff bit.
@@ -398,7 +395,7 @@ static inline bool rwsem_try_write_lock(
goto retry;
}

- if ((wstate == WRITER_NOT_FIRST) && RWSEM_COUNT_HANDOFF(count))
+ if ((wstate == WRITER_NOT_FIRST) && (count & RWSEM_FLAG_HANDOFF))
return false;

new = (count & ~RWSEM_FLAG_HANDOFF) + RWSEM_WRITER_LOCKED -
@@ -409,7 +406,7 @@ static inline bool rwsem_try_write_lock(
return true;
}

- if (unlikely((wstate == WRITER_HANDOFF) && !RWSEM_COUNT_HANDOFF(count)))
+ if (unlikely((wstate == WRITER_HANDOFF) && !(count & RWSEM_FLAG_HANDOFF)))
goto retry;

return false;
@@ -704,7 +701,7 @@ __rwsem_down_write_failed_common(struct
rwsem_waiter_is_first(sem, &waiter))
wstate = WRITER_FIRST;

- if (!RWSEM_COUNT_LOCKED(count))
+ if (!(count & RWSEM_LOCK_MASK))
break;

/*
\
 
 \ /
  Last update: 2019-04-16 16:43    [W:0.141 / U:0.620 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site