From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53993) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJ1sW-0004cc-B7 for qemu-devel@nongnu.org; Tue, 12 Jan 2016 11:33:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aJ1sS-0006aL-7O for qemu-devel@nongnu.org; Tue, 12 Jan 2016 11:33:04 -0500 Received: from mail-wm0-x236.google.com ([2a00:1450:400c:c09::236]:33771) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJ1sR-0006a1-To for qemu-devel@nongnu.org; Tue, 12 Jan 2016 11:33:00 -0500 Received: by mail-wm0-x236.google.com with SMTP id f206so261327244wmf.0 for ; Tue, 12 Jan 2016 08:32:58 -0800 (PST) References: <87r3hx6040.fsf@linaro.org> <5695081C.1070101@greensocs.com> <87vb6yde8g.fsf@linaro.org> <5695196E.70902@redhat.com> <87twmidbdb.fsf@linaro.org> <569527A0.5080502@redhat.com> From: Alex =?utf-8?Q?Benn=C3=A9e?= In-reply-to: <569527A0.5080502@redhat.com> Date: Tue, 12 Jan 2016 16:32:56 +0000 Message-ID: <87si22dah3.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] MTTCG sync-up call today? List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: mttcg@greensocs.com, Mark Burton , Paolo Bonzini , alvise rigo , QEMU Developers , KONRAD Frederic Paolo Bonzini writes: > On 12/01/2016 17:13, Alex Bennée wrote: >> #4 0x00005555556e5b06 in tb_invalidate_phys_range (start=start@entry=0, end=end@entry=4096) at /home/alex/lsrc/qemu/qemu.git/translate-all.c:1303 >> #5 0x00005555556dbe42 in invalidate_and_set_dirty (mr=mr@entry=0x555556571800, addr=0, length=length@entry=4096) at /home/alex/lsrc/qemu/qemu.git/exec.c:2420 >> #6 0x00005555556e1890 in address_space_unmap (as=as@entry=0x555555ff7000 , buffer=, len=, >> is_write=is_write@entry=1, access_len=access_len@entry=4096) at /home/alex/lsrc/qemu/qemu.git/exec.c:2933 >> #7 0x00005555556e19bf in cpu_physical_memory_unmap (buffer=, len=, is_write=is_write@entry=1, access_len=access_len@entry=4096) >> at /home/alex/lsrc/qemu/qemu.git/exec.c:2962 >> #8 0x000055555578219c in virtqueue_unmap_sg (elem=elem@entry=0x7ffe782c7cf0, len=len@entry=4097, vq=0x555556e6f020) >> at /home/alex/lsrc/qemu/qemu.git/hw/virtio/virtio.c:257 >> #9 0x0000555555782ac0 in virtqueue_fill (vq=vq@entry=0x555556e6f020, elem=elem@entry=0x7ffe782c7cf0, len=4097, idx=idx@entry=0) >> at /home/alex/lsrc/qemu/qemu.git/hw/virtio/virtio.c:282 >> #10 0x0000555555782ccf in virtqueue_push (vq=0x555556e6f020, elem=elem@entry=0x7ffe782c7cf0, len=) >> at /home/alex/lsrc/qemu/qemu.git/hw/virtio/virtio.c:308 >> #11 0x000055555573451a in virtio_blk_complete_request (req=0x7ffe782c7ce0, status=) at /home/alex/lsrc/qemu/qemu.git/hw/block/virtio-blk.c:58 >> #12 0x0000555555734a13 in virtio_blk_req_complete (status=0 '\000', req=0x7ffe782c7ce0) at /home/alex/lsrc/qemu/qemu.git/hw/block/virtio-blk.c:64 >> #13 virtio_blk_rw_complete (opaque=, ret=0) at /home/alex/lsrc/qemu/qemu.git/hw/block/virtio-blk.c:122 >> ---Type to continue, or q to quit--- >> #14 0x0000555555a2d822 in bdrv_co_complete (acb=0x7ffe780189c0) at block/io.c:2122 >> #15 0x0000555555a87a7a in coroutine_trampoline (i0=, i1=) at util/coroutine-ucontext.c:80 >> #16 0x00007ffff0afc8b0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6 >> #17 0x00007fff8f5aa6e0 in ?? () >> #18 0x0000000000000000 in ?? () >> >> I guess the tb_lock could just be grabbed but there is stuff in that >> path that assumes current_cpu is valid so I thought the thing to do was >> defer the operation until a "real" vCPU can deal with it. > > I need to look at the branch... The latest version I have here does > not require tb_lock taken in tb_invalidate_phys_range. The tb_locks asserts where added in Fred's branch which makes sense as we are going to mess with the translation block cache. Looking more closely at tb_invalidate_phys_page_range I see it jumps through some hoops when cpu == current_cpu == NULL. > > /* > * Invalidate all TBs which intersect with the target physical address range > * [start;end[. NOTE: start and end may refer to *different* physical pages. > * 'is_cpu_write_access' should be true if called from a real cpu write > * access: the virtual CPU will exit the current TB if code is modified inside > * this TB. > * > * Called with mmap_lock held for user-mode emulation > */ > void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end) > { > while (start < end) { > tb_invalidate_phys_page_range(start, end, 0); > start &= TARGET_PAGE_MASK; > start += TARGET_PAGE_SIZE; > } > } > > /* > * Invalidate all TBs which intersect with the target physical address range > * [start;end[. NOTE: start and end must refer to the *same* physical page. > * 'is_cpu_write_access' should be true if called from a real cpu write > * access: the virtual CPU will exit the current TB if code is modified inside > * this TB. > * > * Called with mmap_lock held for user-mode emulation > * If called from generated code, iothread mutex must not be held. > */ > void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, > int is_cpu_write_access) > > > Paolo -- Alex Bennée