Files
kernel_amazon_mt8127-common/include/linux
Amerigo Wang 29671f22a8 rwsem: fix rwsem_is_locked() bugs
rwsem_is_locked() tests ->activity without locks, so we should always keep
->activity consistent.  However, the code in __rwsem_do_wake() breaks this
rule, it updates ->activity after _all_ readers waken up, this may give
some reader a wrong ->activity value, thus cause rwsem_is_locked() behaves
wrong.

Quote from Andrew:

"
- we have one or more processes sleeping in down_read(), waiting for access.

- we wake one or more processes up without altering ->activity

- they start to run and they do rwsem_is_locked().  This incorrectly
  returns "false", because the waker process is still crunching away in
  __rwsem_do_wake().

- the waker now alters ->activity, but it was too late.
"

So we need get a spinlock to protect this.  And rwsem_is_locked() should
not block, thus we use spin_trylock_irqsave().

[akpm@linux-foundation.org: simplify code]
Reported-by: Brian Behlendorf <behlendorf1@llnl.gov>
Cc: Ben Woodard <bwoodard@llnl.gov>
Cc: David Howells <dhowells@redhat.com>
Signed-off-by: WANG Cong <amwang@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2009-12-15 08:53:26 -08:00
..
2009-12-14 00:26:26 +01:00
2009-11-24 08:18:54 +02:00
2009-11-10 12:31:43 +01:00
2009-11-08 20:57:03 -08:00
2009-12-06 21:10:56 +01:00
2009-12-10 15:02:53 +01:00
2009-12-10 15:02:50 +01:00
2009-11-10 11:50:21 +01:00
2009-12-03 11:58:47 +00:00
2009-12-14 21:17:29 +01:00
2009-11-28 15:05:05 -05:00
2009-12-02 23:38:13 -08:00
2009-12-04 15:39:57 +01:00
2009-12-11 15:18:03 -08:00
2009-12-15 08:53:20 -08:00
2009-12-03 09:32:17 +02:00
2009-12-09 17:14:38 +11:00
2009-12-15 08:53:20 -08:00
2009-11-28 15:05:05 -05:00
2009-12-09 12:12:44 +02:00
2009-12-15 08:53:17 -08:00
2009-12-15 08:53:25 -08:00
2009-12-03 11:43:23 +00:00
2009-12-02 09:55:33 +01:00
2009-11-10 22:26:29 -08:00
2009-12-15 08:53:20 -08:00
2009-11-30 12:02:53 +09:00
2009-12-02 19:57:15 -08:00
2009-11-18 14:52:25 +01:00
2009-12-15 08:53:16 -08:00
2009-12-11 06:44:29 -05:00
2009-11-13 20:46:24 +01:00
2009-11-10 20:54:38 -08:00
2009-11-19 13:43:06 -08:00