From: Paul Burton <paul.burton@imgtec.com>
To: Joshua Kinard <kumba@gentoo.org>
Cc: <linux-mips@linux-mips.org>, Ralf Baechle <ralf@linux-mips.org>,
"James Hogan" <james.hogan@imgtec.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
<linux-kernel@vger.kernel.org>,
"Maciej W. Rozycki" <macro@codesourcery.com>,
Markos Chandras <markos.chandras@imgtec.com>,
"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH 1/2] MIPS: Add barriers between dcache & icache flushes
Date: Tue, 1 Mar 2016 02:23:46 +0000 [thread overview]
Message-ID: <20160301022346.GA12741@NP-P-BURTON> (raw)
In-Reply-To: <56CB9C32.2010308@gentoo.org>
On Mon, Feb 22, 2016 at 06:39:30PM -0500, Joshua Kinard wrote:
> On 02/22/2016 13:09, Paul Burton wrote:
> > Index-based cache operations may be arbitrarily reordered by out of
> > order CPUs. Thus code which writes back the dcache & then invalidates
> > the icache using indexed cache ops must include a barrier between
> > operating on the 2 caches in order to prevent the scenario in which:
> >
> > - icache invalidation occurs.
> >
> > - icache fetch occurs, due to speculation.
> >
> > - dcache writeback occurs.
> >
> > If the above were allowed to happen then the icache would contain stale
> > data. Forcing the dcache writeback to complete before the icache
> > invalidation avoids this.
>
> Is there a particular symptom one should look for to check for this issue
> occurring? I haven't seen any odd effects on my SGI systems that appear to
> relate to this. I believe the R1x000 family resolves all hazards in hardware,
> so maybe this issue doesn't affect that CPU family?
>
> If not, let me know what to look or test for so I can check the patch out on my
> systems.
>
> Thanks!
>
> --J
Hi Joshua,
It depends upon the implementation of the CPU, but the arch spec (MIPS64
BIS, MD00087, revision 6.02) does say:
> When implementing multiple level of caches and where the hardware maintains
> the smaller cache as a proper subset of a larger cache (every address which is
> resident in the smaller cache is also resident in the larger cache; also known
> as the inclusion property). It is recommended that the CACHE instructions
> which operate on the larger, outer-level cache; must first operate on the
> smaller, inner-level cache. For example, a Hit_Writeback _Invalidate operation
> targeting the Secondary cache, must first operate on the primary data
> cache first. If the CACHE instruction implementation does not follow
> this policy then any software which flushes the caches must mimic this
> behavior. That is, the software sequences must first operate on the
> inner cache then operate on the outer cache. The software must place a
> SYNC instruction after the CACHE instruction whenever there are
> possible writebacks from the inner cache to ensure that the writeback
> data is resident in the outer cache before operating on the outer
> cache. If neither the CACHE instruction implementation nor the
> software cache flush sequence follow this policy, then the inclusion
> property of the caches can be broken, which might be a condition that
> the cache management hardware cannot properly deal with.
>
> When implementing multiple level of caches without the inclusion
> property, the use of a SYNC instruction after the CACHE instruction is
> still needed whenever writeback data has to be resident in the next
> level of memory hierarchy.
If data is to transfer from dcache -> L2 -> icache then it has to be
written back to the L2 which would hit that situation of the data
needing "to be resident in the next level of memory hierarchy" after the
dcache. That is guaranteed by the sync instruction:
> The CACHE instruction and the memory transactions which are sourced by
> the CACHE instruction, such as cache refill or cache writeback, obey
> the ordering and completion rules of the SYNC instruction.
This is more something newer cores that reorder more agressively would
be expected to hit, to the best of my knowledge.
Thanks,
Paul
WARNING: multiple messages have this Message-ID (diff)
From: Paul Burton <paul.burton@imgtec.com>
To: Joshua Kinard <kumba@gentoo.org>
Cc: linux-mips@linux-mips.org, Ralf Baechle <ralf@linux-mips.org>,
James Hogan <james.hogan@imgtec.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
linux-kernel@vger.kernel.org,
"Maciej W. Rozycki" <macro@codesourcery.com>,
Markos Chandras <markos.chandras@imgtec.com>,
"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH 1/2] MIPS: Add barriers between dcache & icache flushes
Date: Tue, 1 Mar 2016 02:23:46 +0000 [thread overview]
Message-ID: <20160301022346.GA12741@NP-P-BURTON> (raw)
Message-ID: <20160301022346.3xq23mFiLY_Hrk_pWWDU-rQZuHwzzmz7MlcfLRTkO94@z> (raw)
In-Reply-To: <56CB9C32.2010308@gentoo.org>
On Mon, Feb 22, 2016 at 06:39:30PM -0500, Joshua Kinard wrote:
> On 02/22/2016 13:09, Paul Burton wrote:
> > Index-based cache operations may be arbitrarily reordered by out of
> > order CPUs. Thus code which writes back the dcache & then invalidates
> > the icache using indexed cache ops must include a barrier between
> > operating on the 2 caches in order to prevent the scenario in which:
> >
> > - icache invalidation occurs.
> >
> > - icache fetch occurs, due to speculation.
> >
> > - dcache writeback occurs.
> >
> > If the above were allowed to happen then the icache would contain stale
> > data. Forcing the dcache writeback to complete before the icache
> > invalidation avoids this.
>
> Is there a particular symptom one should look for to check for this issue
> occurring? I haven't seen any odd effects on my SGI systems that appear to
> relate to this. I believe the R1x000 family resolves all hazards in hardware,
> so maybe this issue doesn't affect that CPU family?
>
> If not, let me know what to look or test for so I can check the patch out on my
> systems.
>
> Thanks!
>
> --J
Hi Joshua,
It depends upon the implementation of the CPU, but the arch spec (MIPS64
BIS, MD00087, revision 6.02) does say:
> When implementing multiple level of caches and where the hardware maintains
> the smaller cache as a proper subset of a larger cache (every address which is
> resident in the smaller cache is also resident in the larger cache; also known
> as the inclusion property). It is recommended that the CACHE instructions
> which operate on the larger, outer-level cache; must first operate on the
> smaller, inner-level cache. For example, a Hit_Writeback _Invalidate operation
> targeting the Secondary cache, must first operate on the primary data
> cache first. If the CACHE instruction implementation does not follow
> this policy then any software which flushes the caches must mimic this
> behavior. That is, the software sequences must first operate on the
> inner cache then operate on the outer cache. The software must place a
> SYNC instruction after the CACHE instruction whenever there are
> possible writebacks from the inner cache to ensure that the writeback
> data is resident in the outer cache before operating on the outer
> cache. If neither the CACHE instruction implementation nor the
> software cache flush sequence follow this policy, then the inclusion
> property of the caches can be broken, which might be a condition that
> the cache management hardware cannot properly deal with.
>
> When implementing multiple level of caches without the inclusion
> property, the use of a SYNC instruction after the CACHE instruction is
> still needed whenever writeback data has to be resident in the next
> level of memory hierarchy.
If data is to transfer from dcache -> L2 -> icache then it has to be
written back to the L2 which would hit that situation of the data
needing "to be resident in the next level of memory hierarchy" after the
dcache. That is guaranteed by the sync instruction:
> The CACHE instruction and the memory transactions which are sourced by
> the CACHE instruction, such as cache refill or cache writeback, obey
> the ordering and completion rules of the SYNC instruction.
This is more something newer cores that reorder more agressively would
be expected to hit, to the best of my knowledge.
Thanks,
Paul
next prev parent reply other threads:[~2016-03-01 2:23 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-22 18:09 [PATCH 1/2] MIPS: Add barriers between dcache & icache flushes Paul Burton
2016-02-22 18:09 ` Paul Burton
2016-02-22 18:09 ` [PATCH 2/2] MIPS: Flush highmem pages from dcache in __flush_icache_page Paul Burton
2016-02-22 18:09 ` Paul Burton
2016-02-24 8:02 ` Lars Persson
2016-02-24 8:02 ` Lars Persson
2016-02-22 23:39 ` [PATCH 1/2] MIPS: Add barriers between dcache & icache flushes Joshua Kinard
2016-03-01 2:23 ` Paul Burton [this message]
2016-03-01 2:23 ` Paul Burton
2016-02-23 0:02 ` Florian Fainelli
2016-03-01 2:27 ` Paul Burton
2016-03-01 2:27 ` Paul Burton
2023-03-06 10:28 ` Sven Eckelmann
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=20160301022346.GA12741@NP-P-BURTON \
--to=paul.burton@imgtec.com \
--cc=james.hogan@imgtec.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=kumba@gentoo.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=macro@codesourcery.com \
--cc=markos.chandras@imgtec.com \
--cc=paul.gortmaker@windriver.com \
--cc=ralf@linux-mips.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox