From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57847) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YqPYA-0001DQ-KY for qemu-devel@nongnu.org; Thu, 07 May 2015 13:25:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YqPY6-0001ZH-J3 for qemu-devel@nongnu.org; Thu, 07 May 2015 13:25:30 -0400 Received: from mail-qc0-x236.google.com ([2607:f8b0:400d:c01::236]:35309) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YqPY6-0001Z3-FD for qemu-devel@nongnu.org; Thu, 07 May 2015 13:25:26 -0400 Received: by qcbgu10 with SMTP id gu10so24671983qcb.2 for ; Thu, 07 May 2015 10:25:26 -0700 (PDT) Sender: Richard Henderson Message-ID: <554BA001.2030905@twiddle.net> Date: Thu, 07 May 2015 10:25:21 -0700 From: Richard Henderson MIME-Version: 1.0 References: <1430926687-25875-1-git-send-email-a.rigo@virtualopensystems.com> <1430926687-25875-3-git-send-email-a.rigo@virtualopensystems.com> In-Reply-To: <1430926687-25875-3-git-send-email-a.rigo@virtualopensystems.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC 2/5] Add new TLB_EXCL flag List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alvise Rigo , qemu-devel@nongnu.org Cc: mttcg@greensocs.com, jani.kokkonen@huawei.com, tech@virtualopensystems.com, claudio.fontana@huawei.com On 05/06/2015 08:38 AM, Alvise Rigo wrote: > Add a new flag for the TLB entries to force all the accesses made to a > page to follow the slow-path. > > Mark the accessed page as dirty to invalidate any pending operation of > LL/SC. > > Suggested-by: Jani Kokkonen > Suggested-by: Claudio Fontana > Signed-off-by: Alvise Rigo > --- > cputlb.c | 7 ++++++- > include/exec/cpu-all.h | 1 + > softmmu_template.h | 48 +++++++++++++++++++++++++++++++++++++++++++++++- > 3 files changed, 54 insertions(+), 2 deletions(-) > > diff --git a/cputlb.c b/cputlb.c > index 38f2151..3e4ccba 100644 > --- a/cputlb.c > +++ b/cputlb.c > @@ -324,7 +324,12 @@ void tlb_set_page(CPUState *cpu, target_ulong vaddr, > + xlat)) { > te->addr_write = address | TLB_NOTDIRTY; > } else { > - te->addr_write = address; > + if (!cpu_physical_memory_excl_is_dirty(section->mr->ram_addr > + + xlat)) { > + te->addr_write = address | TLB_EXCL; > + } else { > + te->addr_write = address; > + } I don't see that you initialize this new bitmap to all ones? That would generate exclusive accesses on all of memory until each unit (page?) is touched. Perhaps you should invert the sense of your use of the dirty bitmap, such that a set bit means that some vcpu is monitoring the unit, and no vcpu has written to the unit? Your nesting above would seem to fail when TLB_NOTDIRTY needs to be set as well. > @@ -262,7 +263,7 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx, > uintptr_t haddr; > DATA_TYPE res; > > - /* Adjust the given return address. */ > + /* Adjust the given return address. */ > retaddr -= GETPC_ADJ; Careful... > @@ -387,6 +388,7 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val, > int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); > target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_write; > uintptr_t haddr; > + bool to_excl_mem = false; > > /* Adjust the given return address. */ > retaddr -= GETPC_ADJ; > @@ -406,6 +408,14 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val, > tlb_addr = env->tlb_table[mmu_idx][index].addr_write; > } > > + if (unlikely(tlb_addr & TLB_EXCL && > + !(tlb_addr & ~(TARGET_PAGE_MASK | TLB_EXCL)))) { This is (tlb_addr & ~TARGET_PAGE_MASK) == TLB_EXCL, but... > + /* The slow-path has been forced since we are reading a page used for a > + * load-link operation. */ > + to_excl_mem = true; > + goto skip_io; I'm not fond of either the boolean or the goto. > + } > + > /* Handle an IO access. */ > if (unlikely(tlb_addr & ~TARGET_PAGE_MASK)) { Nesting your unlikely code under one unlikely test seems better. And would be more likely to work in the case you need to handle both TLB_NOTDIRTY and TLB_EXCL. r~