Linux MIPS Architecture development
 help / color / mirror / Atom feed
From: Ralf Baechle <ralf@linux-mips.org>
To: "Maciej W. Rozycki" <macro@codesourcery.com>
Cc: linux-mips@linux-mips.org
Subject: Re: [PATCH] MIPS: copy_to_user_page: Avoid ptrace(2) I-cache incoherency
Date: Fri, 21 Mar 2014 11:07:27 +0100	[thread overview]
Message-ID: <20140321100727.GJ4365@linux-mips.org> (raw)
In-Reply-To: <alpine.DEB.1.10.1311071758410.21686@tp.orcam.me.uk>

On Thu, Nov 07, 2013 at 06:35:54PM +0000, Maciej W. Rozycki wrote:

> We currently support no MIPS processor that has its I-cache coherent with 
> the D-cache, no such processor may even exist.  We apparently have two 
> configurations that have fully coherent D-caches and therefore set 
> cpu_has_ic_fills_f_dc, and these are the Alchemy and NetLogic processor 
> families.  I have checked relevant CPU documentation I was able to track 
> down and in both cases the respective documents[1][2] clearly state that 
> the I-cache provides no hardware coherency and whenever instructions in 
> memory are modified then the I-cache has to be synchronized by software 
> even though the D-caches are fully coherent.

No, cpu_has_ic_fills_f_dc doesn't mean the D-cache is coherent but rather
that the I-cache is refilled from the D-cache if there was a hit.  This
means there is no need to write back the D-cache to S-cache or even memory
which is saving some time.

> Therefore we cannot ever avoid the call to flush_cache_page in 
> copy_to_user_page and here is a change that reflects this observation.  
> The implementation of flush_cache_page may then choose freely whether it 
> needs to perform a full cache synchronization with D-cache writeback and 
> invalidation requests or whether a lone I-cache invalidation will suffice.  
> The c-r4k.c implementation already respects the setting of 
> cpu_has_ic_fills_f_dc and avoids touching the D-cache unless necessary.
> 
> The lack of I-cache synchronization is typically seen in debugging 
> sessions e.g. with GDB where software breakpoints are used.  When such a 
> breakpoint is hit and subsequently replaced using a ptrace(2) call with 
> the original instruction, the BREAK instruction previously executed 
> sometimes remains in the I-cache and causes the breakpoint just removed to 
> hit again regardless, resulting in a spurious SIGTRAP signal delivery that 
> debuggers typically complain about (e.g. "Program received signal SIGTRAP, 
> Trace/breakpoint trap" in the case of GDB).  Of course the I-cache line 
> containing the BREAK instruction may have since been randomly replaced, in 
> which case no problem occurs.
> 
> [1] "AMD Alchemy Au1200 Processor Data Book", AMD Alchemy, January, 2005, 
>     Publication ID: 32798A
> 
> [2] "XLP Processor Family Programming Reference Manual", NetLogic 
>     Microsystems, Revision Level 1.10, February, 2011, Document Number 
>     10724V110PM-CR (regrettably not publicly available)
> 
> Signed-off-by: Maciej W. Rozycki <macro@codesourcery.com>
> ---
> Ralf,
> 
>  Please apply.  I've seen these SIGTRAPs in some NetLogic GDB testing and 
> the removal of this cpu_has_ic_fills_f_dc condition from copy_to_user_page 
> is really necessary; also the Au1200 document is very explicit about the 
> requirement of I-cache invalidation in software (see Section 2.3.7.3 
> "Instruction Cache Coherency").

You found a bug and yes, the fix you sent improves things a bit.  But
there is also the cache on a cache coherent system where a page might
be marked for a delayed cache flush with SetPageDcacheDirty(), then
flushed by flush_cache_page() before eventually the delayed cacheflush
flushes it once more for a good meassure.

What do you think about below patch to also deal with the duplicate flushing?

  Ralf

 arch/mips/mm/init.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index 6b59617..80072ef 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -227,13 +227,13 @@ void copy_to_user_page(struct vm_area_struct *vma,
 		void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
 		memcpy(vto, src, len);
 		kunmap_coherent();
+		if (vma->vm_flags & VM_EXEC)
+			flush_cache_page(vma, vaddr, page_to_pfn(page));
 	} else {
 		memcpy(dst, src, len);
 		if (cpu_has_dc_aliases)
 			SetPageDcacheDirty(page);
 	}
-	if ((vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc)
-		flush_cache_page(vma, vaddr, page_to_pfn(page));
 }
 
 void copy_from_user_page(struct vm_area_struct *vma,

  parent reply	other threads:[~2014-03-21 10:07 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-07 18:35 [PATCH] MIPS: copy_to_user_page: Avoid ptrace(2) I-cache incoherency Maciej W. Rozycki
2013-11-07 18:35 ` Maciej W. Rozycki
2014-03-21 10:07 ` Ralf Baechle [this message]
2014-03-21 16:56   ` David Daney
2014-11-13 21:50   ` Maciej W. Rozycki
2014-11-13 21:50     ` Maciej W. Rozycki

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=20140321100727.GJ4365@linux-mips.org \
    --to=ralf@linux-mips.org \
    --cc=linux-mips@linux-mips.org \
    --cc=macro@codesourcery.com \
    /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