From: Fabrice Bellard <fabrice@bellard.org>
To: edgar.iglesias@gmail.com
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [4352] Make sure we flush cached blocks from the tb-jmp-cache when we replace valid tlb entries .
Date: Sat, 24 May 2008 01:31:21 +0200 [thread overview]
Message-ID: <483753C9.2030009@bellard.org> (raw)
In-Reply-To: <E1JtImc-00068n-SB@cvs.savannah.gnu.org>
Please revert this patch: it has a major performance hit because the
tb_jmp_cache is flushed too often. Flushing the tb_jmp_cache when
overriding a tlb_cache entry is not necessary, provided a given virtual
address is always remapped at the same physical address with the same
rights, which is the assumed API here. Detecting possible
inconsistencies is useful, but I am sure there is a solution without
such a performance hit.
Please avoid doing such modifications without doing regressions tests on
performance (e.g. a compilation with gcc).
Regards,
Fabrice.
Edgar E. Iglesias wrote:
> Revision: 4352
> http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4352
> Author: edgar_igl
> Date: 2008-05-06 08:44:21 +0000 (Tue, 06 May 2008)
>
> Log Message:
> -----------
> Make sure we flush cached blocks from the tb-jmp-cache when we replace valid tlb entries.
>
> Modified Paths:
> --------------
> trunk/exec.c
>
> Modified: trunk/exec.c
> ===================================================================
> --- trunk/exec.c 2008-05-06 08:38:22 UTC (rev 4351)
> +++ trunk/exec.c 2008-05-06 08:44:21 UTC (rev 4352)
> @@ -1366,6 +1366,21 @@
>
> #if !defined(CONFIG_USER_ONLY)
>
> +static inline void tlb_flush_jmp_cache(CPUState *env, target_ulong addr)
> +{
> + unsigned int i;
> +
> + /* Discard jump cache entries for any tb which might potentially
> + overlap the flushed page. */
> + i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
> + memset (&env->tb_jmp_cache[i], 0,
> + TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
> +
> + i = tb_jmp_cache_hash_page(addr);
> + memset (&env->tb_jmp_cache[i], 0,
> + TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
> +}
> +
> /* NOTE: if flush_global is true, also flush global entries (not
> implemented yet) */
> void tlb_flush(CPUState *env, int flush_global)
> @@ -1428,7 +1443,6 @@
> void tlb_flush_page(CPUState *env, target_ulong addr)
> {
> int i;
> - TranslationBlock *tb;
>
> #if defined(DEBUG_TLB)
> printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
> @@ -1448,14 +1462,8 @@
> #endif
> #endif
>
> - /* Discard jump cache entries for any tb which might potentially
> - overlap the flushed page. */
> - i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
> - memset (&env->tb_jmp_cache[i], 0, TB_JMP_PAGE_SIZE * sizeof(tb));
> + tlb_flush_jmp_cache(env, addr);
>
> - i = tb_jmp_cache_hash_page(addr);
> - memset (&env->tb_jmp_cache[i], 0, TB_JMP_PAGE_SIZE * sizeof(tb));
> -
> #if !defined(CONFIG_SOFTMMU)
> if (addr < MMAP_AREA_END)
> munmap((void *)addr, TARGET_PAGE_SIZE);
> @@ -1706,6 +1714,10 @@
> } else {
> te->addr_read = -1;
> }
> +
> + if (te->addr_code != -1) {
> + tlb_flush_jmp_cache(env, te->addr_code);
> + }
> if (prot & PAGE_EXEC) {
> te->addr_code = address;
> } else {
>
>
>
>
>
next prev parent reply other threads:[~2008-05-23 23:32 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-06 8:44 [Qemu-devel] [4352] Make sure we flush cached blocks from the tb-jmp-cache when we replace valid tlb entries Edgar E. Iglesias
2008-05-23 23:31 ` Fabrice Bellard [this message]
2008-05-24 18:01 ` Edgar E. Iglesias
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=483753C9.2030009@bellard.org \
--to=fabrice@bellard.org \
--cc=edgar.iglesias@gmail.com \
--cc=qemu-devel@nongnu.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.