From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gerhard Wiesinger Subject: Re: [Qemu-devel] Re: QEMU-KVM and video performance Date: Thu, 22 Apr 2010 07:37:11 +0200 (CEST) Message-ID: References: <4BCEBE5C.4020404@redhat.com> <20100421100840.GF13114@shareable.org> <4BCED82C.9020702@redhat.com> <4BCF64E9.4090909@redhat.com> Mime-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: Jamie Lokier , qemu-devel@nongnu.org, kvm@vger.kernel.org To: Avi Kivity Return-path: Received: from chello084112167138.7.11.vie.surfer.at ([84.112.167.138]:49712 "EHLO wiesinger.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751975Ab0DVFhx (ORCPT ); Thu, 22 Apr 2010 01:37:53 -0400 In-Reply-To: <4BCF64E9.4090909@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On Wed, 21 Apr 2010, Avi Kivity wrote: > On 04/21/2010 09:14 PM, Gerhard Wiesinger wrote: >> >> Can you explain which code files/functions of KVM is involved in handling >> VGA memory window and page switching through the port write to the VGA >> window register (or is that part handled through QEMU), so a little bit >> architecture explaination would be nice? > > qemu hw/vga.c and hw/cirrus_vga.c. Boring functions like > vbe_ioport_write_data() and vga_ioport_write(). > Yes, I was already in that code part and that are very simple functions as already explained and are therefore in QEMU only very fast. But I ment: How is the calling path from KVM guest OS to hw/vga.c for memory and I/O accesses, and which parts are done in hardware directly (to understand the speed gap and maybe to find a solution)? >> >> BTW: In which KVM code parts is decided where "direct code" or an "emulated >> device code" is used? >> > > Same place. Look for calls to cpu_register_physical_memory(). If the last > argument was obtained by a call to cpu_register_io_memory(), then all writes > trap. Otherwise, it was obtained by qemu_ram_alloc() and writes will not > trap (except the first write to a page in a 30ms window, used to note that > the page is dirty and needs redrawing). Ok, that finally ends in: cpu_register_physical_memory_offset() ... // 0.12.3 if (kvm_enabled()) kvm_set_phys_mem(start_addr, size, phys_offset); // KVM cpu_notify_set_memory(start_addr, size, phys_offset); ... I/O is always done through: cpu_register_io_memory => cpu_register_io_memory_fixed cpu_register_io_memory_fixed() ... No call to KVM? ... Where is the trap from KVM to QEMU? Thnx. Ciao, Gerhard -- http://www.wiesinger.com/