From patchwork Tue Sep 13 17:15:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 76103 Delivered-To: patch@linaro.org Received: by 10.140.106.72 with SMTP id d66csp1468322qgf; Tue, 13 Sep 2016 10:20:32 -0700 (PDT) X-Received: by 10.200.50.3 with SMTP id x3mr2401171qta.86.1473787232138; Tue, 13 Sep 2016 10:20:32 -0700 (PDT) Return-Path: Received: from lists.gnu.org (lists.gnu.org. [208.118.235.17]) by mx.google.com with ESMTPS id e96si15910005qtb.112.2016.09.13.10.20.31 for (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 13 Sep 2016 10:20:32 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org Received: from localhost ([::1]:50435 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bjrNn-000110-HE for patch@linaro.org; Tue, 13 Sep 2016 13:20:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33334) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bjrLA-0007yl-Pp for qemu-devel@nongnu.org; Tue, 13 Sep 2016 13:17:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bjrL6-0005AM-Vc for qemu-devel@nongnu.org; Tue, 13 Sep 2016 13:17:48 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:36808) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bjrL6-00059s-NR for qemu-devel@nongnu.org; Tue, 13 Sep 2016 13:17:44 -0400 Received: by mail-wm0-f68.google.com with SMTP id b184so3335898wma.3 for ; Tue, 13 Sep 2016 10:17:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3moLKFKWvAAyvgTLq4mEpoP5Wq5PMTEU+6BqZBiwXlo=; b=ota9t1wfr5PyZLy9COA/95g2GImDKEEN+MIGCpTPm7XS8U3Ajubz0E0/TJwZWU+BOw 4o2xppaueaCStiNuNqiDgtXWJm8Q9vMhl8e3bkswnOeOLnaWt2V/gYN8oMX18/3LrXeb dfgkX4lOP4qPHTSyt0/cqCypKL6ZpoS5nWBVB3XNvC8e5ocaS9h5QfvHqe89cqesVuHP tV8DRG03lEp6VUiP9/W3rioIOmDjsmN6QWVRF6heZaX/oW4TF3ZRa3gnyL7tKalGl34u ez5wxbguM9VJYALljrg7SvgSheRI8zTGcqxX5m7Qbl5COjMTiHBwmg633EA++qRD85ZH U7Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=3moLKFKWvAAyvgTLq4mEpoP5Wq5PMTEU+6BqZBiwXlo=; b=VuvNoLRT1R5f1j55yd925/bVu6cm6DO/tf5MrKM6OXjZNZwvhjeHKyjSCf+lOJYPDr 5C/3Z1eSYuW9Tp8LBXozTyAjYAIcBqahLAfMORS5Nh4djbz2A8WvA/GyPqsPswT3I2wV EsavqWJi+VzBuug3SMfZo7oUyjJJWImn/sB1bWm7stezxTo6PpwMhwj27XphRlQr6GeG +xdVeoNQnmikDZbud/OVKX9tm/w92UBBV0OBNu9Rs3QiUrLugVaowgItE32wlkvhigfB G2QUDiNOjbVIFwz2NGfkvBUdT6J5tgCaKFQ7w8ixpDX0jXZOaxE8DpM7lWXcG40ujXkl 3kVQ== X-Gm-Message-State: AE9vXwMHcKF9V02X62aq+5Tm1tEtUI41hMqIGXVOuA0GknemHtMm5HnVGeQWnyp6qg+VnA== X-Received: by 10.28.184.199 with SMTP id i190mr6048974wmf.43.1473787003981; Tue, 13 Sep 2016 10:16:43 -0700 (PDT) Received: from 640k.lan (94-39-180-254.adsl-ull.clienti.tiscali.it. [94.39.180.254]) by smtp.gmail.com with ESMTPSA id s184sm6331987wmb.11.2016.09.13.10.16.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 13 Sep 2016 10:16:43 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 13 Sep 2016 19:15:40 +0200 Message-Id: <1473786989-54823-10-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1473786989-54823-1-git-send-email-pbonzini@redhat.com> References: <1473786989-54823-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 74.125.82.68 Subject: [Qemu-devel] [PULL 09/58] tcg: cpu-exec: remove tb_lock from the hot-path X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Alex=20Benn=C3=A9e?= , Sergey Fedorov Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Alex Bennée Lock contention in the hot path of moving between existing patched TranslationBlocks is the main drag in multithreaded performance. This patch pushes the tb_lock() usage down to the two places that really need it: - code generation (tb_gen_code) - jump patching (tb_add_jump) The rest of the code doesn't really need to hold a lock as it is either using per-CPU structures, atomically updated or designed to be used in concurrent read situations (qht_lookup). To keep things simple I removed the #ifdef CONFIG_USER_ONLY stuff as the locks become NOPs anyway until the MTTCG work is completed. Signed-off-by: Alex Bennée Reviewed-by: Richard Henderson Reviewed-by: Sergey Fedorov Signed-off-by: Sergey Fedorov Message-Id: <20160715175852.30749-10-sergey.fedorov@linaro.org> Signed-off-by: Paolo Bonzini --- cpu-exec.c | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) -- 1.8.3.1 diff --git a/cpu-exec.c b/cpu-exec.c index cdaab1d..7ca2b71 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -287,35 +287,29 @@ static TranslationBlock *tb_find_slow(CPUState *cpu, TranslationBlock *tb; tb = tb_find_physical(cpu, pc, cs_base, flags); - if (tb) { - goto found; - } + if (!tb) { -#ifdef CONFIG_USER_ONLY - /* mmap_lock is needed by tb_gen_code, and mmap_lock must be - * taken outside tb_lock. Since we're momentarily dropping - * tb_lock, there's a chance that our desired tb has been - * translated. - */ - tb_unlock(); - mmap_lock(); - tb_lock(); - tb = tb_find_physical(cpu, pc, cs_base, flags); - if (tb) { - mmap_unlock(); - goto found; - } -#endif + /* mmap_lock is needed by tb_gen_code, and mmap_lock must be + * taken outside tb_lock. As system emulation is currently + * single threaded the locks are NOPs. + */ + mmap_lock(); + tb_lock(); - /* if no translated code available, then translate it now */ - tb = tb_gen_code(cpu, pc, cs_base, flags, 0); + /* There's a chance that our desired tb has been translated while + * taking the locks so we check again inside the lock. + */ + tb = tb_find_physical(cpu, pc, cs_base, flags); + if (!tb) { + /* if no translated code available, then translate it now */ + tb = tb_gen_code(cpu, pc, cs_base, flags, 0); + } -#ifdef CONFIG_USER_ONLY - mmap_unlock(); -#endif + tb_unlock(); + mmap_unlock(); + } -found: - /* we add the TB in the virtual pc hash table */ + /* We add the TB in the virtual pc hash table for the fast lookup */ atomic_set(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(pc)], tb); return tb; } @@ -333,7 +327,6 @@ static inline TranslationBlock *tb_find_fast(CPUState *cpu, always be the same before a given translated block is executed. */ cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags); - tb_lock(); tb = atomic_rcu_read(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(pc)]); if (unlikely(!tb || tb->pc != pc || tb->cs_base != cs_base || tb->flags != flags)) { @@ -350,14 +343,15 @@ static inline TranslationBlock *tb_find_fast(CPUState *cpu, #endif /* See if we can patch the calling TB. */ if (last_tb && !qemu_loglevel_mask(CPU_LOG_TB_NOCHAIN)) { + tb_lock(); /* Check if translation buffer has been flushed */ if (cpu->tb_flushed) { cpu->tb_flushed = false; } else if (!tb->invalid) { tb_add_jump(last_tb, tb_exit, tb); } + tb_unlock(); } - tb_unlock(); return tb; }