From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
To: Christoph Lameter <cl@linux.com>
Cc: linux-mm@kvack.org, Pekka Enberg <penberg@kernel.org>,
David Rientjes <rientjes@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Andrew Morton <akpm@linux-foundation.org>,
Noam Camus <noamc@ezchip.com>,
stable@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-snps-arc@lists.infradead.org, linux-parisc@vger.kernel,
Peter Zijlstra <peterz@infradead.org>,
"James E.J. Bottomley" <jejb@parisc-linux.org>,
Helge Deller <deller@gmx.de>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>
Subject: Re: [PATCH] mm: slub: Ensure that slab_unlock() is atomic
Date: Wed, 9 Mar 2016 12:13:16 +0530 [thread overview]
Message-ID: <56DFC604.6070407@synopsys.com> (raw)
In-Reply-To: <alpine.DEB.2.20.1603081438020.4268@east.gentwo.org>
+CC linux-arch, parisc folks, PeterZ
On Wednesday 09 March 2016 02:10 AM, Christoph Lameter wrote:
> On Tue, 8 Mar 2016, Vineet Gupta wrote:
>
>> # set the bit
>> 80543b8e: ld_s r2,[r13,0] <--- (A) Finds PG_locked is set
>> 80543b90: or r3,r2,1 <--- (B) other core unlocks right here
>> 80543b94: st_s r3,[r13,0] <--- (C) sets PG_locked (overwrites unlock)
>
> Duh. Guess you need to take the spinlock also in the arch specific
> implementation of __bit_spin_unlock(). This is certainly not the only case
> in which we use the __ op to unlock.
__bit_spin_lock() by definition is *not* required to be atomic, bit_spin_lock() is
- so I don't think we need a spinlock there.
There is clearly a problem in slub code that it is pairing a test_and_set_bit()
with a __clear_bit(). Latter can obviously clobber former if they are not a single
instruction each unlike x86 or they use llock/scond kind of instructions where the
interim store from other core is detected and causes a retry of whole llock/scond
sequence.
BTW ARC is not the only arch which suffers from this - other arches potentially
also are. AFAIK PARISC also doesn't have atomic r-m-w and also uses a set of
external hashed spinlocks to protect the r-m-w sequences.
https://lkml.org/lkml/2014/6/1/178
So there also we have the same race because the outer spin lock is not taken for
slab_unlock() -> __bit_spin_lock() -> __clear_bit.
Arguably I can fix the ARC !LLSC variant of test_and_set_bit() to not set the bit
unconditionally but only if it was clear (PARISC does the same). That would be a
slight micro-optimization as we won't need another snoop transaction to make line
writable and that would also elide this problem, but I think there is a
fundamental problem here in slub which is pairing atomic and non atomic ops - for
performance reasons. It doesn't work on all arches and/or configurations.
> You need a true atomic op or you need to take the "spinlock" in all
> cases where you modify the bit.
No we don't in __bit_spin_lock and we already do in bit_spin_lock.
> If you take the lock in __bit_spin_unlock
> then the race cannot happen.
Of course it won't but that means we penalize all non atomic callers of the API
with a superfluous spinlock which is not require din first place given the
definition of API.
>> Are you convinced now !
>
> Yes, please fix your arch specific code.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
To: Christoph Lameter <cl@linux.com>
Cc: linux-mm@kvack.org, Pekka Enberg <penberg@kernel.org>,
David Rientjes <rientjes@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Andrew Morton <akpm@linux-foundation.org>,
Noam Camus <noamc@ezchip.com>,
stable@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-snps-arc@lists.infradead.org, linux-parisc@vger.kernel,
Peter Zijlstra <peterz@infradead.org>,
"James E.J. Bottomley" <jejb@parisc-linux.org>,
Helge Deller <deller@gmx.de>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>
Subject: Re: [PATCH] mm: slub: Ensure that slab_unlock() is atomic
Date: Wed, 9 Mar 2016 12:13:16 +0530 [thread overview]
Message-ID: <56DFC604.6070407@synopsys.com> (raw)
Message-ID: <20160309064316.rePmuTTHGXGjE71cqJYXy7j9ocdkvkk_7Ou5kH7n9-s@z> (raw)
In-Reply-To: <alpine.DEB.2.20.1603081438020.4268@east.gentwo.org>
+CC linux-arch, parisc folks, PeterZ
On Wednesday 09 March 2016 02:10 AM, Christoph Lameter wrote:
> On Tue, 8 Mar 2016, Vineet Gupta wrote:
>
>> # set the bit
>> 80543b8e: ld_s r2,[r13,0] <--- (A) Finds PG_locked is set
>> 80543b90: or r3,r2,1 <--- (B) other core unlocks right here
>> 80543b94: st_s r3,[r13,0] <--- (C) sets PG_locked (overwrites unlock)
>
> Duh. Guess you need to take the spinlock also in the arch specific
> implementation of __bit_spin_unlock(). This is certainly not the only case
> in which we use the __ op to unlock.
__bit_spin_lock() by definition is *not* required to be atomic, bit_spin_lock() is
- so I don't think we need a spinlock there.
There is clearly a problem in slub code that it is pairing a test_and_set_bit()
with a __clear_bit(). Latter can obviously clobber former if they are not a single
instruction each unlike x86 or they use llock/scond kind of instructions where the
interim store from other core is detected and causes a retry of whole llock/scond
sequence.
BTW ARC is not the only arch which suffers from this - other arches potentially
also are. AFAIK PARISC also doesn't have atomic r-m-w and also uses a set of
external hashed spinlocks to protect the r-m-w sequences.
https://lkml.org/lkml/2014/6/1/178
So there also we have the same race because the outer spin lock is not taken for
slab_unlock() -> __bit_spin_lock() -> __clear_bit.
Arguably I can fix the ARC !LLSC variant of test_and_set_bit() to not set the bit
unconditionally but only if it was clear (PARISC does the same). That would be a
slight micro-optimization as we won't need another snoop transaction to make line
writable and that would also elide this problem, but I think there is a
fundamental problem here in slub which is pairing atomic and non atomic ops - for
performance reasons. It doesn't work on all arches and/or configurations.
> You need a true atomic op or you need to take the "spinlock" in all
> cases where you modify the bit.
No we don't in __bit_spin_lock and we already do in bit_spin_lock.
> If you take the lock in __bit_spin_unlock
> then the race cannot happen.
Of course it won't but that means we penalize all non atomic callers of the API
with a superfluous spinlock which is not require din first place given the
definition of API.
>> Are you convinced now !
>
> Yes, please fix your arch specific code.
WARNING: multiple messages have this Message-ID (diff)
From: Vineet.Gupta1@synopsys.com (Vineet Gupta)
To: linux-snps-arc@lists.infradead.org
Subject: [PATCH] mm: slub: Ensure that slab_unlock() is atomic
Date: Wed, 9 Mar 2016 12:13:16 +0530 [thread overview]
Message-ID: <56DFC604.6070407@synopsys.com> (raw)
In-Reply-To: <alpine.DEB.2.20.1603081438020.4268@east.gentwo.org>
+CC linux-arch, parisc folks, PeterZ
On Wednesday 09 March 2016 02:10 AM, Christoph Lameter wrote:
> On Tue, 8 Mar 2016, Vineet Gupta wrote:
>
>> # set the bit
>> 80543b8e: ld_s r2,[r13,0] <--- (A) Finds PG_locked is set
>> 80543b90: or r3,r2,1 <--- (B) other core unlocks right here
>> 80543b94: st_s r3,[r13,0] <--- (C) sets PG_locked (overwrites unlock)
>
> Duh. Guess you need to take the spinlock also in the arch specific
> implementation of __bit_spin_unlock(). This is certainly not the only case
> in which we use the __ op to unlock.
__bit_spin_lock() by definition is *not* required to be atomic, bit_spin_lock() is
- so I don't think we need a spinlock there.
There is clearly a problem in slub code that it is pairing a test_and_set_bit()
with a __clear_bit(). Latter can obviously clobber former if they are not a single
instruction each unlike x86 or they use llock/scond kind of instructions where the
interim store from other core is detected and causes a retry of whole llock/scond
sequence.
BTW ARC is not the only arch which suffers from this - other arches potentially
also are. AFAIK PARISC also doesn't have atomic r-m-w and also uses a set of
external hashed spinlocks to protect the r-m-w sequences.
https://lkml.org/lkml/2014/6/1/178
So there also we have the same race because the outer spin lock is not taken for
slab_unlock() -> __bit_spin_lock() -> __clear_bit.
Arguably I can fix the ARC !LLSC variant of test_and_set_bit() to not set the bit
unconditionally but only if it was clear (PARISC does the same). That would be a
slight micro-optimization as we won't need another snoop transaction to make line
writable and that would also elide this problem, but I think there is a
fundamental problem here in slub which is pairing atomic and non atomic ops - for
performance reasons. It doesn't work on all arches and/or configurations.
> You need a true atomic op or you need to take the "spinlock" in all
> cases where you modify the bit.
No we don't in __bit_spin_lock and we already do in bit_spin_lock.
> If you take the lock in __bit_spin_unlock
> then the race cannot happen.
Of course it won't but that means we penalize all non atomic callers of the API
with a superfluous spinlock which is not require din first place given the
definition of API.
>> Are you convinced now !
>
> Yes, please fix your arch specific code.
WARNING: multiple messages have this Message-ID (diff)
From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
To: Christoph Lameter <cl@linux.com>
Cc: <linux-mm@kvack.org>, Pekka Enberg <penberg@kernel.org>,
David Rientjes <rientjes@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Andrew Morton <akpm@linux-foundation.org>,
Noam Camus <noamc@ezchip.com>, <stable@vger.kernel.org>,
<linux-kernel@vger.kernel.org>,
<linux-snps-arc@lists.infradead.org>, <linux-parisc@vger.kernel>,
"Peter Zijlstra" <peterz@infradead.org>,
"James E.J. Bottomley" <jejb@parisc-linux.org>,
Helge Deller <deller@gmx.de>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>
Subject: Re: [PATCH] mm: slub: Ensure that slab_unlock() is atomic
Date: Wed, 9 Mar 2016 12:13:16 +0530 [thread overview]
Message-ID: <56DFC604.6070407@synopsys.com> (raw)
In-Reply-To: <alpine.DEB.2.20.1603081438020.4268@east.gentwo.org>
+CC linux-arch, parisc folks, PeterZ
On Wednesday 09 March 2016 02:10 AM, Christoph Lameter wrote:
> On Tue, 8 Mar 2016, Vineet Gupta wrote:
>
>> # set the bit
>> 80543b8e: ld_s r2,[r13,0] <--- (A) Finds PG_locked is set
>> 80543b90: or r3,r2,1 <--- (B) other core unlocks right here
>> 80543b94: st_s r3,[r13,0] <--- (C) sets PG_locked (overwrites unlock)
>
> Duh. Guess you need to take the spinlock also in the arch specific
> implementation of __bit_spin_unlock(). This is certainly not the only case
> in which we use the __ op to unlock.
__bit_spin_lock() by definition is *not* required to be atomic, bit_spin_lock() is
- so I don't think we need a spinlock there.
There is clearly a problem in slub code that it is pairing a test_and_set_bit()
with a __clear_bit(). Latter can obviously clobber former if they are not a single
instruction each unlike x86 or they use llock/scond kind of instructions where the
interim store from other core is detected and causes a retry of whole llock/scond
sequence.
BTW ARC is not the only arch which suffers from this - other arches potentially
also are. AFAIK PARISC also doesn't have atomic r-m-w and also uses a set of
external hashed spinlocks to protect the r-m-w sequences.
https://lkml.org/lkml/2014/6/1/178
So there also we have the same race because the outer spin lock is not taken for
slab_unlock() -> __bit_spin_lock() -> __clear_bit.
Arguably I can fix the ARC !LLSC variant of test_and_set_bit() to not set the bit
unconditionally but only if it was clear (PARISC does the same). That would be a
slight micro-optimization as we won't need another snoop transaction to make line
writable and that would also elide this problem, but I think there is a
fundamental problem here in slub which is pairing atomic and non atomic ops - for
performance reasons. It doesn't work on all arches and/or configurations.
> You need a true atomic op or you need to take the "spinlock" in all
> cases where you modify the bit.
No we don't in __bit_spin_lock and we already do in bit_spin_lock.
> If you take the lock in __bit_spin_unlock
> then the race cannot happen.
Of course it won't but that means we penalize all non atomic callers of the API
with a superfluous spinlock which is not require din first place given the
definition of API.
>> Are you convinced now !
>
> Yes, please fix your arch specific code.
WARNING: multiple messages have this Message-ID (diff)
From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
To: Christoph Lameter <cl@linux.com>
Cc: <linux-mm@kvack.org>, Pekka Enberg <penberg@kernel.org>,
David Rientjes <rientjes@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Andrew Morton <akpm@linux-foundation.org>,
Noam Camus <noamc@ezchip.com>, <stable@vger.kernel.org>,
<linux-kernel@vger.kernel.org>,
<linux-snps-arc@lists.infradead.org>, <linux-parisc@vger.kernel>,
"Peter Zijlstra" <peterz@infradead.org>,
"James E.J. Bottomley" <jejb@parisc-linux.org>,
Helge Deller <deller@gmx.de>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>
Subject: Re: [PATCH] mm: slub: Ensure that slab_unlock() is atomic
Date: Wed, 9 Mar 2016 12:13:16 +0530 [thread overview]
Message-ID: <56DFC604.6070407@synopsys.com> (raw)
In-Reply-To: <alpine.DEB.2.20.1603081438020.4268@east.gentwo.org>
+CC linux-arch, parisc folks, PeterZ
On Wednesday 09 March 2016 02:10 AM, Christoph Lameter wrote:
> On Tue, 8 Mar 2016, Vineet Gupta wrote:
>
>> # set the bit
>> 80543b8e: ld_s r2,[r13,0] <--- (A) Finds PG_locked is set
>> 80543b90: or r3,r2,1 <--- (B) other core unlocks right here
>> 80543b94: st_s r3,[r13,0] <--- (C) sets PG_locked (overwrites unlock)
>
> Duh. Guess you need to take the spinlock also in the arch specific
> implementation of __bit_spin_unlock(). This is certainly not the only case
> in which we use the __ op to unlock.
__bit_spin_lock() by definition is *not* required to be atomic, bit_spin_lock() is
- so I don't think we need a spinlock there.
There is clearly a problem in slub code that it is pairing a test_and_set_bit()
with a __clear_bit(). Latter can obviously clobber former if they are not a single
instruction each unlike x86 or they use llock/scond kind of instructions where the
interim store from other core is detected and causes a retry of whole llock/scond
sequence.
BTW ARC is not the only arch which suffers from this - other arches potentially
also are. AFAIK PARISC also doesn't have atomic r-m-w and also uses a set of
external hashed spinlocks to protect the r-m-w sequences.
https://lkml.org/lkml/2014/6/1/178
So there also we have the same race because the outer spin lock is not taken for
slab_unlock() -> __bit_spin_lock() -> __clear_bit.
Arguably I can fix the ARC !LLSC variant of test_and_set_bit() to not set the bit
unconditionally but only if it was clear (PARISC does the same). That would be a
slight micro-optimization as we won't need another snoop transaction to make line
writable and that would also elide this problem, but I think there is a
fundamental problem here in slub which is pairing atomic and non atomic ops - for
performance reasons. It doesn't work on all arches and/or configurations.
> You need a true atomic op or you need to take the "spinlock" in all
> cases where you modify the bit.
No we don't in __bit_spin_lock and we already do in bit_spin_lock.
> If you take the lock in __bit_spin_unlock
> then the race cannot happen.
Of course it won't but that means we penalize all non atomic callers of the API
with a superfluous spinlock which is not require din first place given the
definition of API.
>> Are you convinced now !
>
> Yes, please fix your arch specific code.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2016-03-09 6:43 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-08 14:30 [PATCH] mm: slub: Ensure that slab_unlock() is atomic Vineet Gupta
2016-03-08 14:30 ` Vineet Gupta
2016-03-08 14:30 ` Vineet Gupta
2016-03-08 14:30 ` Vineet Gupta
2016-03-08 15:00 ` Christoph Lameter
2016-03-08 15:00 ` Christoph Lameter
2016-03-08 15:00 ` Christoph Lameter
2016-03-08 15:46 ` Vineet Gupta
2016-03-08 15:46 ` Vineet Gupta
2016-03-08 15:46 ` Vineet Gupta
2016-03-08 20:40 ` Christoph Lameter
2016-03-08 20:40 ` Christoph Lameter
2016-03-08 20:40 ` Christoph Lameter
2016-03-09 6:43 ` Vineet Gupta [this message]
2016-03-09 6:43 ` Vineet Gupta
2016-03-09 6:43 ` Vineet Gupta
2016-03-09 6:43 ` Vineet Gupta
2016-03-09 6:43 ` Vineet Gupta
2016-03-09 10:13 ` Peter Zijlstra
2016-03-09 10:13 ` Peter Zijlstra
2016-03-09 10:13 ` Peter Zijlstra
2016-03-09 10:13 ` Peter Zijlstra
2016-03-09 10:31 ` Peter Zijlstra
2016-03-09 10:31 ` Peter Zijlstra
2016-03-09 10:31 ` Peter Zijlstra
2016-03-09 11:12 ` Vineet Gupta
2016-03-09 11:12 ` Vineet Gupta
2016-03-09 11:12 ` Vineet Gupta
2016-03-09 11:12 ` Vineet Gupta
2016-03-09 11:12 ` Vineet Gupta
2016-03-09 11:00 ` Vineet Gupta
2016-03-09 11:00 ` Vineet Gupta
2016-03-09 11:00 ` Vineet Gupta
2016-03-09 11:00 ` Vineet Gupta
2016-03-09 11:00 ` Vineet Gupta
2016-03-09 11:40 ` Peter Zijlstra
2016-03-09 11:40 ` Peter Zijlstra
2016-03-09 11:40 ` Peter Zijlstra
2016-03-09 11:40 ` Peter Zijlstra
2016-03-09 11:53 ` Vineet Gupta
2016-03-09 11:53 ` Vineet Gupta
2016-03-09 11:53 ` Vineet Gupta
2016-03-09 11:53 ` Vineet Gupta
2016-03-09 11:53 ` Vineet Gupta
2016-03-09 12:22 ` Peter Zijlstra
2016-03-09 12:22 ` Peter Zijlstra
2016-03-09 12:22 ` Peter Zijlstra
2016-03-14 8:05 ` Vineet Gupta
2016-03-14 8:05 ` Vineet Gupta
2016-03-14 8:05 ` Vineet Gupta
2016-03-14 8:05 ` Vineet Gupta
2016-03-14 8:05 ` Vineet Gupta
2016-03-21 11:16 ` [tip:locking/urgent] bitops: Do not default to __clear_bit() for __clear_bit_unlock() tip-bot for Peter Zijlstra
2016-03-09 13:22 ` [PATCH] mm: slub: Ensure that slab_unlock() is atomic Vineet Gupta
2016-03-09 13:22 ` Vineet Gupta
2016-03-09 13:22 ` Vineet Gupta
2016-03-09 13:22 ` Vineet Gupta
2016-03-09 13:22 ` Vineet Gupta
2016-03-09 14:51 ` Peter Zijlstra
2016-03-09 14:51 ` Peter Zijlstra
2016-03-09 14:51 ` Peter Zijlstra
2016-03-10 5:51 ` Vineet Gupta
2016-03-10 5:51 ` Vineet Gupta
2016-03-10 5:51 ` Vineet Gupta
2016-03-10 5:51 ` Vineet Gupta
2016-03-10 5:51 ` Vineet Gupta
2016-03-10 9:10 ` Peter Zijlstra
2016-03-10 9:10 ` Peter Zijlstra
2016-03-10 9:10 ` Peter Zijlstra
2016-03-10 9:10 ` Peter Zijlstra
2016-03-08 15:32 ` Vlastimil Babka
2016-03-08 15:32 ` Vlastimil Babka
2016-03-08 15:32 ` Vlastimil Babka
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=56DFC604.6070407@synopsys.com \
--to=vineet.gupta1@synopsys.com \
--cc=akpm@linux-foundation.org \
--cc=cl@linux.com \
--cc=deller@gmx.de \
--cc=iamjoonsoo.kim@lge.com \
--cc=jejb@parisc-linux.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-parisc@vger.kernel \
--cc=linux-snps-arc@lists.infradead.org \
--cc=noamc@ezchip.com \
--cc=penberg@kernel.org \
--cc=peterz@infradead.org \
--cc=rientjes@google.com \
--cc=stable@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.