From mboxrd@z Thu Jan 1 00:00:00 1970 From: Leonid Yegoshin Date: Wed, 13 Jan 2016 22:26:16 +0000 Subject: Re: [v3,11/41] mips: reuse asm-generic/barrier.h Message-Id: <5696CF08.8080700@imgtec.com> List-Id: References: <1452426622-4471-12-git-send-email-mst@redhat.com> <56945366.2090504@imgtec.com> <20160112092711.GP6344@twins.programming.kicks-ass.net> <20160112102555.GV6373@twins.programming.kicks-ass.net> <20160112104012.GW6373@twins.programming.kicks-ass.net> <20160112114111.GB15737@arm.com> <569565DA.2010903@imgtec.com> <20160113104516.GE25458@arm.com> In-Reply-To: <20160113104516.GE25458@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Will Deacon Cc: Peter Zijlstra , "Michael S. Tsirkin" , linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Andrew Cooper , Russell King - ARM Linux , virtualization@lists.linux-foundation.org, Stefano Stabellini , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Joe Perches , David Miller , linux-ia64@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, sparclinux@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-metag@vger.kernel.org, linux-mips@linux-mips.org, x86@kernel.org, user-mode-linux-devel@lists.sourceforge.net, adi-buildroot-devel@lists.sourceforge.net, linux-sh@vg On 01/13/2016 02:45 AM, Will Deacon wrote: >> > I don't think the address dependency is enough on its own. By that > reasoning, the following variant (WRC+addr+addr) would work too: > > > P0: > Wx = 1 > > P1: > Rx = 1 >
> Wy = 1 > > P2: > Ry = 1 >
> Rx = 0 > > > So are you saying that this is also forbidden? > Imagine that P0 and P1 are two threads that share a store buffer. What > then? OK, I collected answers and it is: In MIPS R6 this test passes OK, I mean - P2: Rx = 1 if Ry is read as 1. By design. However, it is unclear that happens in MIPS R2 1004K. Moreover, there are voices against guarantee that it will be in future and that voices point me to Documentation/memory-barriers.txt section "DATA DEPENDENCY BARRIERS" examples which require SYNC_RMB between loading address/index and using that for loading data based on that address or index for shared data (look on CPU2 pseudo-code): > To deal with this, a data dependency barrier or better must be inserted > between the address load and the data load: > > CPU 1 CPU 2 > ======== =======> { A = 1, B = 2, C = 3, P = &A, Q = &C } > B = 4; > > WRITE_ONCE(P, &B); > Q = READ_ONCE(P); > <----------- > SYNC_RMB is here > D = *Q; ... > Another example of where data dependency barriers might be required is > where a > number is read from memory and then used to calculate the index for an > array > access: > > CPU 1 CPU 2 > ======== =======> { M[0] = 1, M[1] = 2, M[3] = 3, P = 0, Q = 3 } > M[1] = 4; > > WRITE_ONCE(P, 1); > Q = READ_ONCE(P); > <------------ > SYNC_RMB is here > D = M[Q]; That voices say that there is a legitimate reason to relax HW here for performance if SYNC_RMB is needed anyway to work with this sequence of shared data. And all that is out-of-topic here in my mind. I just want to be sure that this patchset still provides a use of a specific lightweight SYNCs on MIPS vs bold and heavy generalized "SYNC 0" in any case. - Leonid. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755716AbcAMW01 (ORCPT ); Wed, 13 Jan 2016 17:26:27 -0500 Received: from mailapp01.imgtec.com ([195.59.15.196]:7918 "EHLO mailapp01.imgtec.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750967AbcAMW0W (ORCPT ); Wed, 13 Jan 2016 17:26:22 -0500 Message-ID: <5696CF08.8080700@imgtec.com> Date: Wed, 13 Jan 2016 14:26:16 -0800 From: Leonid Yegoshin User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Will Deacon CC: Peter Zijlstra , "Michael S. Tsirkin" , , Arnd Bergmann , , Andrew Cooper , Russell King - ARM Linux , , Stefano Stabellini , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Joe Perches , David Miller , , , , , , , , , , , , , , "Ralf Baechle" , Ingo Molnar , , , Michael Ellerman , Paul McKenney Subject: Re: [v3,11/41] mips: reuse asm-generic/barrier.h References: <1452426622-4471-12-git-send-email-mst@redhat.com> <56945366.2090504@imgtec.com> <20160112092711.GP6344@twins.programming.kicks-ass.net> <20160112102555.GV6373@twins.programming.kicks-ass.net> <20160112104012.GW6373@twins.programming.kicks-ass.net> <20160112114111.GB15737@arm.com> <569565DA.2010903@imgtec.com> <20160113104516.GE25458@arm.com> In-Reply-To: <20160113104516.GE25458@arm.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.20.3.92] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/13/2016 02:45 AM, Will Deacon wrote: >> > I don't think the address dependency is enough on its own. By that > reasoning, the following variant (WRC+addr+addr) would work too: > > > P0: > Wx = 1 > > P1: > Rx == 1 >
> Wy = 1 > > P2: > Ry == 1 >
> Rx = 0 > > > So are you saying that this is also forbidden? > Imagine that P0 and P1 are two threads that share a store buffer. What > then? OK, I collected answers and it is: In MIPS R6 this test passes OK, I mean - P2: Rx = 1 if Ry is read as 1. By design. However, it is unclear that happens in MIPS R2 1004K. Moreover, there are voices against guarantee that it will be in future and that voices point me to Documentation/memory-barriers.txt section "DATA DEPENDENCY BARRIERS" examples which require SYNC_RMB between loading address/index and using that for loading data based on that address or index for shared data (look on CPU2 pseudo-code): > To deal with this, a data dependency barrier or better must be inserted > between the address load and the data load: > > CPU 1 CPU 2 > =============== =============== > { A == 1, B == 2, C = 3, P == &A, Q == &C } > B = 4; > > WRITE_ONCE(P, &B); > Q = READ_ONCE(P); > <----------- > SYNC_RMB is here > D = *Q; ... > Another example of where data dependency barriers might be required is > where a > number is read from memory and then used to calculate the index for an > array > access: > > CPU 1 CPU 2 > =============== =============== > { M[0] == 1, M[1] == 2, M[3] = 3, P == 0, Q == 3 } > M[1] = 4; > > WRITE_ONCE(P, 1); > Q = READ_ONCE(P); > <------------ > SYNC_RMB is here > D = M[Q]; That voices say that there is a legitimate reason to relax HW here for performance if SYNC_RMB is needed anyway to work with this sequence of shared data. And all that is out-of-topic here in my mind. I just want to be sure that this patchset still provides a use of a specific lightweight SYNCs on MIPS vs bold and heavy generalized "SYNC 0" in any case. - Leonid. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Leonid Yegoshin Subject: Re: [v3,11/41] mips: reuse asm-generic/barrier.h Date: Wed, 13 Jan 2016 14:26:16 -0800 Message-ID: <5696CF08.8080700@imgtec.com> References: <1452426622-4471-12-git-send-email-mst@redhat.com> <56945366.2090504@imgtec.com> <20160112092711.GP6344@twins.programming.kicks-ass.net> <20160112102555.GV6373@twins.programming.kicks-ass.net> <20160112104012.GW6373@twins.programming.kicks-ass.net> <20160112114111.GB15737@arm.com> <569565DA.2010903@imgtec.com> <20160113104516.GE25458@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20160113104516.GE25458@arm.com> Sender: linux-ia64-owner@vger.kernel.org List-Archive: List-Post: To: Will Deacon Cc: Peter Zijlstra , "Michael S. Tsirkin" , linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Andrew Cooper , Russell King - ARM Linux , virtualization@lists.linux-foundation.org, Stefano Stabellini , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Joe Perches , David Miller , linux-ia64@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, sparclinux@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-metag@vger.kernel.org, linux-mips@linux-mips.org, x86@kernel.org, user-mode-linux-devel@lists.sourceforge.net, adi-buildroot-devel@lists.sourceforge.net, linux-sh@vg List-ID: On 01/13/2016 02:45 AM, Will Deacon wrote: >> > I don't think the address dependency is enough on its own. By that > reasoning, the following variant (WRC+addr+addr) would work too: > > > P0: > Wx = 1 > > P1: > Rx == 1 >
> Wy = 1 > > P2: > Ry == 1 >
> Rx = 0 > > > So are you saying that this is also forbidden? > Imagine that P0 and P1 are two threads that share a store buffer. What > then? OK, I collected answers and it is: In MIPS R6 this test passes OK, I mean - P2: Rx = 1 if Ry is read as 1. By design. However, it is unclear that happens in MIPS R2 1004K. Moreover, there are voices against guarantee that it will be in future and that voices point me to Documentation/memory-barriers.txt section "DATA DEPENDENCY BARRIERS" examples which require SYNC_RMB between loading address/index and using that for loading data based on that address or index for shared data (look on CPU2 pseudo-code): > To deal with this, a data dependency barrier or better must be inserted > between the address load and the data load: > > CPU 1 CPU 2 > =============== =============== > { A == 1, B == 2, C = 3, P == &A, Q == &C } > B = 4; > > WRITE_ONCE(P, &B); > Q = READ_ONCE(P); > <----------- > SYNC_RMB is here > D = *Q; ... > Another example of where data dependency barriers might be required is > where a > number is read from memory and then used to calculate the index for an > array > access: > > CPU 1 CPU 2 > =============== =============== > { M[0] == 1, M[1] == 2, M[3] = 3, P == 0, Q == 3 } > M[1] = 4; > > WRITE_ONCE(P, 1); > Q = READ_ONCE(P); > <------------ > SYNC_RMB is here > D = M[Q]; That voices say that there is a legitimate reason to relax HW here for performance if SYNC_RMB is needed anyway to work with this sequence of shared data. And all that is out-of-topic here in my mind. I just want to be sure that this patchset still provides a use of a specific lightweight SYNCs on MIPS vs bold and heavy generalized "SYNC 0" in any case. - Leonid. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mailapp01.imgtec.com ([195.59.15.196]:7918 "EHLO mailapp01.imgtec.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750967AbcAMW0W (ORCPT ); Wed, 13 Jan 2016 17:26:22 -0500 Message-ID: <5696CF08.8080700@imgtec.com> Date: Wed, 13 Jan 2016 14:26:16 -0800 From: Leonid Yegoshin MIME-Version: 1.0 Subject: Re: [v3,11/41] mips: reuse asm-generic/barrier.h References: <1452426622-4471-12-git-send-email-mst@redhat.com> <56945366.2090504@imgtec.com> <20160112092711.GP6344@twins.programming.kicks-ass.net> <20160112102555.GV6373@twins.programming.kicks-ass.net> <20160112104012.GW6373@twins.programming.kicks-ass.net> <20160112114111.GB15737@arm.com> <569565DA.2010903@imgtec.com> <20160113104516.GE25458@arm.com> In-Reply-To: <20160113104516.GE25458@arm.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-arch-owner@vger.kernel.org List-ID: To: Will Deacon Cc: Peter Zijlstra , "Michael S. Tsirkin" , linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Andrew Cooper , Russell King - ARM Linux , virtualization@lists.linux-foundation.org, Stefano Stabellini , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Joe Perches , David Miller , linux-ia64@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, sparclinux@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-metag@vger.kernel.org, linux-mips@linux-mips.org, x86@kernel.org, user-mode-linux-devel@lists.sourceforge.net, adi-buildroot-devel@lists.sourceforge.net, linux-sh@vger.kernel.org, linux-xtensa@linux-xtensa.org, xen-devel@lists.xenproject.org, Ralf Baechle , Ingo Molnar , ddaney.cavm@gmail.com, james.hogan@imgtec.com, Michael Ellerman , Paul McKenney Message-ID: <20160113222616.1uxZPwl6O1l76wVH0BwWZE7Km8tKTh1VPka32QuNQEQ@z> On 01/13/2016 02:45 AM, Will Deacon wrote: >> > I don't think the address dependency is enough on its own. By that > reasoning, the following variant (WRC+addr+addr) would work too: > > > P0: > Wx = 1 > > P1: > Rx == 1 >
> Wy = 1 > > P2: > Ry == 1 >
> Rx = 0 > > > So are you saying that this is also forbidden? > Imagine that P0 and P1 are two threads that share a store buffer. What > then? OK, I collected answers and it is: In MIPS R6 this test passes OK, I mean - P2: Rx = 1 if Ry is read as 1. By design. However, it is unclear that happens in MIPS R2 1004K. Moreover, there are voices against guarantee that it will be in future and that voices point me to Documentation/memory-barriers.txt section "DATA DEPENDENCY BARRIERS" examples which require SYNC_RMB between loading address/index and using that for loading data based on that address or index for shared data (look on CPU2 pseudo-code): > To deal with this, a data dependency barrier or better must be inserted > between the address load and the data load: > > CPU 1 CPU 2 > =============== =============== > { A == 1, B == 2, C = 3, P == &A, Q == &C } > B = 4; > > WRITE_ONCE(P, &B); > Q = READ_ONCE(P); > <----------- > SYNC_RMB is here > D = *Q; ... > Another example of where data dependency barriers might be required is > where a > number is read from memory and then used to calculate the index for an > array > access: > > CPU 1 CPU 2 > =============== =============== > { M[0] == 1, M[1] == 2, M[3] = 3, P == 0, Q == 3 } > M[1] = 4; > > WRITE_ONCE(P, 1); > Q = READ_ONCE(P); > <------------ > SYNC_RMB is here > D = M[Q]; That voices say that there is a legitimate reason to relax HW here for performance if SYNC_RMB is needed anyway to work with this sequence of shared data. And all that is out-of-topic here in my mind. I just want to be sure that this patchset still provides a use of a specific lightweight SYNCs on MIPS vs bold and heavy generalized "SYNC 0" in any case. - Leonid. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Leonid.Yegoshin@imgtec.com (Leonid Yegoshin) Date: Wed, 13 Jan 2016 14:26:16 -0800 Subject: [v3,11/41] mips: reuse asm-generic/barrier.h In-Reply-To: <20160113104516.GE25458@arm.com> References: <1452426622-4471-12-git-send-email-mst@redhat.com> <56945366.2090504@imgtec.com> <20160112092711.GP6344@twins.programming.kicks-ass.net> <20160112102555.GV6373@twins.programming.kicks-ass.net> <20160112104012.GW6373@twins.programming.kicks-ass.net> <20160112114111.GB15737@arm.com> <569565DA.2010903@imgtec.com> <20160113104516.GE25458@arm.com> Message-ID: <5696CF08.8080700@imgtec.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 01/13/2016 02:45 AM, Will Deacon wrote: >> > I don't think the address dependency is enough on its own. By that > reasoning, the following variant (WRC+addr+addr) would work too: > > > P0: > Wx = 1 > > P1: > Rx == 1 >
> Wy = 1 > > P2: > Ry == 1 >
> Rx = 0 > > > So are you saying that this is also forbidden? > Imagine that P0 and P1 are two threads that share a store buffer. What > then? OK, I collected answers and it is: In MIPS R6 this test passes OK, I mean - P2: Rx = 1 if Ry is read as 1. By design. However, it is unclear that happens in MIPS R2 1004K. Moreover, there are voices against guarantee that it will be in future and that voices point me to Documentation/memory-barriers.txt section "DATA DEPENDENCY BARRIERS" examples which require SYNC_RMB between loading address/index and using that for loading data based on that address or index for shared data (look on CPU2 pseudo-code): > To deal with this, a data dependency barrier or better must be inserted > between the address load and the data load: > > CPU 1 CPU 2 > =============== =============== > { A == 1, B == 2, C = 3, P == &A, Q == &C } > B = 4; > > WRITE_ONCE(P, &B); > Q = READ_ONCE(P); > <----------- > SYNC_RMB is here > D = *Q; ... > Another example of where data dependency barriers might be required is > where a > number is read from memory and then used to calculate the index for an > array > access: > > CPU 1 CPU 2 > =============== =============== > { M[0] == 1, M[1] == 2, M[3] = 3, P == 0, Q == 3 } > M[1] = 4; > > WRITE_ONCE(P, 1); > Q = READ_ONCE(P); > <------------ > SYNC_RMB is here > D = M[Q]; That voices say that there is a legitimate reason to relax HW here for performance if SYNC_RMB is needed anyway to work with this sequence of shared data. And all that is out-of-topic here in my mind. I just want to be sure that this patchset still provides a use of a specific lightweight SYNCs on MIPS vs bold and heavy generalized "SYNC 0" in any case. - Leonid.