From patchwork Tue May 5 09:13:45 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?SsOpcsOpbXkgRmFuZ3XDqGRl?= X-Patchwork-Id: 6336141 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 3A4759F32E for ; Tue, 5 May 2015 09:14:15 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2735120377 for ; Tue, 5 May 2015 09:14:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1173B202EB for ; Tue, 5 May 2015 09:14:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757212AbbEEJOG (ORCPT ); Tue, 5 May 2015 05:14:06 -0400 Received: from mail-wg0-f41.google.com ([74.125.82.41]:36594 "EHLO mail-wg0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757209AbbEEJOE (ORCPT ); Tue, 5 May 2015 05:14:04 -0400 Received: by wgiu9 with SMTP id u9so12304451wgi.3 for ; Tue, 05 May 2015 02:14:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=d7v5+1vc7TE9m9Wt0Vha/yHrQFdExOFGhN83IV/6fgE=; b=amjF+JJrWmeoRZcXk1AT/MGEWENETAZFmY1bPyKgSRyRdJT3E/pETxEivgktxIvMrR CrurjBuG796QhsYIy/6OiFPagfdbbVJT4kd1F9D22WgVdeMclD7OM8tQdVPSM7aQ4ggs VO50x5aRY1qDsN0BIfDmO7jjz2W5u2jBW7rGERAS7fridhecjVmDpHWrBq+fxs4SVJ10 /WBWYVvS+Cid2GFIelg39R7BxiwiIMetxY1/MotoHp23772nW34VhOg7pOFYcglKRY0m QP02uETQaZkN1QQcbEWIj/1YkETNcgpkJFrP7NdAeeelTzrGPnQ82Fo+QkHfrzE5gc+a A2Zw== X-Gm-Message-State: ALoCoQmxsUpADC+gYLa8NUgf5rYyamCaXfjv7PIBw8fGIf2lXcKyCCKYUE2wT8x3KBfNLMr+8WdC X-Received: by 10.194.62.167 with SMTP id z7mr48164002wjr.62.1430817243925; Tue, 05 May 2015 02:14:03 -0700 (PDT) Received: from jeremy-UX32VD.home (LPuteaux-656-1-278-113.w80-15.abo.wanadoo.fr. [80.15.154.113]) by mx.google.com with ESMTPSA id ex5sm15144014wib.2.2015.05.05.02.14.02 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 05 May 2015 02:14:03 -0700 (PDT) From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Fangu=C3=A8de?= To: qemu-devel@nongnu.org Cc: kvmarm@lists.cs.columbia.edu, tech@virtualopensystems.com, =?UTF-8?q?J=C3=A9r=C3=A9my=20Fangu=C3=A8de?= , Paolo Bonzini , Peter Maydell , kvm@vger.kernel.org (open list:Overall) Subject: [RFC 2/4] target-arm/kvm: Flush data cache support Date: Tue, 5 May 2015 11:13:45 +0200 Message-Id: <1430817227-6278-3-git-send-email-j.fanguede@virtualopensystems.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1430817227-6278-1-git-send-email-j.fanguede@virtualopensystems.com> References: <1430817227-6278-1-git-send-email-j.fanguede@virtualopensystems.com> MIME-Version: 1.0 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Implement data cache maintenance coherency functions, by using FLUSH_DCACHE_GPA ioctl. Introduce kvm_arm_maintain_cache_coherency() for flushing the data cache if necessary, a very simple logic is implemented to reduce number of flushes due to reads. Two wrapping functions are exposed, for easier usage. Signed-off-by: Jérémy Fanguède --- include/sysemu/kvm.h | 3 +++ stubs/kvm.c | 9 +++++++++ target-arm/kvm.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index 197e6c0..986f365 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -451,4 +451,7 @@ int kvm_set_one_reg(CPUState *cs, uint64_t id, void *source); * Returns: 0 on success, or a negative errno on failure. */ int kvm_get_one_reg(CPUState *cs, uint64_t id, void *target); + +void kvm_arch_cache_flush_needed(hwaddr addr, int len, bool is_write); +void kvm_arch_cache_coherency_pre_run(void); #endif diff --git a/stubs/kvm.c b/stubs/kvm.c index e7c60b6..8ed5380 100644 --- a/stubs/kvm.c +++ b/stubs/kvm.c @@ -5,3 +5,12 @@ int kvm_arch_irqchip_create(KVMState *s) { return 0; } + + +void kvm_arch_cache_flush_needed(hwaddr addr, int len, bool is_write) +{ +} + +void kvm_arch_cache_coherency_pre_run(void) +{ +} diff --git a/target-arm/kvm.c b/target-arm/kvm.c index fdd9ba3..548dae2 100644 --- a/target-arm/kvm.c +++ b/target-arm/kvm.c @@ -598,3 +598,54 @@ int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route, { return 0; } + +static void kvm_arm_flush_cache_addr(hwaddr addr, int len) +{ + int ret; + struct kvm_mem_addr mem_addr; + mem_addr.addr = addr; + mem_addr.len = len; + ret = kvm_vm_ioctl(kvm_state, KVM_FLUSH_DCACHE_GPA, &mem_addr); + if (ret) { + fprintf(stderr, "error: Failed to flush CPU caches %d\n", ret); + } +} + +static void kvm_arm_maintain_cache_coherency(hwaddr addr, int len, + bool enter_guest, bool is_write) +{ + static hwaddr prev_addr; + static int prev_len; + hwaddr end_line, prev_end_line; + + if (enter_guest) { + /* We will return to the guest after that, restore the default + configuration */ + prev_addr = 0x0; + return; + } + + /* Assume the minimal CPU cache line is 32 B */ + end_line = (addr + len) & ~0x1f; + prev_end_line = (prev_addr + prev_len) & ~0x1f; + + /* Don't flush two times in a row the same line" + Always flush on a write */ + if ((prev_addr & ~0x1f) != (addr & ~0x1f) + || (prev_end_line < end_line) + || is_write) { + kvm_arm_flush_cache_addr(addr, len); + prev_addr = addr; + prev_len = len; + } +} + +void kvm_arch_cache_flush_needed(hwaddr addr, int len, bool is_write) +{ + kvm_arm_maintain_cache_coherency(addr, len, false, is_write); +} + +void kvm_arch_cache_coherency_pre_run(void) +{ + kvm_arm_maintain_cache_coherency(0, 0, true, false); +}