From patchwork Tue Jan 26 09:41:53 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yang X-Patchwork-Id: 75164 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.2) with ESMTP id o0Q9gof8023773 for ; Tue, 26 Jan 2010 09:42:50 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752036Ab0AZJms (ORCPT ); Tue, 26 Jan 2010 04:42:48 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752108Ab0AZJms (ORCPT ); Tue, 26 Jan 2010 04:42:48 -0500 Received: from mga01.intel.com ([192.55.52.88]:34987 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751924Ab0AZJmr (ORCPT ); Tue, 26 Jan 2010 04:42:47 -0500 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 26 Jan 2010 01:41:46 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.49,345,1262592000"; d="scan'208";a="534598865" Received: from syang10-desktop.sh.intel.com (HELO syang10-desktop) ([10.239.36.165]) by fmsmga002.fm.intel.com with ESMTP; 26 Jan 2010 01:42:29 -0800 Received: from yasker by syang10-desktop with local (Exim 4.69) (envelope-from ) id 1NZhvn-0006A1-B7; Tue, 26 Jan 2010 17:41:55 +0800 From: Sheng Yang To: Marcelo Tosatti , Avi Kivity Cc: Anthony Liguori , kvm@vger.kernel.org, qemu-devel@nongnu.org, Sheng Yang Subject: [PATCH v2][uqmaster] kvm: Flush coalesced MMIO buffer periodly Date: Tue, 26 Jan 2010 17:41:53 +0800 Message-Id: <1264498913-23655-1-git-send-email-sheng@linux.intel.com> X-Mailer: git-send-email 1.6.3.3 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org diff --git a/cpu-all.h b/cpu-all.h index 57b69f8..1ccc9a8 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -915,6 +915,8 @@ void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size); void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size); +void qemu_flush_coalesced_mmio_buffer(void); + /*******************************************/ /* host CPU ticks (if available) */ diff --git a/exec.c b/exec.c index 1190591..6875370 100644 --- a/exec.c +++ b/exec.c @@ -2406,6 +2406,12 @@ void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size) kvm_uncoalesce_mmio_region(addr, size); } +void qemu_flush_coalesced_mmio_buffer(void) +{ + if (kvm_enabled()) + kvm_flush_coalesced_mmio_buffer(); +} + ram_addr_t qemu_ram_alloc(ram_addr_t size) { RAMBlock *new_block; diff --git a/kvm-all.c b/kvm-all.c index 15ec38e..889fc42 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -59,6 +59,7 @@ struct KVMState int vmfd; int regs_modified; int coalesced_mmio; + struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; int broken_set_mem_region; int migration_log; int vcpu_events; @@ -200,6 +201,12 @@ int kvm_init_vcpu(CPUState *env) goto err; } +#ifdef KVM_CAP_COALESCED_MMIO + if (s->coalesced_mmio && !s->coalesced_mmio_ring) + s->coalesced_mmio_ring = (void *) env->kvm_run + + s->coalesced_mmio * PAGE_SIZE; +#endif + ret = kvm_arch_init_vcpu(env); if (ret == 0) { qemu_register_reset(kvm_reset_vcpu, env); @@ -466,10 +473,10 @@ int kvm_init(int smp_cpus) goto err; } + s->coalesced_mmio = 0; + s->coalesced_mmio_ring = NULL; #ifdef KVM_CAP_COALESCED_MMIO s->coalesced_mmio = kvm_check_extension(s, KVM_CAP_COALESCED_MMIO); -#else - s->coalesced_mmio = 0; #endif s->broken_set_mem_region = 1; @@ -544,14 +551,12 @@ static int kvm_handle_io(uint16_t port, void *data, int direction, int size, return 1; } -static void kvm_run_coalesced_mmio(CPUState *env, struct kvm_run *run) +void kvm_flush_coalesced_mmio_buffer(void) { #ifdef KVM_CAP_COALESCED_MMIO KVMState *s = kvm_state; - if (s->coalesced_mmio) { - struct kvm_coalesced_mmio_ring *ring; - - ring = (void *)run + (s->coalesced_mmio * TARGET_PAGE_SIZE); + if (s->coalesced_mmio_ring) { + struct kvm_coalesced_mmio_ring *ring = s->coalesced_mmio_ring; while (ring->first != ring->last) { struct kvm_coalesced_mmio *ent; @@ -609,7 +614,7 @@ int kvm_cpu_exec(CPUState *env) abort(); } - kvm_run_coalesced_mmio(env, run); + kvm_flush_coalesced_mmio_buffer(); ret = 0; /* exit loop */ switch (run->exit_reason) { diff --git a/kvm.h b/kvm.h index 1c93ac5..59cba18 100644 --- a/kvm.h +++ b/kvm.h @@ -53,6 +53,7 @@ void kvm_setup_guest_memory(void *start, size_t size); int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); +void kvm_flush_coalesced_mmio_buffer(void); int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr, target_ulong len, int type); diff --git a/vl.c b/vl.c index 2b0b653..1f0c536 100644 --- a/vl.c +++ b/vl.c @@ -3193,6 +3193,7 @@ static void gui_update(void *opaque) DisplayState *ds = opaque; DisplayChangeListener *dcl = ds->listeners; + qemu_flush_coalesced_mmio_buffer(); dpy_refresh(ds); while (dcl != NULL) { @@ -3208,6 +3209,7 @@ static void nographic_update(void *opaque) { uint64_t interval = GUI_REFRESH_INTERVAL; + qemu_flush_coalesced_mmio_buffer(); qemu_mod_timer(nographic_timer, interval + qemu_get_clock(rt_clock)); }