From nobody Mon Apr 29 01:51:02 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499955999981918.1826559082692; Thu, 13 Jul 2017 07:26:39 -0700 (PDT) Received: from localhost ([::1]:60368 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4c-0001h4-NP for importer@patchew.org; Thu, 13 Jul 2017 10:26:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50827) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf2s-00005n-LZ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf2n-0001oG-Ki for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:46 -0400 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:34832) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf2n-0001ml-Eb for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:41 -0400 Received: by mail-wm0-x243.google.com with SMTP id u23so5454188wma.2 for ; Thu, 13 Jul 2017 07:24:41 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.38 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=r1MBA/mLzx9juwUXbfYSxtmx1Xr9UVYBR8Ip9xU3BC8=; b=Ljk9RkkQPjp9YYu3ZOr1qqDBqEtQBUPt67uSDALJa0RotDznQcpLKwJkhqvniUO1MK VXn7f3/fJbv5P5yG8vIIr3tagzLRGLgN+vK74LfTuQrQzGYt6NIGPYrQkmDO/kcBh1VR MGNN3GGj8M1qIh96Hl1ClWNOd9ElkP78GqDR7SwdczbUubcPdjEGyz87az28BqnjNedu h6z2hSaNGuVE7hFsWS7iW6E3bgW8fygBTwvH07fLTmIxkjM4zOKyv3RykZqqsW23yfSV gp6/Jym4gFk7auk1iijvv2o2zmZYGn2fdnoxDo7U6c0KCpRX8nH41tOHeI3hi1xHPJWl qKJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=r1MBA/mLzx9juwUXbfYSxtmx1Xr9UVYBR8Ip9xU3BC8=; b=klsvMEP5/nUUymdMp4lRRqAa1/D3J6wWkdfKhGsr9/Xtax3zGmVPvifoFfh9x9PnZU qtEdJ0RC7jnsRq21e2bigvTU7/8LCwJIInAAThVkuhGihgrivaNlp9DvAnv790qL2FmE tdwbewGUA6oZuzwxUplaj7yZuqJTpjE6nC/Z/40X/JDsaYASGZ3PamBbV52pdqQgKbUY PGHw5+kHzS57zRNNr2rgXBTle9CLz1MB1wEEo2CWgdcufiFLYl09JQl27XVmDC4RuX6L H0qygKEbJDtgVlx2AP+GhA5oqTru1d4Suu/yxkDiV3NyXK4P9lhsuRtintvNqMKFGxCR kJvA== X-Gm-Message-State: AIVw111FrIBEnYM+T6Rs/7avu6Aakn/Ev8iBe1LSlqljBoC5lYM7sPnE eTArWnuxcLqWhZkacPY= X-Received: by 10.28.137.146 with SMTP id l140mr2458994wmd.101.1499955879961; Thu, 13 Jul 2017 07:24:39 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:23:54 +0200 Message-Id: <1499955874-10954-2-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::243 Subject: [Qemu-devel] [PULL 01/41] build: add -Wexpansion-to-defined 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This warning is included in -Wall by clang, but not by GCC (which only enables it for -Wextra). Include it in the list of warnings we enable to minimize the differences between the compilers: Signed-off-by: Paolo Bonzini --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 5096cbc..239f142 100755 --- a/configure +++ b/configure @@ -1583,7 +1583,7 @@ gcc_flags=3D"-Wold-style-declaration -Wold-style-defi= nition -Wtype-limits" gcc_flags=3D"-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifie= rs $gcc_flags" gcc_flags=3D"-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_= flags" gcc_flags=3D"-Wendif-labels -Wno-shift-negative-value $gcc_flags" -gcc_flags=3D"-Wno-initializer-overrides $gcc_flags" +gcc_flags=3D"-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags" gcc_flags=3D"-Wno-string-plus-int $gcc_flags" # Note that we do not add -Werror to gcc_flags here, because that would # enable it for all configure tests. If a configure test failed due --=20 1.8.3.1 From nobody Mon Apr 29 01:51:02 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956142356897.2148757672168; Thu, 13 Jul 2017 07:29:02 -0700 (PDT) Received: from localhost ([::1]:60376 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf6w-00040F-SY for importer@patchew.org; Thu, 13 Jul 2017 10:28:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50829) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf2s-00005o-M2 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf2p-0001pV-AE for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:46 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:34691) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf2p-0001ow-32 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:43 -0400 Received: by mail-wm0-x241.google.com with SMTP id p204so5452703wmg.1 for ; Thu, 13 Jul 2017 07:24:43 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dCXv5s3nqTEUov44oLriUNkPYgoTWH79UpVC6+XjAvk=; b=mPyzGsUZVElnJjj1jeB5YSteoabyeF+2xQY0qcTkhrM9YsvIcluZNm43NUoxoX0B73 Dv7YP5MCVkAcak79xx8l7Eakt0B7atxNWmK5cQNaOhgDFQ/B3/OuX2N8EwQ4a3X1SOfL b16WvBlc4RTclTHjAKp4R2VsPIktEQ9NQTtisp4DxZpkIiTG64xI0yCBhoy1/eQ2JW4v sQVNCUpijGqyhy1ocfYwOiIwWulDaYoNBWiFeIJ6FBwDOVJjbGC0L1WCdwuDqc0cDZv4 Yw908bSOTtclRMpn6/BvFLZEJhSWy4rpWbzM0dSieA1VhQBpKwk+9oxXcOg5V+vvKZVH OtfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=dCXv5s3nqTEUov44oLriUNkPYgoTWH79UpVC6+XjAvk=; b=DvL/lAapeV/5hc9VGdODruSqpS39sqbpv/YpccwWLYOqxQr4g0AScTKhiWQR1opi8N VMJZ4++AZNxUplBHl6Qg751UTewKDCD9R3n1hgeYFiQzM1ejK5BGeApQcl7mu5DhRznC PH3dsw2YRCocNnRffs/8glorDZdDwxEwjnZrJgg+uBwOF2CujyEEy9/ZKuPQKF+T8wKY 8QLJMsVSzP1+kiPVZ5FjCC0lCuwJVFwSQcZFy6wy7atfL05JFdVVWZEUA3iBobeI4A6Q dczcJRYIrUUTuwm/2BK/lvjfm6SUFRFmowrn7TMdCKi5nQ1J2yviFKclkTmMlq3ZtYJn MXyw== X-Gm-Message-State: AIVw113TMDPEaX/iLUIkzlrs8QgRjf5qvAjjOHpSDoAxP2VQ9I9X+Bxf DLbZympb/uBglE85kbM= X-Received: by 10.28.93.1 with SMTP id r1mr2268212wmb.26.1499955881722; Thu, 13 Jul 2017 07:24:41 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:23:55 +0200 Message-Id: <1499955874-10954-3-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PULL 02/41] MAINTAINERS: update TCG entries 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?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Philippe Mathieu-Daud=C3=A9 moved in a9ded601..244f1441 to accel/ Signed-off-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20170629150308.22766-2-f4bug@amsat.org> Reviewed-by: Thomas Huth Signed-off-by: Paolo Bonzini --- MAINTAINERS | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 9529c94..74b3956 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -84,14 +84,10 @@ M: Paolo Bonzini M: Peter Crosthwaite M: Richard Henderson S: Maintained -F: cpu-exec.c -F: cpu-exec-common.c F: cpus.c -F: cputlb.c F: exec.c F: softmmu_template.h -F: translate-all.* -F: translate-common.c +F: accel/tcg/ F: include/exec/cpu*.h F: include/exec/exec-all.h F: include/exec/helper*.h --=20 1.8.3.1 From nobody Mon Apr 29 01:51:02 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149995600001175.5842368560867; Thu, 13 Jul 2017 07:26:40 -0700 (PDT) Received: from localhost ([::1]:60367 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4b-0001gl-Nt for importer@patchew.org; Thu, 13 Jul 2017 10:26:33 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50826) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf2s-00005k-L6 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf2q-0001pu-Ea for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:46 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:34692) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf2q-0001pd-7Q for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:44 -0400 Received: by mail-wm0-x241.google.com with SMTP id p204so5452821wmg.1 for ; Thu, 13 Jul 2017 07:24:44 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=aniCP2cV61FqXzhxCTQ7V5F0ra+pzb1rpfRKCJb9mVA=; b=akZbuXTBkNWT6NDsFpK2UF95MtEjeCb/R6ZL9Lyhvoa0vdwSHT7LndS7MPQot8/b9j 8EcfwF61T5DqCx6wv0cJQpT8r8ynfSZ0fFhVOzgs7LMVex7BeyBNdsifj8/sxXRtypV2 kUq49YFQGJOWiGtZjhBXt1vjiEnIwXddjavMeWFpUSbEbw9BUmRRU7V1cTzndE9Zwdiu NtbRS4mkM7vtUPN47ZiRWhjxIZs6BkmbSln/sC4G7pGSeKCNUIqObVYRG5Inrym2c39L p+N6YIPnR91GIpZqeq44aUUwGJ5cbsVMKPTUY3wxyGCy2IDZ9Xats08Yozh5djhZU6mr gDoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=aniCP2cV61FqXzhxCTQ7V5F0ra+pzb1rpfRKCJb9mVA=; b=TLTTjIMdWvtCjYL7lUFNPSkqO7EIYX3G8n3UnaUHaEDjqhS7B/DyN3UpINCTcjFQwO wSP5qDJkiYWkPBAok9+5txU8UdkjFRk2bdbNrH2rU4178UStlDN/67RZDFFvyMg9yRzz 7vJzkQUlmLCts4ie22++aMy21uIqbtckC63DEbqyd6bz3kTu8poqnP0JLrsOD48o9dAi xmR6lwuEy50L3yUwcEP2KMFIhTlUZLYXtqniH56QZaHSDh9tQ39JcWp85euoXQaukL18 EQLwXYDHquoCCUoa9a7xpTlkyCQwBECRcX7q91FB2vMyezMKfjNrGUqhDkgLv0iFaprN lKcA== X-Gm-Message-State: AIVw110mp7ydSNvGWI7lFBG0IvbHY7IK9FFCFuoeQ4Er7S48Ot7xcSe6 a/1t8j22Soa9e4wJ6gc= X-Received: by 10.28.111.147 with SMTP id c19mr2245504wmi.92.1499955883026; Thu, 13 Jul 2017 07:24:43 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:23:56 +0200 Message-Id: <1499955874-10954-4-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PULL 03/41] MAINTAINERS: update KVM entries 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?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Philippe Mathieu-Daud=C3=A9 moved in 92229a57 to accel/ Signed-off-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20170629150308.22766-3-f4bug@amsat.org> Signed-off-by: Paolo Bonzini --- MAINTAINERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 74b3956..55061e9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -273,8 +273,8 @@ Overall M: Paolo Bonzini L: kvm@vger.kernel.org S: Supported -F: kvm-* F: */kvm.* +F: accel/kvm/ F: include/sysemu/kvm*.h =20 ARM --=20 1.8.3.1 From nobody Mon Apr 29 01:51:02 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956365667566.9672039716297; Thu, 13 Jul 2017 07:32:45 -0700 (PDT) Received: from localhost ([::1]:60395 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfAY-0007dV-8n for importer@patchew.org; Thu, 13 Jul 2017 10:32:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50832) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf2s-00005s-Oe for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf2r-0001sO-PK for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:46 -0400 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:36442) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf2r-0001qC-JB for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:45 -0400 Received: by mail-wm0-x243.google.com with SMTP id y5so5443252wmh.3 for ; Thu, 13 Jul 2017 07:24:45 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wZ/vyCNgbv4okAMpAnAhtxwGMn+3A+6c1qiP1kyp3Z8=; b=Kl0KEphCmZ6Y31614FkHmA4w7kWLc7Osnor3jpcDXxQcUfhtabte7bGYO3H3tKb7OX ZniG1pcULh1m/E9Q3lC1xIG/Ezh+FtCKY8hLpVPa5ORe5JG+CeDdZv0qP1TJuzsjyWwD VTXOH6rx/HsVJ/zKPNBKaLlNjHTPNvn65Gf7zXSVYOT3U4tr2hJ5vddOQFR5tDcRInJZ gNXPyoJ04O4AZfguakqShPFwRWzhC0DT/v8ReSi/Oh40j+Tm0kUit+M1wEhEhKLi3AID S3Xs+ces4tqyihBJSKpo86nl/jGEN8e1UZvLcBlH9Jewha42lUyQDUK3r57amCyWECuV YOcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=wZ/vyCNgbv4okAMpAnAhtxwGMn+3A+6c1qiP1kyp3Z8=; b=ZgAnsAhABh8SIanhlpknGHybzVHd/iAjKieRWJ29ILDqA3uMaKkj7BzhuKOcbxsCLA me/zllFINVGKoEmazELPbyq6vPVBRB6JliGIIcx6D2MDAPDYTQWY9+pSbyYzLAInRzUX HlcTSkS9GI/nEIN1puicw5sK4muo3sxCs6dNRunjEh4csQwFaGxkT+0wEuWCDQa445nd PwiTN0eF3BRBIl2/FuAy4ZHC4WAp2paN3cjH0b3p1RPNwsoreXxm1Xk3+7H9vBuNnCTP 73Cl1jEr966O7rbeJ9Y1mivi/qlqqWObk/Pv6dpp4XIRupzj+6hYwbGWrDutUO5/VETC xmRg== X-Gm-Message-State: AIVw111ylr50XFn85rfv1uBpp07cvYp7RQPRaW8ZY8hX2fu9R+c1ixqM VzfBGRqiEegZqvyRsgA= X-Received: by 10.28.33.66 with SMTP id h63mr2425395wmh.124.1499955884409; Thu, 13 Jul 2017 07:24:44 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:23:57 +0200 Message-Id: <1499955874-10954-5-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::243 Subject: [Qemu-devel] [PULL 04/41] MAINTAINERS: update Xen entries 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?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Philippe Mathieu-Daud=C3=A9 moved in 56e2cd24..28b99f47 to hw/xen/ and hw/i386/xen/ Signed-off-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Anthony PERARD Message-Id: <20170629150308.22766-4-f4bug@amsat.org> Signed-off-by: Paolo Bonzini --- MAINTAINERS | 1 - 1 file changed, 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 55061e9..5540460 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -323,7 +323,6 @@ M: Stefano Stabellini M: Anthony Perard L: xen-devel@lists.xenproject.org S: Supported -F: xen-* F: */xen* F: hw/9pfs/xen-9p-backend.c F: hw/char/xen_console.c --=20 1.8.3.1 From nobody Mon Apr 29 01:51:02 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956294466223.03227575383607; Thu, 13 Jul 2017 07:31:34 -0700 (PDT) Received: from localhost ([::1]:60391 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf9O-0006hx-7c for importer@patchew.org; Thu, 13 Jul 2017 10:31:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50886) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf2v-00007m-4b for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf2u-0001wr-A5 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:49 -0400 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:33635) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf2u-0001w6-2M for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:48 -0400 Received: by mail-wm0-x243.google.com with SMTP id j85so5436558wmj.0 for ; Thu, 13 Jul 2017 07:24:47 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VmpxLZUH4I1U3SWiaeMrTO+kiOALaDjr/85gjV3yBVM=; b=LH30ZRRVqeXmVpRwJEmUNNlRkfVAKmZMDXhcfV8OVuHfJzcYxSN2pwLzXThU9TGjll 8FKNNTqUWeph73tK0/0kRgmR7kLE/6VQ1gku7WB6nPN+KUdd6rYTG7Jbth7rmuN5paEs GnMtQDunnIfBAMTdj+rMTWCzcBRaG3bkKxw/NZjbsCr3VyRZk06xfVQ+Qmel7Hhepeaw dofWkh6wZwbMy5K9YinYg7htM71l5IzeXs6uTuCZmwb7R78igwi2BV409i3le2sVuH1G E2Cb1co9+dNjaoS82HjtjMeYzvp3zngqmqx3AloEU/GGXhhRMMzi/DHUETkdId1kjldc YjKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=VmpxLZUH4I1U3SWiaeMrTO+kiOALaDjr/85gjV3yBVM=; b=EU8p6zKQVECCLso/mlyv4lKfvD4McCIG4YqT4BRDJkB9VR0xBssHQg7T7glMhDjN6u kQAgVR6d0VTpt+RyJA9i144zLVKYaI3oTSQepJfnBmaU+zU7fRr/TIlZL0pXRNKPYx6I V2GFzOPovX9+/N3VcrtWoqsjc8AwHHJqgY7TPKsOs2lkZY7B7RMnHUyGrxi8fDlYdldM AVjHiri89G5fYCC9fiLNAgoPg50dtjs/vHx8dAdbON68uC+U9SHDDQaH07EHOXS1ihFp 6CCN8yU5G9sIEe0TgX1cJERLyY6tYk3KrddIvL8LLAveQqNeKc56lzw+lFMQsFtlUcMS t8hg== X-Gm-Message-State: AIVw110FB4K8vbLZBMRh5mIJKftItM9qnHuoXZQed7eDiARc/Tz2brga NzLngYw7kEfH31F9rBc= X-Received: by 10.28.104.132 with SMTP id d126mr2451974wmc.49.1499955885378; Thu, 13 Jul 2017 07:24:45 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:23:58 +0200 Message-Id: <1499955874-10954-6-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::243 Subject: [Qemu-devel] [PULL 05/41] MAINTAINERS: update TCI entry 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?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Philippe Mathieu-Daud=C3=A9 moved in 244f1441 to tcg/ Signed-off-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20170629150308.22766-5-f4bug@amsat.org> Reviewed-by: Stefan Weil Signed-off-by: Paolo Bonzini --- MAINTAINERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 5540460..dd7e1e5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1645,7 +1645,7 @@ TCI target M: Stefan Weil S: Maintained F: tcg/tci/ -F: tci.c +F: tcg/tci.c F: disas/tci.c =20 Block drivers --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149995629276140.86573458030921; Thu, 13 Jul 2017 07:31:32 -0700 (PDT) Received: from localhost ([::1]:60390 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf9N-0006hC-HD for importer@patchew.org; Thu, 13 Jul 2017 10:31:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50883) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf2u-00007Q-LW for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf2t-0001wU-Py for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:48 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:34842) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf2t-0001uy-Kc for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:47 -0400 Received: by mail-wm0-x244.google.com with SMTP id u23so5454780wma.2 for ; Thu, 13 Jul 2017 07:24:47 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=a5BpVRQ8K+G9ys4pqQH7gSIf86QP6oar0E5JJ5AjQo4=; b=tpj4wsWAT0eXk3b7On6xO7/OUZZdUYjGISem0IiOSNLURF4UE3/zKddr5UvMLbAvtx ZBm+of7qp3aVnRG4Bzp4oGeTFU+SLew1y/mpY5HPU62caCSRY70ImxnH5WBI7ki477CB 1OMP60H+2aimgkwGTS/8L3/N/KlcbsnF1NAcDWqhdtv5xispttTSIRWOpWi1beSIys0h AjV1Oe66EDp4ThIlMsfinAR6e+qF8/EBYxFlXSrXIxS/0G5yIQnnJ0NhDrzenHQP2QkE hD4VCjiSbKIPf7VpyVX1r+OXsCw3/r8oiosPtEZgyk32G5m18lND9Cx8VpGPrFFbHxPZ KQbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=a5BpVRQ8K+G9ys4pqQH7gSIf86QP6oar0E5JJ5AjQo4=; b=kUGQJ6bAypDST0UdPeJ8IlYB63bag938KAYkrLfYQdjJKPRouvWE497vpMLveTPCMB hd5BZd8TkOer/jybArsFW7a/CuFNn/iRbFtGNB50REX9yAiXbLGwNkJbb/vDLL9XVKrn KX/lVYbiY8Iib108FGGpaXt6K0g00Q4oLngFbj+VzWfQOjx3EUk9VPzvtnK0R7lTz6nS SlX+R/cyOI8x/F0Qu6XquCpfmE2rwmfmrlIUhb594R3ScXAgfQxCERiKZcfFZ91xuLIj EbP6ULulLhwDq3oogyaBLiiAPtBJOtWnpEWvfNe7Cd8fQeqrXf4eOC+VnIUqYuuSQVzf FbNA== X-Gm-Message-State: AIVw112UUyfUWzwt4wx3BTrdj/8yf8l8q5mfXdXTaDMqVMV6qwwW6ppp BosCueaHstt+2oAmLKg= X-Received: by 10.28.172.4 with SMTP id v4mr2327391wme.72.1499955886346; Thu, 13 Jul 2017 07:24:46 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:23:59 +0200 Message-Id: <1499955874-10954-7-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PULL 06/41] MAINTAINERS: add entry for "Unimplemented" device 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?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Philippe Mathieu-Daud=C3=A9 Also voluntary myself as reviewer Signed-off-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20170629150308.22766-6-f4bug@amsat.org> Signed-off-by: Paolo Bonzini --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index dd7e1e5..b9aa878 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1155,6 +1155,13 @@ F: docs/specs/vmgenid.txt F: tests/vmgenid-test.c F: stubs/vmgenid.c =20 +Unimplemented device +M: Peter Maydell +R: Philippe Mathieu-Daud=C3=A9 +S: Maintained +F: include/hw/misc/unimp.h +F: hw/misc/unimp.c + Subsystems ---------- Audio --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149995614559058.80281034480845; Thu, 13 Jul 2017 07:29:05 -0700 (PDT) Received: from localhost ([::1]:60377 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf6y-000418-4e for importer@patchew.org; Thu, 13 Jul 2017 10:29:00 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50903) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf2x-0000BS-7u for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf2w-0001xt-Fs for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:51 -0400 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:33643) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf2w-0001xd-8z for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:50 -0400 Received: by mail-wm0-x243.google.com with SMTP id j85so5436907wmj.0 for ; Thu, 13 Jul 2017 07:24:50 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=f4vk4KppXxvp0PaQz/P6AGEwLZwMFohC739mWu+Dk1I=; b=OoDfEIQIgFQ+qk8lHbecydDQfg0u8dR7k0sXSsPh/F/OVh6g1d+5kX4fDhQGF27Zfm 0S86iaTQi6wOrM2Yus+pKq6b17FOG6tu1vWT2/qI/oIVDt0fmfi9o1GRn+8z+210RtgC Va7stxx6XSClc5QrjQY9PobxmCilndc2KKhLLWz9wnQg4HIG7cmUcDUgWvnochOQU+1R Jr1/hrK3AnVsqO6vHgflvrV00y28OHQo2lu0ImgSG94EaafKQJgmj+HoqEW9NwOxfmSl RW/w60L28c/13xww6myq9xzNkniFCc9jy9QMWz8s5XChIwH/YTLV+vVH2o/gDhcrdfeA +bPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=f4vk4KppXxvp0PaQz/P6AGEwLZwMFohC739mWu+Dk1I=; b=autp3qe4f4jCesd1da5qNCbmhAp1MEUhlbmIrRerkdo4VKxppmFjTg7NhO17jhUXFE uOxgQUWJ7TNNZvIuLVAnyYBj0D5aeODm8rbQ0U9n/xfW+5zHZKRxMOczZoNsxWwssOXx flFTB1n/fHZn2HUDXAFETz4EBVDsoz8JmW9332YxrdShjZPOc+4s4jZULnLRukZi1uKf v8QEiMgynaRzfx3UuCGJEfbK/mjV2OC3gPHls0m6Qk3nN2y9B2XpXGxx4GEexUSADquc aYhQ0VSwJC141rfxSNpfktMeCjiE0FqMwJ3see2/MFpYwHPYW7tjw+NcaSsxBiiJ6Ekm 4qdQ== X-Gm-Message-State: AIVw112cvWiDxYxIZjh1luHxWo7uRU5CvtwbwoWvip5NVNy5VHB+Mhc+ geFo3JfL+ulMPoGZhh8= X-Received: by 10.28.22.6 with SMTP id 6mr2456127wmw.124.1499955888853; Thu, 13 Jul 2017 07:24:48 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:00 +0200 Message-Id: <1499955874-10954-8-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::243 Subject: [Qemu-devel] [PULL 07/41] chardev: block during sync read 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?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Marc-Andr=C3=A9 Lureau A sync read should block until all requested data is available (instead of retrying in qemu_chr_fe_read_all). Change the channel to blocking during sync_read. Signed-off-by: Marc-Andr=C3=83=C2=A9 Lureau Message-Id: <20170706170353.32601-1-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini Signed-off-by: Marc-Andr=C3=A9 Lureau --- chardev/char-socket.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index ccc499c..7e6648b 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -454,7 +454,9 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_= t *buf, int len) return 0; } =20 + qio_channel_set_blocking(s->ioc, true, NULL); size =3D tcp_chr_recv(chr, (void *) buf, len); + qio_channel_set_blocking(s->ioc, false, NULL); if (size =3D=3D 0) { /* connection closed */ tcp_chr_disconnect(chr); --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149995645985848.849583444039354; Thu, 13 Jul 2017 07:34:19 -0700 (PDT) Received: from localhost ([::1]:60401 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfC4-0000Ob-1X for importer@patchew.org; Thu, 13 Jul 2017 10:34:16 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50974) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf33-0000Uk-1R for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf2x-0001ym-Vt for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:57 -0400 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:35819) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf2x-0001yB-MN for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:51 -0400 Received: by mail-wr0-x244.google.com with SMTP id y28so4890440wrd.2 for ; Thu, 13 Jul 2017 07:24:51 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GN8rCeEFrzHGZ4FD0fl6VE9r4fHLT5Hz48vAIXbBgjM=; b=aMry/cJJtfWTivLaShV9rM+/mjJXaMrXey9es4EuO/O+ySm1fqXLMoGMaI/t2nsAwC v0v0hxp/6RE/TLsmzwfV58ZCwEClRIiP10VT+4YYmRqUA4PUzLf9yH4l/u/Tr9z3u5C7 T76+JHA5hfkb9N47gVbKwVbn7idNPWNgcGD3t9GGlXl4jsw0JPKMJMFtlR1yQDRbXA8c xYzQnjLDx7Ipq9j5Io0sF6Umjw+XHDeyL53hSgtmVG1B9zGhweRcjOUJhrfWM8Xb28gS heFcXUZ5dvW1x3QZGPAqqdLHR51WTot3i56XgXHp1o1/ARPasn/N+NzO/gcGEr4GkmJV YzOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=GN8rCeEFrzHGZ4FD0fl6VE9r4fHLT5Hz48vAIXbBgjM=; b=WoLWGwoO94WSE5+vKKSkcB5mWBnEjy9zSoS7MBz4R1gUgDuw5pO88gfq2G34kybJGt bvtd1a9HXvbl7VK8PLgGPBTGT1meI3bq/ZZ6GH46DazULAGl1LzfVakxh/l1VCcIehiN 4DsdTrnmYFjyfZFNTzrBLh/7YQM9zGINwpXuniu0fjQw/z5RohLJ76SQZ/iWdky4LPvQ mKrRSNoc7uXQn75Qk+n2gmc82yrQ8cKH36RmPh0K85oqWAPiBP/rK3BOD34zqZD5F6Pk iQSlqha98VV7wHdcfNvSFCl2xvT+E/YpQCvCV+Jfhjk9G35dEzHIvaMlE19zieTK5JAv d82w== X-Gm-Message-State: AIVw112Wkg5I4kTk2f0jSPg+oW/2/R2SOCna2QaXSP9c6aO6JbzYPIZA MOs3uqma5IiLxYLbXM4= X-Received: by 10.223.169.51 with SMTP id u48mr1724702wrc.176.1499955890320; Thu, 13 Jul 2017 07:24:50 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:01 +0200 Message-Id: <1499955874-10954-9-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::244 Subject: [Qemu-devel] [PULL 08/41] char: move QemuOpts->ChardevBackend translation to a separate func 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov parse function will be used by the following patch Signed-off-by: Anton Nefedov Message-Id: <1499342940-56739-2-git-send-email-anton.nefedov@virtuozzo.com> Reviewed-by: Marc-Andr=C3=A9 Lureau Signed-off-by: Paolo Bonzini --- chardev/char.c | 81 ++++++++++++++++++++++++++++++++++++------------------= ---- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index 2b679a2..839eff6 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -556,17 +556,23 @@ help_string_append(const char *name, void *opaque) g_string_append_printf(str, "\n%s", name); } =20 -Chardev *qemu_chr_new_from_opts(QemuOpts *opts, - Error **errp) +static const char *chardev_alias_translate(const char *name) +{ + int i; + for (i =3D 0; i < (int)ARRAY_SIZE(chardev_alias_table); i++) { + if (g_strcmp0(chardev_alias_table[i].alias, name) =3D=3D 0) { + return chardev_alias_table[i].typename; + } + } + return name; +} + +static ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, Error **errp) { Error *local_err =3D NULL; const ChardevClass *cc; - Chardev *chr; - int i; ChardevBackend *backend =3D NULL; - const char *name =3D qemu_opt_get(opts, "backend"); - const char *id =3D qemu_opts_id(opts); - char *bid =3D NULL; + const char *name =3D chardev_alias_translate(qemu_opt_get(opts, "backe= nd")); =20 if (name =3D=3D NULL) { error_setg(errp, "chardev: \"%s\" missing backend", @@ -574,7 +580,40 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, return NULL; } =20 - if (is_help_option(name)) { + cc =3D char_get_class(name, errp); + if (cc =3D=3D NULL) { + return NULL; + } + + backend =3D g_new0(ChardevBackend, 1); + backend->type =3D CHARDEV_BACKEND_KIND_NULL; + + if (cc->parse) { + cc->parse(opts, backend, &local_err); + if (local_err) { + error_propagate(errp, local_err); + qapi_free_ChardevBackend(backend); + return NULL; + } + } else { + ChardevCommon *ccom =3D g_new0(ChardevCommon, 1); + qemu_chr_parse_common(opts, ccom); + backend->u.null.data =3D ccom; /* Any ChardevCommon member would w= ork */ + } + + return backend; +} + +Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp) +{ + const ChardevClass *cc; + Chardev *chr =3D NULL; + ChardevBackend *backend =3D NULL; + const char *name =3D chardev_alias_translate(qemu_opt_get(opts, "backe= nd")); + const char *id =3D qemu_opts_id(opts); + char *bid =3D NULL; + + if (name && is_help_option(name)) { GString *str =3D g_string_new(""); =20 chardev_name_foreach(help_string_append, str); @@ -589,38 +628,20 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, return NULL; } =20 - for (i =3D 0; i < (int)ARRAY_SIZE(chardev_alias_table); i++) { - if (g_strcmp0(chardev_alias_table[i].alias, name) =3D=3D 0) { - name =3D chardev_alias_table[i].typename; - break; - } + backend =3D qemu_chr_parse_opts(opts, errp); + if (backend =3D=3D NULL) { + return NULL; } =20 cc =3D char_get_class(name, errp); if (cc =3D=3D NULL) { - return NULL; + goto out; } =20 - backend =3D g_new0(ChardevBackend, 1); - backend->type =3D CHARDEV_BACKEND_KIND_NULL; - if (qemu_opt_get_bool(opts, "mux", 0)) { bid =3D g_strdup_printf("%s-base", id); } =20 - chr =3D NULL; - if (cc->parse) { - cc->parse(opts, backend, &local_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; - } - } else { - ChardevCommon *ccom =3D g_new0(ChardevCommon, 1); - qemu_chr_parse_common(opts, ccom); - backend->u.null.data =3D ccom; /* Any ChardevCommon member would w= ork */ - } - chr =3D qemu_chardev_new(bid ? bid : id, object_class_get_name(OBJECT_CLASS(cc)), backend, errp); --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956769593857.8578499868836; Thu, 13 Jul 2017 07:39:29 -0700 (PDT) Received: from localhost ([::1]:60423 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfH1-00052c-Et for importer@patchew.org; Thu, 13 Jul 2017 10:39:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51628) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf42-0001Y6-UJ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3y-0003Ox-Ox for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:58 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:33988) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3y-0003Ju-7f for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:54 -0400 Received: by mail-wm0-f67.google.com with SMTP id p204so5453836wmg.1 for ; Thu, 13 Jul 2017 07:25:54 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=0v66CHWMKn7TeYd0iSSK4RRxc5HqyQKp23ZQSBubLoA=; b=oBUeyckHwYKvnFwFKM5G/HD2g7pfvOi6ewAqbCrbFUwuarRKfwKZF2smsFzXLdXiYg 3ymS2WSJYjd9bv3tq4BLjqz9Xgws0Z9CQ4E/EkoC2LdxkRuvV1WhPlhh9cDW5F8q2PxG T6N5TB5D6drMDeCYMQI8CuZSJ9kMKm9Q6qLo88Uw4FeYL6oEJTRqLpFdryHoJhTJj6HH N457exer3D4GN5euyzMVAJ37HSfQViuo0OxGl2jit7p8VsdcufTvxb3c3JpF7/Kh7NSG YiLqnGNLU7bU2mcpAhYnXZdMYvplOf81B1Vs2nh5OIxOi3PACbeiqmEbvoUIkhLboK88 a+3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=0v66CHWMKn7TeYd0iSSK4RRxc5HqyQKp23ZQSBubLoA=; b=HrMOb5hb+QsV/ZiSD9mQXCwbW2/+9k5noBl/eAPjOVRiQgbCtRkiXBGDJrmu+nvfMT D5m3amF9Ri03q1kE6s+IjxNSRefBriOVHSV7n4D6ESzAjWQEoFwHwl58jYoMKjphOjcr Kb1mgYDNh6RKF0NX5/ZDbFytZbV0f5FzJ/YbbaDH+aSjdtZYQBfD/Kajuwf/4KboKnWy FmfcaL9KdFqsOZROPf4rwnaacShwgEnB4C9YHZLogUnbIJ6Q7vlbb3X03yMVsq6naYKy i/2I5tGXIGqaeWl+JM9S5vk8fZolaOwY8c84pDhDGq3/PoRgeY76/ccbKmxNs/IDdfKq KW5A== X-Gm-Message-State: AIVw112AEDIEvPI3+u2U7BF6nVWf7Hh0VW6GmUkUVY3q7FNZA2YRosyh 4RLb2QyOJ5S/YKi7mng= X-Received: by 10.28.182.212 with SMTP id g203mr2473802wmf.83.1499955892217; Thu, 13 Jul 2017 07:24:52 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:02 +0200 Message-Id: <1499955874-10954-10-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 74.125.82.67 Subject: [Qemu-devel] [PULL 09/41] char: add backend hotswap handler 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov Frontends should have an interface to setup the handler of a backend change. The interface will be used in the next commits Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <1499342940-56739-3-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- backends/rng-egd.c | 2 +- chardev/char-fe.c | 4 +++- chardev/char-mux.c | 1 + gdbstub.c | 2 +- hw/arm/pxa2xx.c | 3 ++- hw/arm/strongarm.c | 2 +- hw/char/bcm2835_aux.c | 2 +- hw/char/cadence_uart.c | 2 +- hw/char/debugcon.c | 2 +- hw/char/digic-uart.c | 2 +- hw/char/escc.c | 2 +- hw/char/etraxfs_ser.c | 2 +- hw/char/exynos4210_uart.c | 2 +- hw/char/grlib_apbuart.c | 2 +- hw/char/imx_serial.c | 2 +- hw/char/ipoctal232.c | 2 +- hw/char/lm32_juart.c | 2 +- hw/char/lm32_uart.c | 2 +- hw/char/mcf_uart.c | 2 +- hw/char/milkymist-uart.c | 2 +- hw/char/pl011.c | 2 +- hw/char/sclpconsole-lm.c | 2 +- hw/char/sclpconsole.c | 2 +- hw/char/serial.c | 2 +- hw/char/sh_serial.c | 2 +- hw/char/spapr_vty.c | 2 +- hw/char/stm32f2xx_usart.c | 3 ++- hw/char/terminal3270.c | 2 +- hw/char/virtio-console.c | 4 ++-- hw/char/xen_console.c | 2 +- hw/char/xilinx_uartlite.c | 2 +- hw/ipmi/ipmi_bmc_extern.c | 2 +- hw/mips/boston.c | 2 +- hw/mips/mips_malta.c | 2 +- hw/misc/ivshmem.c | 2 +- hw/usb/ccid-card-passthru.c | 2 +- hw/usb/dev-serial.c | 2 +- hw/usb/redirect.c | 2 +- include/chardev/char-fe.h | 5 +++++ monitor.c | 4 ++-- net/colo-compare.c | 10 ++++++---- net/filter-mirror.c | 6 +++--- net/slirp.c | 2 +- net/vhost-user.c | 7 ++++--- qtest.c | 2 +- target/xtensa/xtensa-semi.c | 2 +- tests/test-char.c | 14 ++++++++++---- tests/vhost-user-test.c | 2 +- 48 files changed, 77 insertions(+), 58 deletions(-) diff --git a/backends/rng-egd.c b/backends/rng-egd.c index e7ce2ca..d2b9ce6 100644 --- a/backends/rng-egd.c +++ b/backends/rng-egd.c @@ -106,7 +106,7 @@ static void rng_egd_opened(RngBackend *b, Error **errp) =20 /* FIXME we should resubmit pending requests when the CDS reconnects. = */ qemu_chr_fe_set_handlers(&s->chr, rng_egd_chr_can_read, - rng_egd_chr_read, NULL, s, NULL, true); + rng_egd_chr_read, NULL, NULL, s, NULL, true); } =20 static void rng_egd_set_chardev(Object *obj, const char *value, Error **er= rp) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 3f90f05..7054863 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -216,7 +216,7 @@ void qemu_chr_fe_deinit(CharBackend *b, bool del) assert(b); =20 if (b->chr) { - qemu_chr_fe_set_handlers(b, NULL, NULL, NULL, NULL, NULL, true); + qemu_chr_fe_set_handlers(b, NULL, NULL, NULL, NULL, NULL, NULL, tr= ue); if (b->chr->be =3D=3D b) { b->chr->be =3D NULL; } @@ -235,6 +235,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b, IOCanReadHandler *fd_can_read, IOReadHandler *fd_read, IOEventHandler *fd_event, + BackendChangeHandler *be_change, void *opaque, GMainContext *context, bool set_open) @@ -258,6 +259,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b, b->chr_can_read =3D fd_can_read; b->chr_read =3D fd_read; b->chr_event =3D fd_event; + b->chr_be_change =3D be_change; b->opaque =3D opaque; if (cc->chr_update_read_handler) { cc->chr_update_read_handler(s, context); diff --git a/chardev/char-mux.c b/chardev/char-mux.c index 08570b9..4cda5e7 100644 --- a/chardev/char-mux.c +++ b/chardev/char-mux.c @@ -278,6 +278,7 @@ void mux_chr_set_handlers(Chardev *chr, GMainContext *c= ontext) mux_chr_can_read, mux_chr_read, mux_chr_event, + NULL, chr, context, true); } diff --git a/gdbstub.c b/gdbstub.c index ec4e4b2..e561244 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -2003,7 +2003,7 @@ int gdbserver_start(const char *device) if (chr) { qemu_chr_fe_init(&s->chr, chr, &error_abort); qemu_chr_fe_set_handlers(&s->chr, gdb_chr_can_receive, gdb_chr_rec= eive, - gdb_chr_event, NULL, NULL, true); + gdb_chr_event, NULL, NULL, NULL, true); } s->state =3D chr ? RS_IDLE : RS_INACTIVE; s->mon_chr =3D mon_chr; diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c index 629e6c6..731ed08 100644 --- a/hw/arm/pxa2xx.c +++ b/hw/arm/pxa2xx.c @@ -1970,7 +1970,8 @@ static void pxa2xx_fir_realize(DeviceState *dev, Erro= r **errp) PXA2xxFIrState *s =3D PXA2XX_FIR(dev); =20 qemu_chr_fe_set_handlers(&s->chr, pxa2xx_fir_is_empty, - pxa2xx_fir_rx, pxa2xx_fir_event, s, NULL, tru= e); + pxa2xx_fir_rx, pxa2xx_fir_event, NULL, s, NUL= L, + true); } =20 static bool pxa2xx_fir_vmstate_validate(void *opaque, int version_id) diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c index 7683edc..1fa082c 100644 --- a/hw/arm/strongarm.c +++ b/hw/arm/strongarm.c @@ -1247,7 +1247,7 @@ static void strongarm_uart_realize(DeviceState *dev, = Error **errp) strongarm_uart_can_receive, strongarm_uart_receive, strongarm_uart_event, - s, NULL, true); + NULL, s, NULL, true); } =20 static void strongarm_uart_reset(DeviceState *dev) diff --git a/hw/char/bcm2835_aux.c b/hw/char/bcm2835_aux.c index 4d46ad6..370dc7e 100644 --- a/hw/char/bcm2835_aux.c +++ b/hw/char/bcm2835_aux.c @@ -279,7 +279,7 @@ static void bcm2835_aux_realize(DeviceState *dev, Error= **errp) BCM2835AuxState *s =3D BCM2835_AUX(dev); =20 qemu_chr_fe_set_handlers(&s->chr, bcm2835_aux_can_receive, - bcm2835_aux_receive, NULL, s, NULL, true); + bcm2835_aux_receive, NULL, NULL, s, NULL, tru= e); } =20 static Property bcm2835_aux_props[] =3D { diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c index 4a2c124..3a9335c 100644 --- a/hw/char/cadence_uart.c +++ b/hw/char/cadence_uart.c @@ -485,7 +485,7 @@ static void cadence_uart_realize(DeviceState *dev, Erro= r **errp) fifo_trigger_update, s); =20 qemu_chr_fe_set_handlers(&s->chr, uart_can_receive, uart_receive, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } =20 static void cadence_uart_init(Object *obj) diff --git a/hw/char/debugcon.c b/hw/char/debugcon.c index 762e3d8..9b56fb8 100644 --- a/hw/char/debugcon.c +++ b/hw/char/debugcon.c @@ -92,7 +92,7 @@ static void debugcon_realize_core(DebugconState *s, Error= **errp) return; } =20 - qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, s, NULL, true); + qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, NULL, s, NULL, tru= e); } =20 static void debugcon_isa_realizefn(DeviceState *dev, Error **errp) diff --git a/hw/char/digic-uart.c b/hw/char/digic-uart.c index 34306e1..6ebcb87 100644 --- a/hw/char/digic-uart.c +++ b/hw/char/digic-uart.c @@ -146,7 +146,7 @@ static void digic_uart_realize(DeviceState *dev, Error = **errp) DigicUartState *s =3D DIGIC_UART(dev); =20 qemu_chr_fe_set_handlers(&s->chr, uart_can_rx, uart_rx, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } =20 static void digic_uart_init(Object *obj) diff --git a/hw/char/escc.c b/hw/char/escc.c index 3f78763..3546df3 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -1016,7 +1016,7 @@ static void escc_realize(DeviceState *dev, Error **er= rp) if (qemu_chr_fe_get_driver(&s->chn[i].chr)) { s->chn[i].clock =3D s->frequency / 2; qemu_chr_fe_set_handlers(&s->chn[i].chr, serial_can_receive, - serial_receive1, serial_event, + serial_receive1, serial_event, NULL, &s->chn[i], NULL, true); } } diff --git a/hw/char/etraxfs_ser.c b/hw/char/etraxfs_ser.c index c1fba9f..a184026 100644 --- a/hw/char/etraxfs_ser.c +++ b/hw/char/etraxfs_ser.c @@ -233,7 +233,7 @@ static void etraxfs_ser_realize(DeviceState *dev, Error= **errp) =20 qemu_chr_fe_set_handlers(&s->chr, serial_can_receive, serial_receive, - serial_event, s, NULL, true); + serial_event, NULL, s, NULL, true); } =20 static void etraxfs_ser_class_init(ObjectClass *klass, void *data) diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c index b51d44a..a84d2c3 100644 --- a/hw/char/exynos4210_uart.c +++ b/hw/char/exynos4210_uart.c @@ -645,7 +645,7 @@ static void exynos4210_uart_realize(DeviceState *dev, E= rror **errp) =20 qemu_chr_fe_set_handlers(&s->chr, exynos4210_uart_can_receive, exynos4210_uart_receive, exynos4210_uart_even= t, - s, NULL, true); + NULL, s, NULL, true); } =20 static Property exynos4210_uart_properties[] =3D { diff --git a/hw/char/grlib_apbuart.c b/hw/char/grlib_apbuart.c index 32d98ed..12d0c99 100644 --- a/hw/char/grlib_apbuart.c +++ b/hw/char/grlib_apbuart.c @@ -247,7 +247,7 @@ static int grlib_apbuart_init(SysBusDevice *dev) grlib_apbuart_can_receive, grlib_apbuart_receive, grlib_apbuart_event, - uart, NULL, true); + NULL, uart, NULL, true); =20 sysbus_init_irq(dev, &uart->irq); =20 diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c index af25030..70405cc 100644 --- a/hw/char/imx_serial.c +++ b/hw/char/imx_serial.c @@ -315,7 +315,7 @@ static void imx_serial_realize(DeviceState *dev, Error = **errp) DPRINTF("char dev for uart: %p\n", qemu_chr_fe_get_driver(&s->chr)); =20 qemu_chr_fe_set_handlers(&s->chr, imx_can_receive, imx_receive, - imx_event, s, NULL, true); + imx_event, NULL, s, NULL, true); } =20 static void imx_serial_init(Object *obj) diff --git a/hw/char/ipoctal232.c b/hw/char/ipoctal232.c index 337a3e56..cc8c8dc 100644 --- a/hw/char/ipoctal232.c +++ b/hw/char/ipoctal232.c @@ -545,7 +545,7 @@ static void ipoctal_realize(DeviceState *dev, Error **e= rrp) if (qemu_chr_fe_get_driver(&ch->dev)) { qemu_chr_fe_set_handlers(&ch->dev, hostdev_can_receive, hostdev_receive, hostdev_event, - ch, NULL, true); + NULL, ch, NULL, true); DPRINTF("Redirecting channel %u to %s\n", i, ch->dev->label); } else { DPRINTF("Could not redirect channel %u, no chardev set\n", i); diff --git a/hw/char/lm32_juart.c b/hw/char/lm32_juart.c index 3948dcd..d75c835 100644 --- a/hw/char/lm32_juart.c +++ b/hw/char/lm32_juart.c @@ -119,7 +119,7 @@ static void lm32_juart_realize(DeviceState *dev, Error = **errp) LM32JuartState *s =3D LM32_JUART(dev); =20 qemu_chr_fe_set_handlers(&s->chr, juart_can_rx, juart_rx, - juart_event, s, NULL, true); + juart_event, NULL, s, NULL, true); } =20 static const VMStateDescription vmstate_lm32_juart =3D { diff --git a/hw/char/lm32_uart.c b/hw/char/lm32_uart.c index cff8c38..c4a3b9b 100644 --- a/hw/char/lm32_uart.c +++ b/hw/char/lm32_uart.c @@ -266,7 +266,7 @@ static void lm32_uart_realize(DeviceState *dev, Error *= *errp) LM32UartState *s =3D LM32_UART(dev); =20 qemu_chr_fe_set_handlers(&s->chr, uart_can_rx, uart_rx, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } =20 static const VMStateDescription vmstate_lm32_uart =3D { diff --git a/hw/char/mcf_uart.c b/hw/char/mcf_uart.c index fe12ad5..56fa402 100644 --- a/hw/char/mcf_uart.c +++ b/hw/char/mcf_uart.c @@ -305,7 +305,7 @@ static void mcf_uart_realize(DeviceState *dev, Error **= errp) mcf_uart_state *s =3D MCF_UART(dev); =20 qemu_chr_fe_set_handlers(&s->chr, mcf_uart_can_receive, mcf_uart_recei= ve, - mcf_uart_event, s, NULL, true); + mcf_uart_event, NULL, s, NULL, true); } =20 static Property mcf_uart_properties[] =3D { diff --git a/hw/char/milkymist-uart.c b/hw/char/milkymist-uart.c index e19d0f6..548ee27 100644 --- a/hw/char/milkymist-uart.c +++ b/hw/char/milkymist-uart.c @@ -199,7 +199,7 @@ static void milkymist_uart_realize(DeviceState *dev, Er= ror **errp) MilkymistUartState *s =3D MILKYMIST_UART(dev); =20 qemu_chr_fe_set_handlers(&s->chr, uart_can_rx, uart_rx, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } =20 static void milkymist_uart_init(Object *obj) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 33802f0..2aa277f 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -329,7 +329,7 @@ static void pl011_realize(DeviceState *dev, Error **err= p) PL011State *s =3D PL011(dev); =20 qemu_chr_fe_set_handlers(&s->chr, pl011_can_receive, pl011_receive, - pl011_event, s, NULL, true); + pl011_event, NULL, s, NULL, true); } =20 static void pl011_class_init(ObjectClass *oc, void *data) diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c index 1b15046..741c641 100644 --- a/hw/char/sclpconsole-lm.c +++ b/hw/char/sclpconsole-lm.c @@ -313,7 +313,7 @@ static int console_init(SCLPEvent *event) console_available =3D true; =20 qemu_chr_fe_set_handlers(&scon->chr, chr_can_read, - chr_read, NULL, scon, NULL, true); + chr_read, NULL, NULL, scon, NULL, true); =20 return 0; } diff --git a/hw/char/sclpconsole.c b/hw/char/sclpconsole.c index 4a107a2..a92baa8 100644 --- a/hw/char/sclpconsole.c +++ b/hw/char/sclpconsole.c @@ -228,7 +228,7 @@ static int console_init(SCLPEvent *event) } console_available =3D true; qemu_chr_fe_set_handlers(&scon->chr, chr_can_read, - chr_read, NULL, scon, NULL, true); + chr_read, NULL, NULL, scon, NULL, true); =20 return 0; } diff --git a/hw/char/serial.c b/hw/char/serial.c index e1f1250..ab14ca4 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -897,7 +897,7 @@ void serial_realize_core(SerialState *s, Error **errp) qemu_register_reset(serial_reset, s); =20 qemu_chr_fe_set_handlers(&s->chr, serial_can_receive1, serial_receive1, - serial_event, s, NULL, true); + serial_event, NULL, s, NULL, true); fifo8_create(&s->recv_fifo, UART_FIFO_LENGTH); fifo8_create(&s->xmit_fifo, UART_FIFO_LENGTH); serial_reset(s); diff --git a/hw/char/sh_serial.c b/hw/char/sh_serial.c index ca9816d..ad043bd 100644 --- a/hw/char/sh_serial.c +++ b/hw/char/sh_serial.c @@ -400,7 +400,7 @@ void sh_serial_init(MemoryRegion *sysmem, qemu_chr_fe_init(&s->chr, chr, &error_abort); qemu_chr_fe_set_handlers(&s->chr, sh_serial_can_receive1, sh_serial_receive1, - sh_serial_event, s, NULL, true); + sh_serial_event, NULL, s, NULL, true); } =20 s->eri =3D eri_source; diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c index 8f02f3a..ddd1b00 100644 --- a/hw/char/spapr_vty.c +++ b/hw/char/spapr_vty.c @@ -84,7 +84,7 @@ static void spapr_vty_realize(VIOsPAPRDevice *sdev, Error= **errp) } =20 qemu_chr_fe_set_handlers(&dev->chardev, vty_can_receive, - vty_receive, NULL, dev, NULL, true); + vty_receive, NULL, NULL, dev, NULL, true); } =20 /* Forward declaration */ diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c index 59872e6..268e435 100644 --- a/hw/char/stm32f2xx_usart.c +++ b/hw/char/stm32f2xx_usart.c @@ -207,7 +207,8 @@ static void stm32f2xx_usart_realize(DeviceState *dev, E= rror **errp) STM32F2XXUsartState *s =3D STM32F2XX_USART(dev); =20 qemu_chr_fe_set_handlers(&s->chr, stm32f2xx_usart_can_receive, - stm32f2xx_usart_receive, NULL, s, NULL, true); + stm32f2xx_usart_receive, NULL, NULL, + s, NULL, true); } =20 static void stm32f2xx_usart_class_init(ObjectClass *klass, void *data) diff --git a/hw/char/terminal3270.c b/hw/char/terminal3270.c index 7b10a04..5adf95b 100644 --- a/hw/char/terminal3270.c +++ b/hw/char/terminal3270.c @@ -179,7 +179,7 @@ static void terminal_init(EmulatedCcw3270Device *dev, E= rror **errp) } terminal_available =3D true; qemu_chr_fe_set_handlers(&t->chr, terminal_can_read, - terminal_read, chr_event, t, NULL, true); + terminal_read, chr_event, NULL, t, NULL, true= ); } =20 static int read_payload_3270(EmulatedCcw3270Device *dev, uint32_t cda, diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c index 0cb1668..afb4949 100644 --- a/hw/char/virtio-console.c +++ b/hw/char/virtio-console.c @@ -188,11 +188,11 @@ static void virtconsole_realize(DeviceState *dev, Err= or **errp) */ if (k->is_console) { qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read, - NULL, vcon, NULL, true); + NULL, NULL, vcon, NULL, true); virtio_serial_open(port); } else { qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read, - chr_event, vcon, NULL, false); + chr_event, NULL, vcon, NULL, false); } } } diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c index f9af8ca..c4e8c72 100644 --- a/hw/char/xen_console.c +++ b/hw/char/xen_console.c @@ -246,7 +246,7 @@ static int con_initialise(struct XenDevice *xendev) =20 xen_be_bind_evtchn(&con->xendev); qemu_chr_fe_set_handlers(&con->chr, xencons_can_receive, - xencons_receive, NULL, con, NULL, true); + xencons_receive, NULL, NULL, con, NULL, true); =20 xen_pv_printf(xendev, 1, "ring mfn %d, remote port %d, local port %d, limit %zd\n= ", diff --git a/hw/char/xilinx_uartlite.c b/hw/char/xilinx_uartlite.c index 71ed2fc..2a8bc1e 100644 --- a/hw/char/xilinx_uartlite.c +++ b/hw/char/xilinx_uartlite.c @@ -212,7 +212,7 @@ static void xilinx_uartlite_realize(DeviceState *dev, E= rror **errp) XilinxUARTLite *s =3D XILINX_UARTLITE(dev); =20 qemu_chr_fe_set_handlers(&s->chr, uart_can_rx, uart_rx, - uart_event, s, NULL, true); + uart_event, NULL, s, NULL, true); } =20 static void xilinx_uartlite_init(Object *obj) diff --git a/hw/ipmi/ipmi_bmc_extern.c b/hw/ipmi/ipmi_bmc_extern.c index 329b03e..182de58 100644 --- a/hw/ipmi/ipmi_bmc_extern.c +++ b/hw/ipmi/ipmi_bmc_extern.c @@ -453,7 +453,7 @@ static void ipmi_bmc_extern_realize(DeviceState *dev, E= rror **errp) } =20 qemu_chr_fe_set_handlers(&ibe->chr, can_receive, receive, - chr_event, ibe, NULL, true); + chr_event, NULL, ibe, NULL, true); } =20 static int ipmi_bmc_extern_post_migrate(void *opaque, int version_id) diff --git a/hw/mips/boston.c b/hw/mips/boston.c index a4677f7..146be2a 100644 --- a/hw/mips/boston.c +++ b/hw/mips/boston.c @@ -533,7 +533,7 @@ static void boston_mach_init(MachineState *machine) chr =3D qemu_chr_new("lcd", "vc:320x240"); qemu_chr_fe_init(&s->lcd_display, chr, NULL); qemu_chr_fe_set_handlers(&s->lcd_display, NULL, NULL, - boston_lcd_event, s, NULL, true); + boston_lcd_event, NULL, s, NULL, true); =20 ahci =3D pci_create_simple_multifunction(&PCI_BRIDGE(&pcie2->root)->se= c_bus, PCI_DEVFN(0, 0), diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c index dad2f37..8cb9d3c 100644 --- a/hw/mips/mips_malta.c +++ b/hw/mips/mips_malta.c @@ -570,7 +570,7 @@ static MaltaFPGAState *malta_fpga_init(MemoryRegion *ad= dress_space, chr =3D qemu_chr_new("fpga", "vc:320x200"); qemu_chr_fe_init(&s->display, chr, NULL); qemu_chr_fe_set_handlers(&s->display, NULL, NULL, - malta_fgpa_display_event, s, NULL, true); + malta_fgpa_display_event, NULL, s, NULL, true= ); =20 s->uart =3D serial_mm_init(address_space, base + 0x900, 3, uart_irq, 230400, uart_chr, DEVICE_NATIVE_ENDIAN); diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index 2f0819d..a857e50 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -894,7 +894,7 @@ static void ivshmem_common_realize(PCIDevice *dev, Erro= r **errp) } =20 qemu_chr_fe_set_handlers(&s->server_chr, ivshmem_can_receive, - ivshmem_read, NULL, s, NULL, true); + ivshmem_read, NULL, NULL, s, NULL, true); =20 if (ivshmem_setup_interrupts(s, errp) < 0) { error_prepend(errp, "Failed to initialize interrupts: "); diff --git a/hw/usb/ccid-card-passthru.c b/hw/usb/ccid-card-passthru.c index ac1725e..e9f58c9 100644 --- a/hw/usb/ccid-card-passthru.c +++ b/hw/usb/ccid-card-passthru.c @@ -348,7 +348,7 @@ static int passthru_initfn(CCIDCardState *base) qemu_chr_fe_set_handlers(&card->cs, ccid_card_vscard_can_read, ccid_card_vscard_read, - ccid_card_vscard_event, card, NULL, true); + ccid_card_vscard_event, NULL, card, NULL, true); ccid_card_vscard_send_init(card); } else { error_report("missing chardev"); diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c index bfbf7cd..dc145a6 100644 --- a/hw/usb/dev-serial.c +++ b/hw/usb/dev-serial.c @@ -502,7 +502,7 @@ static void usb_serial_realize(USBDevice *dev, Error **= errp) } =20 qemu_chr_fe_set_handlers(&s->cs, usb_serial_can_read, usb_serial_read, - usb_serial_event, s, NULL, true); + usb_serial_event, NULL, s, NULL, true); usb_serial_handle_reset(dev); =20 if (chr->be_open && !dev->attached) { diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index aa22d69..115efb9 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -1399,7 +1399,7 @@ static void usbredir_realize(USBDevice *udev, Error *= *errp) /* Let the backend know we are ready */ qemu_chr_fe_set_handlers(&dev->cs, usbredir_chardev_can_read, usbredir_chardev_read, usbredir_chardev_event, - dev, NULL, true); + NULL, dev, NULL, true); =20 dev->vmstate =3D qemu_add_vm_change_state_handler(usbredir_vm_state_change, dev); diff --git a/include/chardev/char-fe.h b/include/chardev/char-fe.h index 2cbb262..9f38060 100644 --- a/include/chardev/char-fe.h +++ b/include/chardev/char-fe.h @@ -4,6 +4,7 @@ #include "chardev/char.h" =20 typedef void IOEventHandler(void *opaque, int event); +typedef int BackendChangeHandler(void *opaque); =20 /* This is the backend as seen by frontend, the actual backend is * Chardev */ @@ -12,6 +13,7 @@ struct CharBackend { IOEventHandler *chr_event; IOCanReadHandler *chr_can_read; IOReadHandler *chr_read; + BackendChangeHandler *chr_be_change; void *opaque; int tag; int fe_open; @@ -54,6 +56,8 @@ Chardev *qemu_chr_fe_get_driver(CharBackend *be); * receive * @fd_read: callback to receive data from char * @fd_event: event callback + * @be_change: backend change callback; passing NULL means hot backend cha= nge + * is not supported and will not be attempted * @opaque: an opaque pointer for the callbacks * @context: a main loop context or NULL for the default * @set_open: whether to call qemu_chr_fe_set_open() implicitely when @@ -68,6 +72,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b, IOCanReadHandler *fd_can_read, IOReadHandler *fd_read, IOEventHandler *fd_event, + BackendChangeHandler *be_change, void *opaque, GMainContext *context, bool set_open); diff --git a/monitor.c b/monitor.c index d8ac20f..292fc34 100644 --- a/monitor.c +++ b/monitor.c @@ -4110,12 +4110,12 @@ void monitor_init(Chardev *chr, int flags) =20 if (monitor_is_qmp(mon)) { qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_qmp_= read, - monitor_qmp_event, mon, NULL, true); + monitor_qmp_event, NULL, mon, NULL, true); qemu_chr_fe_set_echo(&mon->chr, true); json_message_parser_init(&mon->qmp.parser, handle_qmp_command); } else { qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_read, - monitor_event, mon, NULL, true); + monitor_event, NULL, mon, NULL, true); } =20 qemu_mutex_lock(&monitor_lock); diff --git a/net/colo-compare.c b/net/colo-compare.c index 6d500e1..abfc23c 100644 --- a/net/colo-compare.c +++ b/net/colo-compare.c @@ -543,7 +543,7 @@ static void compare_pri_chr_in(void *opaque, const uint= 8_t *buf, int size) =20 ret =3D net_fill_rstate(&s->pri_rs, buf, size); if (ret =3D=3D -1) { - qemu_chr_fe_set_handlers(&s->chr_pri_in, NULL, NULL, NULL, + qemu_chr_fe_set_handlers(&s->chr_pri_in, NULL, NULL, NULL, NULL, NULL, NULL, true); error_report("colo-compare primary_in error"); } @@ -560,7 +560,7 @@ static void compare_sec_chr_in(void *opaque, const uint= 8_t *buf, int size) =20 ret =3D net_fill_rstate(&s->sec_rs, buf, size); if (ret =3D=3D -1) { - qemu_chr_fe_set_handlers(&s->chr_sec_in, NULL, NULL, NULL, + qemu_chr_fe_set_handlers(&s->chr_sec_in, NULL, NULL, NULL, NULL, NULL, NULL, true); error_report("colo-compare secondary_in error"); } @@ -588,9 +588,11 @@ static void *colo_compare_thread(void *opaque) s->worker_context =3D g_main_context_new(); =20 qemu_chr_fe_set_handlers(&s->chr_pri_in, compare_chr_can_read, - compare_pri_chr_in, NULL, s, s->worker_context, = true); + compare_pri_chr_in, NULL, NULL, + s, s->worker_context, true); qemu_chr_fe_set_handlers(&s->chr_sec_in, compare_chr_can_read, - compare_sec_chr_in, NULL, s, s->worker_context, = true); + compare_sec_chr_in, NULL, NULL, + s, s->worker_context, true); =20 s->compare_loop =3D g_main_loop_new(s->worker_context, FALSE); =20 diff --git a/net/filter-mirror.c b/net/filter-mirror.c index 52d978f..62a8265 100644 --- a/net/filter-mirror.c +++ b/net/filter-mirror.c @@ -112,7 +112,7 @@ static void redirector_chr_read(void *opaque, const uin= t8_t *buf, int size) =20 if (ret =3D=3D -1) { qemu_chr_fe_set_handlers(&s->chr_in, NULL, NULL, NULL, - NULL, NULL, true); + NULL, NULL, NULL, true); } } =20 @@ -124,7 +124,7 @@ static void redirector_chr_event(void *opaque, int even= t) switch (event) { case CHR_EVENT_CLOSED: qemu_chr_fe_set_handlers(&s->chr_in, NULL, NULL, NULL, - NULL, NULL, true); + NULL, NULL, NULL, true); break; default: break; @@ -245,7 +245,7 @@ static void filter_redirector_setup(NetFilterState *nf,= Error **errp) =20 qemu_chr_fe_set_handlers(&s->chr_in, redirector_chr_can_read, redirector_chr_read, redirector_chr_event, - nf, NULL, true); + NULL, nf, NULL, true); } =20 if (s->outdev) { diff --git a/net/slirp.c b/net/slirp.c index 6a6d727..9fbc949 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -778,7 +778,7 @@ static int slirp_guestfwd(SlirpState *s, const char *co= nfig_str, fwd->slirp =3D s->slirp; =20 qemu_chr_fe_set_handlers(&fwd->hd, guestfwd_can_read, guestfwd_rea= d, - NULL, fwd, NULL, true); + NULL, NULL, fwd, NULL, true); } return 0; =20 diff --git a/net/vhost-user.c b/net/vhost-user.c index a042ec6..36f32a2 100644 --- a/net/vhost-user.c +++ b/net/vhost-user.c @@ -211,7 +211,7 @@ static void chr_closed_bh(void *opaque) vhost_user_stop(queues, ncs); =20 qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, net_vhost_user_event, - opaque, NULL, true); + NULL, opaque, NULL, true); =20 if (err) { error_report_err(err); @@ -257,7 +257,7 @@ static void net_vhost_user_event(void *opaque, int even= t) =20 g_source_remove(s->watch); s->watch =3D 0; - qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, + qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, NULL, NULL, NULL, false); =20 aio_bh_schedule_oneshot(ctx, chr_closed_bh, opaque); @@ -305,7 +305,8 @@ static int net_vhost_user_init(NetClientState *peer, co= nst char *device, return -1; } qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, - net_vhost_user_event, nc0->name, NULL, tr= ue); + net_vhost_user_event, NULL, nc0->name, NU= LL, + true); } while (!s->started); =20 assert(s->vhost_net); diff --git a/qtest.c b/qtest.c index 9a5d1dc..88a09e9 100644 --- a/qtest.c +++ b/qtest.c @@ -691,7 +691,7 @@ void qtest_init(const char *qtest_chrdev, const char *q= test_log, Error **errp) =20 qemu_chr_fe_init(&qtest_chr, chr, errp); qemu_chr_fe_set_handlers(&qtest_chr, qtest_can_read, qtest_read, - qtest_event, &qtest_chr, NULL, true); + qtest_event, NULL, &qtest_chr, NULL, true); qemu_chr_fe_set_echo(&qtest_chr, true); =20 inbuf =3D g_string_new(""); diff --git a/target/xtensa/xtensa-semi.c b/target/xtensa/xtensa-semi.c index 32e2bd7..7aa1d13 100644 --- a/target/xtensa/xtensa-semi.c +++ b/target/xtensa/xtensa-semi.c @@ -158,7 +158,7 @@ void xtensa_sim_open_console(Chardev *chr) static CharBackend console; =20 qemu_chr_fe_init(&console, chr, &error_abort); - qemu_chr_fe_set_handlers(&console, NULL, NULL, NULL, NULL, NULL, true); + qemu_chr_fe_set_handlers(&console, NULL, NULL, NULL, NULL, NULL, NULL,= true); xtensa_sim_console =3D &console; } =20 diff --git a/tests/test-char.c b/tests/test-char.c index b962063..38aaa27 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -178,6 +178,7 @@ static void char_mux_test(void) fe_can_read, fe_read, fe_event, + NULL, &h1, NULL, true); =20 @@ -186,6 +187,7 @@ static void char_mux_test(void) fe_can_read, fe_read, fe_event, + NULL, &h2, NULL, true); qemu_chr_fe_take_focus(&chr_be2); @@ -209,7 +211,8 @@ static void char_mux_test(void) h1.read_count =3D 0; =20 /* remove first handler */ - qemu_chr_fe_set_handlers(&chr_be1, NULL, NULL, NULL, NULL, NULL, true); + qemu_chr_fe_set_handlers(&chr_be1, NULL, NULL, NULL, NULL, + NULL, NULL, true); qemu_chr_be_write(base, (void *)"hello", 6); g_assert_cmpint(h1.read_count, =3D=3D, 0); g_assert_cmpint(h2.read_count, =3D=3D, 0); @@ -307,13 +310,13 @@ static void char_socket_test(void) =20 qemu_chr_fe_init(&be, chr, &error_abort); qemu_chr_fe_set_handlers(&be, socket_can_read, socket_read, - NULL, &d, NULL, true); + NULL, NULL, &d, NULL, true); =20 chr_client =3D qemu_chr_new("client", tmp); qemu_chr_fe_init(&client_be, chr_client, &error_abort); qemu_chr_fe_set_handlers(&client_be, socket_can_read_hello, socket_read_hello, - NULL, &d, NULL, true); + NULL, NULL, &d, NULL, true); g_free(tmp); =20 d.conn_expected =3D true; @@ -383,6 +386,7 @@ static void char_pipe_test(void) fe_can_read, fe_read, fe_event, + NULL, &fe, NULL, true); =20 @@ -431,7 +435,7 @@ static void char_udp_test(void) d.chr =3D chr; qemu_chr_fe_init(&be, chr, &error_abort); qemu_chr_fe_set_handlers(&be, socket_can_read_hello, socket_read_hello, - NULL, &d, NULL, true); + NULL, NULL, &d, NULL, true); ret =3D qemu_chr_write_all(chr, (uint8_t *)"hello", 5); g_assert_cmpint(ret, =3D=3D, 5); =20 @@ -523,6 +527,7 @@ static void char_file_test(void) fe_can_read, fe_read, fe_event, + NULL, &fe, NULL, true); =20 g_assert_cmpint(fe.last_event, !=3D, CHR_EVENT_BREAK); @@ -583,6 +588,7 @@ static void char_null_test(void) fe_can_read, fe_read, fe_event, + NULL, NULL, NULL, true); =20 ret =3D qemu_chr_fe_write(&be, (void *)"buf", 4); diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c index b3cc045..d4da09f 100644 --- a/tests/vhost-user-test.c +++ b/tests/vhost-user-test.c @@ -464,7 +464,7 @@ static void test_server_create_chr(TestServer *server, = const gchar *opt) =20 qemu_chr_fe_init(&server->chr, chr, &error_abort); qemu_chr_fe_set_handlers(&server->chr, chr_can_read, chr_read, - chr_event, server, NULL, true); + chr_event, NULL, server, NULL, true); } =20 static void test_server_listen(TestServer *server) --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956529796804.7201293258408; Thu, 13 Jul 2017 07:35:29 -0700 (PDT) Received: from localhost ([::1]:60403 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfDA-0001ID-Bs for importer@patchew.org; Thu, 13 Jul 2017 10:35:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50999) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf35-0000Xw-4y for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf33-00022L-GP for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:59 -0400 Received: from mail-wr0-x234.google.com ([2a00:1450:400c:c0c::234]:35726) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf33-00021h-6D for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:24:57 -0400 Received: by mail-wr0-x234.google.com with SMTP id k67so53861527wrc.2 for ; Thu, 13 Jul 2017 07:24:57 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=93S9afDY3+DqAtyTbH+iQMCgh0ox0nsrlyiWNTR0q1o=; b=ucgHNrasSSILj3C7aEuusiC1ytujuwxCizpPD+0AcnkBldmI1t4j2+H9t09lshfXYB 5ButxrlGP8rxCrLoBn2xpNEDc7ejI5Nv8LkUJI5QiKpUOpI30KmueeWi7hBAspvcdCPJ IXzEMDxKN1Hu7UsDqo0QIyBOig5/cHKrHglnVXjBH5/sSvg78OS7+doxGU8h+c7HizwR TadgsgouN1Z0d6XZnsHCAB1spCiFV72jttBkIwpFjVUlYe0+bIcoqpsYUpEr2FOJsvsH aWYz0MB4KGuqQn+gsHrVEGn35cFsr7QukqMzmMCjgaaj+9oi7+4QhdcgcpC9JPz5E4kI 3c1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=93S9afDY3+DqAtyTbH+iQMCgh0ox0nsrlyiWNTR0q1o=; b=TeUZi2z+/HAI7fEr9okJItTVmuVkq5kA871hhv0JYH/sN4Cz4OpuEdALB3R5BvcGlq iR7G7yJlyxyCuhr9UrYt0dbcm8pJxldYmRiwNMJHxapQ+lywY5C9/5uIrF+2XKJbSsl+ /fd3auQ1nnwHKnvaOU0cTxvsExI85j3fgihqzXYnIEL8u3knTy5ehHHMgALyZmu33k3X 1zNwUAIFDB1N0Jz0Mcnhuv4eD/93Jtzx9hbqiC8DSyWGrgGb18ot0NLrB08s5jEVRCsD pyRxSORfEiOtlLqcehgn6VWHv/iVDmBW1Sw7x094oYjDcT3Ehyapp+yNMK5qUhlbY14I KEYg== X-Gm-Message-State: AIVw112+zQ4YrulB2wyvbR2LDbj9/pwk801ZZFwbIV7aPh2Nlfp1NEn0 s/tsYCv45sL/xg8EJH8= X-Received: by 10.223.144.39 with SMTP id h36mr2093905wrh.114.1499955895807; Thu, 13 Jul 2017 07:24:55 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:03 +0200 Message-Id: <1499955874-10954-11-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::234 Subject: [Qemu-devel] [PULL 10/41] char: chardevice hotswap 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov This patch adds a possibility to change a char device without a frontend removal. Ideally, it would have to happen transparently to a frontend, i.e. frontend would continue its regular operation. However, backends are not stateless and are set up by the frontends via qemu_chr_fe_<> functions, and it's not (generally) possible to replay that setup entirely in a backend code, as different chardevs respond to the setup calls differently, so do frontends work differently basing on those setup responses. Moreover, some frontend can generally get and save the backend pointer (qemu_chr_fe_get_driver()), and it will become invalid after backend change. So, a frontend which would like to support chardev hotswap has to register a "backend change" handler, and redo its backend setup there. Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Message-Id: <1499342940-56739-4-git-send-email-anton.nefedov@virtuozzo.com> Reviewed-by: Marc-Andr=C3=A9 Lureau Signed-off-by: Paolo Bonzini --- chardev/char.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ include/chardev/char.h | 9 ++++++ qapi-schema.json | 40 ++++++++++++++++++++++++ 3 files changed, 132 insertions(+) diff --git a/chardev/char.c b/chardev/char.c index 839eff6..d6b9d89 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -951,6 +951,89 @@ ChardevReturn *qmp_chardev_add(const char *id, Chardev= Backend *backend, return ret; } =20 +ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend, + Error **errp) +{ + CharBackend *be; + const ChardevClass *cc; + Chardev *chr, *chr_new; + bool closed_sent =3D false; + ChardevReturn *ret; + + chr =3D qemu_chr_find(id); + if (!chr) { + error_setg(errp, "Chardev '%s' does not exist", id); + return NULL; + } + + if (CHARDEV_IS_MUX(chr)) { + error_setg(errp, "Mux device hotswap not supported yet"); + return NULL; + } + + if (qemu_chr_replay(chr)) { + error_setg(errp, + "Chardev '%s' cannot be changed in record/replay mode", id); + return NULL; + } + + be =3D chr->be; + if (!be) { + /* easy case */ + object_unparent(OBJECT(chr)); + return qmp_chardev_add(id, backend, errp); + } + + if (!be->chr_be_change) { + error_setg(errp, "Chardev user does not support chardev hotswap"); + return NULL; + } + + cc =3D char_get_class(ChardevBackendKind_lookup[backend->type], errp); + if (!cc) { + return NULL; + } + + chr_new =3D qemu_chardev_new(NULL, object_class_get_name(OBJECT_CLASS(= cc)), + backend, errp); + if (!chr_new) { + return NULL; + } + chr_new->label =3D g_strdup(id); + + if (chr->be_open && !chr_new->be_open) { + qemu_chr_be_event(chr, CHR_EVENT_CLOSED); + closed_sent =3D true; + } + + chr->be =3D NULL; + qemu_chr_fe_init(be, chr_new, &error_abort); + + if (be->chr_be_change(be->opaque) < 0) { + error_setg(errp, "Chardev '%s' change failed", chr_new->label); + chr_new->be =3D NULL; + qemu_chr_fe_init(be, chr, &error_abort); + if (closed_sent) { + qemu_chr_be_event(chr, CHR_EVENT_OPENED); + } + object_unref(OBJECT(chr_new)); + return NULL; + } + + object_unparent(OBJECT(chr)); + object_property_add_child(get_chardevs_root(), chr_new->label, + OBJECT(chr_new), &error_abort); + object_unref(OBJECT(chr_new)); + + ret =3D g_new0(ChardevReturn, 1); + if (CHARDEV_IS_PTY(chr_new)) { + ret->pty =3D g_strdup(chr_new->filename + 4); + ret->has_pty =3D true; + } + + return ret; +} + void qmp_chardev_remove(const char *id, Error **errp) { Chardev *chr; diff --git a/include/chardev/char.h b/include/chardev/char.h index 8a9ade4..22fd734 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -93,6 +93,15 @@ void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon= *backend); Chardev *qemu_chr_new(const char *label, const char *filename); =20 /** + * @qemu_chr_change: + * + * Change an existing character backend + * + * @opts the new backend options + */ +void qemu_chr_change(QemuOpts *opts, Error **errp); + +/** * @qemu_chr_cleanup: * * Delete all chardevs (when leaving qemu) diff --git a/qapi-schema.json b/qapi-schema.json index 37c4b95..0090fbf 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -5098,6 +5098,46 @@ 'returns': 'ChardevReturn' } =20 ## +# @chardev-change: +# +# Change a character device backend +# +# @id: the chardev's ID, must exist +# @backend: new backend type and parameters +# +# Returns: ChardevReturn. +# +# Since: 2.10 +# +# Example: +# +# -> { "execute" : "chardev-change", +# "arguments" : { "id" : "baz", +# "backend" : { "type" : "pty", "data" : {} } } } +# <- { "return": { "pty" : "/dev/pty/42" } } +# +# -> {"execute" : "chardev-change", +# "arguments" : { +# "id" : "charchannel2", +# "backend" : { +# "type" : "socket", +# "data" : { +# "addr" : { +# "type" : "unix" , +# "data" : { +# "path" : "/tmp/charchannel2.socket" +# } +# }, +# "server" : true, +# "wait" : false }}}} +# <- {"return": {}} +# +## +{ 'command': 'chardev-change', 'data': {'id' : 'str', + 'backend' : 'ChardevBackend' }, + 'returns': 'ChardevReturn' } + +## # @chardev-remove: # # Remove a character device backend --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957477892729.5140165519749; Thu, 13 Jul 2017 07:51:17 -0700 (PDT) Received: from localhost ([::1]:60484 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfSV-0000Ql-3w for importer@patchew.org; Thu, 13 Jul 2017 10:51:15 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51684) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf48-0001d1-AW for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf42-0003d7-MG for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:04 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:34803) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf42-0003Zi-FL for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:58 -0400 Received: by mail-wr0-f195.google.com with SMTP id k67so9397089wrc.1 for ; Thu, 13 Jul 2017 07:25:58 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=v8Ye64ojBmodVoLEiAf8jnorl9/RSRr2e/2Mv26y/FU=; b=i2aS4rlwLX1Y7A55bjn3zTy95j3cf1FEEKlwbR6Pl2h1KG4KYpNDI3hDqq3qlCE5vk fzlw1W57klNCrvShOf7pG8LdzE9o5pAdHQqyXQmyF/4RLAW+LnJvbZ4/pqA4dUvrido9 vqGl/jJfZEX1q4Shxpq5Z2WhNEYFiyg0ns/2jidCW1FlI/4N8vZ+RfiFiIJJqbCwUtKU xvvHuD/c1xT41fSCl3nGh6NtP2lsOilFYuAVzCkfEVFuT/sWkm2Tm4DNOFCU/TEkSffh Wnyhf4bEFe4nsdV6Urgahar8a1hHgkLxvaWjqhXUC+eVLBv29+kPp85XgB2Lno8TduJP zjkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=v8Ye64ojBmodVoLEiAf8jnorl9/RSRr2e/2Mv26y/FU=; b=Jw3zyejeIETKqEuYVmDd47zDXY6k3iGkZcX7LOsuzmKaNYlvRxgAAuoOgN4H2tdqtt mQu6eBQLbUfswhUJKo6OvjMTVkTDKvEee0ZGA98a548asKKFxCdeCxm1U5ccve/ZZDJ9 lhSHxPG9TFfKzJmS29QYI4JufbEUMJC3ST8jZH8TkW2EbO3SY5M+pgoaB2MKYdlUzxFR UIzFcCG/2PoifaA93gvQszQ25LIt5EMbKW/gorHzgxdpd2V1i+L+iNeuyIT77UyqnW71 wR0ZYxAGAE0JG8/jomf8oCYw89c2O/J9KQXb4kA6SztMHW+K/ZjNq95FSs3SCgs91jFs 3SlQ== X-Gm-Message-State: AIVw111YSguPNugE2EscC49rVjay7WN/rAHbe4mrJObnQ1MGPIfE1z5L cgw5Fu2N4o7IVVhHhSw= X-Received: by 10.223.134.157 with SMTP id 29mr2153280wrx.157.1499955897089; Thu, 13 Jul 2017 07:24:57 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:04 +0200 Message-Id: <1499955874-10954-12-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.195 Subject: [Qemu-devel] [PULL 11/41] char: forbid direct chardevice access for hotswap devices 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov qemu_chr_fe_get_driver() is unsafe, frontends with hotswap support should not access CharDriver ptr directly as CharDriver might change. Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <1499342940-56739-5-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- chardev/char-fe.c | 7 +++++++ include/chardev/char-fe.h | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index 7054863..de5ba3c 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -179,9 +179,16 @@ void qemu_chr_fe_printf(CharBackend *be, const char *f= mt, ...) =20 Chardev *qemu_chr_fe_get_driver(CharBackend *be) { + /* this is unsafe for the users that support chardev hotswap */ + assert(be->chr_be_change =3D=3D NULL); return be->chr; } =20 +bool qemu_chr_fe_backend_connected(CharBackend *be) +{ + return !!be->chr; +} + bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp) { int tag =3D 0; diff --git a/include/chardev/char-fe.h b/include/chardev/char-fe.h index 9f38060..588abed 100644 --- a/include/chardev/char-fe.h +++ b/include/chardev/char-fe.h @@ -46,10 +46,20 @@ void qemu_chr_fe_deinit(CharBackend *b, bool del); * * Returns the driver associated with a CharBackend or NULL if no * associated Chardev. + * Note: avoid this function as the driver should never be accessed direct= ly, + * especially by the frontends that support chardevice hotswap. + * Consider qemu_chr_fe_backend_connected() to check for driver exis= tence */ Chardev *qemu_chr_fe_get_driver(CharBackend *be); =20 /** + * @qemu_chr_fe_backend_connected: + * + * Returns true if there is a chardevice associated with @be. + */ +bool qemu_chr_fe_backend_connected(CharBackend *be); + +/** * @qemu_chr_fe_set_handlers: * @b: a CharBackend * @fd_can_read: callback to get the amount of data the frontend may --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956692053168.6157825027757; Thu, 13 Jul 2017 07:38:12 -0700 (PDT) Received: from localhost ([::1]:60419 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfFn-0003Vb-Kp for importer@patchew.org; Thu, 13 Jul 2017 10:38:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51042) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf38-0000bc-Kl for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf36-00023e-Iy for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:02 -0400 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:33480) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf36-00023E-77 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:00 -0400 Received: by mail-wr0-x242.google.com with SMTP id n18so1461661wrb.0 for ; Thu, 13 Jul 2017 07:25:00 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4j+9d4IyiG4Jj5hk+2TsfP8EyXLwaX54sb1zj3DjaRc=; b=K9HedOe7XoUqQVzhajn54NjdXvYZPU1DeOAGeIy+zaIOfRmpAcc/T93BDX7WAudY8e zq2wLfw0eo15yW2Lr2Z4eLhvViwA1WLXHGgLH9q9pGdpGWT5Ayb4TPwHlWZQSxSfXz3l SHHJX9VVV9TjCGa3Zf6KN1VoyGL1c/9raQw1yTonzZv+ysdHjd1Mc+oYhDIwd5Q4pqL3 7q4eqZyi5V96PnfxSjTBJ7mYFAf6ePEyJ4S7AlbkUKLgUSXDRVlghg7EAcrPMHhO6dsX cy8ogDCKVREJAOJB/YKhnMUZBWgS1p5CURDNpGVqr/dv1AAQbjNxASmYLf0Pgm8zUH3F tkyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=4j+9d4IyiG4Jj5hk+2TsfP8EyXLwaX54sb1zj3DjaRc=; b=b3gEQKqXYxTis1AFb/pgeqST62s4Ug/NaWw5wtK2aC48VusIReZBtw8IQCtVuAAmuy QGouc+CFw7ym23tZSMaYtG93oEiUQK8ZkrUpfL7mfjs/3g1qSjok/e+5aK0TQZeqcpfb bS5zK/JNFP/ab9PCJi8cjKDOjcJmUAYaYAkLAKzrmM6qqbI0UjcWnribZtRqT3wi0PBL ords4orQ4GEA3But5+LNhAChVPfvT28BjWboo6mw2gM5godZCh2yf5gOiDTRgTcc8S3n z3mU+MQ+CruGz6kB3RfxY58rZJvB6beso5EshKBtb1yJw4JDdbn0xj8Az0tUah3WNyUh Vvgg== X-Gm-Message-State: AIVw110wVUAOGcQNobzelCi765j0o2tX4G5UVzdXhzjCWZX9CNt62IlT UtopipGKb+CI4ImybkI= X-Received: by 10.223.136.212 with SMTP id g20mr2016906wrg.96.1499955898634; Thu, 13 Jul 2017 07:24:58 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:05 +0200 Message-Id: <1499955874-10954-13-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::242 Subject: [Qemu-devel] [PULL 12/41] char: avoid chardevice direct access 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov frontends should avoid accessing CharDriver struct where possible Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <1499342940-56739-6-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- chardev/char-fe.c | 5 +++++ hw/arm/strongarm.c | 2 +- hw/char/cadence_uart.c | 2 +- hw/char/debugcon.c | 2 +- hw/char/escc.c | 6 +++--- hw/char/exynos4210_uart.c | 2 +- hw/char/grlib_apbuart.c | 2 +- hw/char/ipoctal232.c | 2 +- hw/char/parallel.c | 2 +- hw/char/sclpconsole-lm.c | 2 +- hw/char/sclpconsole.c | 2 +- hw/char/serial.c | 2 +- hw/char/sh_serial.c | 2 +- hw/char/spapr_vty.c | 2 +- hw/char/terminal3270.c | 2 +- hw/char/virtio-console.c | 5 ++--- hw/char/xen_console.c | 2 +- hw/ipmi/ipmi_bmc_extern.c | 2 +- hw/misc/ivshmem.c | 4 ++-- hw/usb/ccid-card-passthru.c | 4 ++-- hw/usb/dev-serial.c | 5 ++--- hw/usb/redirect.c | 5 ++--- include/chardev/char-fe.h | 7 +++++++ net/filter-mirror.c | 2 +- 24 files changed, 41 insertions(+), 32 deletions(-) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index de5ba3c..f3af6ae 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -189,6 +189,11 @@ bool qemu_chr_fe_backend_connected(CharBackend *be) return !!be->chr; } =20 +bool qemu_chr_fe_backend_open(CharBackend *be) +{ + return be->chr && be->chr->be_open; +} + bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp) { int tag =3D 0; diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c index 1fa082c..6a45dcc 100644 --- a/hw/arm/strongarm.c +++ b/hw/arm/strongarm.c @@ -1106,7 +1106,7 @@ static void strongarm_uart_tx(void *opaque) =20 if (s->utcr3 & UTCR3_LBM) /* loopback */ { strongarm_uart_receive(s, &s->tx_fifo[s->tx_start], 1); - } else if (qemu_chr_fe_get_driver(&s->chr)) { + } else if (qemu_chr_fe_backend_connected(&s->chr)) { /* XXX this blocks entire thread. Rewrite to use * qemu_chr_fe_write and background I/O callbacks */ qemu_chr_fe_write_all(&s->chr, &s->tx_fifo[s->tx_start], 1); diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c index 3a9335c..6143494 100644 --- a/hw/char/cadence_uart.c +++ b/hw/char/cadence_uart.c @@ -279,7 +279,7 @@ static gboolean cadence_uart_xmit(GIOChannel *chan, GIO= Condition cond, int ret; =20 /* instant drain the fifo when there's no back-end */ - if (!qemu_chr_fe_get_driver(&s->chr)) { + if (!qemu_chr_fe_backend_connected(&s->chr)) { s->tx_count =3D 0; return FALSE; } diff --git a/hw/char/debugcon.c b/hw/char/debugcon.c index 9b56fb8..95ccec6 100644 --- a/hw/char/debugcon.c +++ b/hw/char/debugcon.c @@ -87,7 +87,7 @@ static const MemoryRegionOps debugcon_ops =3D { =20 static void debugcon_realize_core(DebugconState *s, Error **errp) { - if (!qemu_chr_fe_get_driver(&s->chr)) { + if (!qemu_chr_fe_backend_connected(&s->chr)) { error_setg(errp, "Can't create debugcon device, empty char device"= ); return; } diff --git a/hw/char/escc.c b/hw/char/escc.c index 3546df3..89ae9eb 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -417,7 +417,7 @@ static void escc_update_parameters(ChannelState *s) int speed, parity, data_bits, stop_bits; QEMUSerialSetParams ssp; =20 - if (!qemu_chr_fe_get_driver(&s->chr) || s->type !=3D ser) + if (!qemu_chr_fe_backend_connected(&s->chr) || s->type !=3D ser) return; =20 if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREN) { @@ -557,7 +557,7 @@ static void escc_mem_write(void *opaque, hwaddr addr, trace_escc_mem_writeb_data(CHN_C(s), val); s->tx =3D val; if (s->wregs[W_TXCTRL2] & TXCTRL2_TXEN) { // tx enabled - if (qemu_chr_fe_get_driver(&s->chr)) { + if (qemu_chr_fe_backend_connected(&s->chr)) { /* XXX this blocks entire thread. Rewrite to use * qemu_chr_fe_write and background I/O callbacks */ qemu_chr_fe_write_all(&s->chr, &s->tx, 1); @@ -1013,7 +1013,7 @@ static void escc_realize(DeviceState *dev, Error **er= rp) ESCC_SIZE << s->it_shift); =20 for (i =3D 0; i < 2; i++) { - if (qemu_chr_fe_get_driver(&s->chn[i].chr)) { + if (qemu_chr_fe_backend_connected(&s->chn[i].chr)) { s->chn[i].clock =3D s->frequency / 2; qemu_chr_fe_set_handlers(&s->chn[i].chr, serial_can_receive, serial_receive1, serial_event, NULL, diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c index a84d2c3..3957e78 100644 --- a/hw/char/exynos4210_uart.c +++ b/hw/char/exynos4210_uart.c @@ -380,7 +380,7 @@ static void exynos4210_uart_write(void *opaque, hwaddr = offset, break; =20 case UTXH: - if (qemu_chr_fe_get_driver(&s->chr)) { + if (qemu_chr_fe_backend_connected(&s->chr)) { s->reg[I_(UTRSTAT)] &=3D ~(UTRSTAT_TRANSMITTER_EMPTY | UTRSTAT_Tx_BUFFER_EMPTY); ch =3D (uint8_t)val; diff --git a/hw/char/grlib_apbuart.c b/hw/char/grlib_apbuart.c index 12d0c99..bac11be 100644 --- a/hw/char/grlib_apbuart.c +++ b/hw/char/grlib_apbuart.c @@ -201,7 +201,7 @@ static void grlib_apbuart_write(void *opaque, hwaddr ad= dr, case DATA_OFFSET: case DATA_OFFSET + 3: /* When only one byte write */ /* Transmit when character device available and transmitter enable= d */ - if (qemu_chr_fe_get_driver(&uart->chr) && + if (qemu_chr_fe_backend_connected(&uart->chr) && (uart->control & UART_TRANSMIT_ENABLE)) { c =3D value & 0xFF; /* XXX this blocks entire thread. Rewrite to use diff --git a/hw/char/ipoctal232.c b/hw/char/ipoctal232.c index cc8c8dc..5e09caf 100644 --- a/hw/char/ipoctal232.c +++ b/hw/char/ipoctal232.c @@ -542,7 +542,7 @@ static void ipoctal_realize(DeviceState *dev, Error **e= rrp) ch->ipoctal =3D s; =20 /* Redirect IP-Octal channels to host character devices */ - if (qemu_chr_fe_get_driver(&ch->dev)) { + if (qemu_chr_fe_backend_connected(&ch->dev)) { qemu_chr_fe_set_handlers(&ch->dev, hostdev_can_receive, hostdev_receive, hostdev_event, NULL, ch, NULL, true); diff --git a/hw/char/parallel.c b/hw/char/parallel.c index 75a1a2f..055789f 100644 --- a/hw/char/parallel.c +++ b/hw/char/parallel.c @@ -513,7 +513,7 @@ static void parallel_isa_realizefn(DeviceState *dev, Er= ror **errp) int base; uint8_t dummy; =20 - if (!qemu_chr_fe_get_driver(&s->chr)) { + if (!qemu_chr_fe_backend_connected(&s->chr)) { error_setg(errp, "Can't create parallel device, empty char device"= ); return; } diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c index 741c641..c500bda 100644 --- a/hw/char/sclpconsole-lm.c +++ b/hw/char/sclpconsole-lm.c @@ -195,7 +195,7 @@ static int write_console_data(SCLPEvent *event, const u= int8_t *buf, int len) { SCLPConsoleLM *scon =3D SCLPLM_CONSOLE(event); =20 - if (!qemu_chr_fe_get_driver(&scon->chr)) { + if (!qemu_chr_fe_backend_connected(&scon->chr)) { /* If there's no backend, we can just say we consumed all data. */ return len; } diff --git a/hw/char/sclpconsole.c b/hw/char/sclpconsole.c index a92baa8..d0265df 100644 --- a/hw/char/sclpconsole.c +++ b/hw/char/sclpconsole.c @@ -163,7 +163,7 @@ static ssize_t write_console_data(SCLPEvent *event, con= st uint8_t *buf, { SCLPConsole *scon =3D SCLP_CONSOLE(event); =20 - if (!qemu_chr_fe_get_driver(&scon->chr)) { + if (!qemu_chr_fe_backend_connected(&scon->chr)) { /* If there's no backend, we can just say we consumed all data. */ return len; } diff --git a/hw/char/serial.c b/hw/char/serial.c index ab14ca4..b4fb8f3 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -886,7 +886,7 @@ static void serial_reset(void *opaque) =20 void serial_realize_core(SerialState *s, Error **errp) { - if (!qemu_chr_fe_get_driver(&s->chr)) { + if (!qemu_chr_fe_backend_connected(&s->chr)) { error_setg(errp, "Can't create serial device, empty char device"); return; } diff --git a/hw/char/sh_serial.c b/hw/char/sh_serial.c index ad043bd..835b537 100644 --- a/hw/char/sh_serial.c +++ b/hw/char/sh_serial.c @@ -110,7 +110,7 @@ static void sh_serial_write(void *opaque, hwaddr offs, } return; case 0x0c: /* FTDR / TDR */ - if (qemu_chr_fe_get_driver(&s->chr)) { + if (qemu_chr_fe_backend_connected(&s->chr)) { ch =3D val; /* XXX this blocks entire thread. Rewrite to use * qemu_chr_fe_write and background I/O callbacks */ diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c index ddd1b00..0fa416c 100644 --- a/hw/char/spapr_vty.c +++ b/hw/char/spapr_vty.c @@ -78,7 +78,7 @@ static void spapr_vty_realize(VIOsPAPRDevice *sdev, Error= **errp) { VIOsPAPRVTYDevice *dev =3D VIO_SPAPR_VTY_DEVICE(sdev); =20 - if (!qemu_chr_fe_get_driver(&dev->chardev)) { + if (!qemu_chr_fe_backend_connected(&dev->chardev)) { error_setg(errp, "chardev property not set"); return; } diff --git a/hw/char/terminal3270.c b/hw/char/terminal3270.c index 5adf95b..28f5991 100644 --- a/hw/char/terminal3270.c +++ b/hw/char/terminal3270.c @@ -239,7 +239,7 @@ static int write_payload_3270(EmulatedCcw3270Device *de= v, uint8_t cmd, return 0; } } - if (!qemu_chr_fe_get_driver(&t->chr)) { + if (!qemu_chr_fe_backend_connected(&t->chr)) { /* We just say we consumed all data if there's no backend. */ return count; } diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c index afb4949..4d3967c 100644 --- a/hw/char/virtio-console.c +++ b/hw/char/virtio-console.c @@ -49,7 +49,7 @@ static ssize_t flush_buf(VirtIOSerialPort *port, VirtConsole *vcon =3D VIRTIO_CONSOLE(port); ssize_t ret; =20 - if (!qemu_chr_fe_get_driver(&vcon->chr)) { + if (!qemu_chr_fe_backend_connected(&vcon->chr)) { /* If there's no backend, we can just say we consumed all data. */ return len; } @@ -168,7 +168,6 @@ static void virtconsole_realize(DeviceState *dev, Error= **errp) VirtIOSerialPort *port =3D VIRTIO_SERIAL_PORT(dev); VirtConsole *vcon =3D VIRTIO_CONSOLE(dev); VirtIOSerialPortClass *k =3D VIRTIO_SERIAL_PORT_GET_CLASS(dev); - Chardev *chr =3D qemu_chr_fe_get_driver(&vcon->chr); =20 if (port->id =3D=3D 0 && !k->is_console) { error_setg(errp, "Port number 0 on virtio-serial devices reserved " @@ -176,7 +175,7 @@ static void virtconsole_realize(DeviceState *dev, Error= **errp) return; } =20 - if (chr) { + if (qemu_chr_fe_backend_connected(&vcon->chr)) { /* * For consoles we don't block guest data transfer just * because nothing is connected - we'll just let it go diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c index c4e8c72..3643dfe 100644 --- a/hw/char/xen_console.c +++ b/hw/char/xen_console.c @@ -150,7 +150,7 @@ static void xencons_send(struct XenConsole *con) ssize_t len, size; =20 size =3D con->buffer.size - con->buffer.consumed; - if (qemu_chr_fe_get_driver(&con->chr)) { + if (qemu_chr_fe_backend_connected(&con->chr)) { len =3D qemu_chr_fe_write(&con->chr, con->buffer.data + con->buffer.consumed, size); diff --git a/hw/ipmi/ipmi_bmc_extern.c b/hw/ipmi/ipmi_bmc_extern.c index 182de58..abab3bb 100644 --- a/hw/ipmi/ipmi_bmc_extern.c +++ b/hw/ipmi/ipmi_bmc_extern.c @@ -447,7 +447,7 @@ static void ipmi_bmc_extern_realize(DeviceState *dev, E= rror **errp) { IPMIBmcExtern *ibe =3D IPMI_BMC_EXTERN(dev); =20 - if (!qemu_chr_fe_get_driver(&ibe->chr)) { + if (!qemu_chr_fe_backend_connected(&ibe->chr)) { error_setg(errp, "IPMI external bmc requires chardev attribute"); return; } diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index a857e50..7f678d0 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -1128,7 +1128,7 @@ static void ivshmem_doorbell_realize(PCIDevice *dev, = Error **errp) { IVShmemState *s =3D IVSHMEM_COMMON(dev); =20 - if (!qemu_chr_fe_get_driver(&s->server_chr)) { + if (!qemu_chr_fe_backend_connected(&s->server_chr)) { error_setg(errp, "You must specify a 'chardev'"); return; } @@ -1257,7 +1257,7 @@ static void ivshmem_realize(PCIDevice *dev, Error **e= rrp) " or ivshmem-doorbell instead"); } =20 - if (!!qemu_chr_fe_get_driver(&s->server_chr) + !!s->shmobj !=3D 1) { + if (qemu_chr_fe_backend_connected(&s->server_chr) + !!s->shmobj !=3D 1= ) { error_setg(errp, "You must specify either 'shm' or 'chardev'"); return; } diff --git a/hw/usb/ccid-card-passthru.c b/hw/usb/ccid-card-passthru.c index e9f58c9..45d96b0 100644 --- a/hw/usb/ccid-card-passthru.c +++ b/hw/usb/ccid-card-passthru.c @@ -322,7 +322,7 @@ static void passthru_apdu_from_guest( { PassthruState *card =3D PASSTHRU_CCID_CARD(base); =20 - if (!qemu_chr_fe_get_driver(&card->cs)) { + if (!qemu_chr_fe_backend_connected(&card->cs)) { printf("ccid-passthru: no chardev, discarding apdu length %d\n", l= en); return; } @@ -343,7 +343,7 @@ static int passthru_initfn(CCIDCardState *base) =20 card->vscard_in_pos =3D 0; card->vscard_in_hdr =3D 0; - if (qemu_chr_fe_get_driver(&card->cs)) { + if (qemu_chr_fe_backend_connected(&card->cs)) { DPRINTF(card, D_INFO, "initing chardev\n"); qemu_chr_fe_set_handlers(&card->cs, ccid_card_vscard_can_read, diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c index dc145a6..94b5c34 100644 --- a/hw/usb/dev-serial.c +++ b/hw/usb/dev-serial.c @@ -484,13 +484,12 @@ static void usb_serial_realize(USBDevice *dev, Error = **errp) { USBSerialState *s =3D USB_SERIAL_DEV(dev); Error *local_err =3D NULL; - Chardev *chr =3D qemu_chr_fe_get_driver(&s->cs); =20 usb_desc_create_serial(dev); usb_desc_init(dev); dev->auto_attach =3D 0; =20 - if (!chr) { + if (!qemu_chr_fe_backend_connected(&s->cs)) { error_setg(errp, "Property chardev is required"); return; } @@ -505,7 +504,7 @@ static void usb_serial_realize(USBDevice *dev, Error **= errp) usb_serial_event, NULL, s, NULL, true); usb_serial_handle_reset(dev); =20 - if (chr->be_open && !dev->attached) { + if (qemu_chr_fe_backend_open(&s->cs) && !dev->attached) { usb_device_attach(dev, &error_abort); } } diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index 115efb9..c597145 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -273,10 +273,9 @@ static gboolean usbredir_write_unblocked(GIOChannel *c= han, GIOCondition cond, static int usbredir_write(void *priv, uint8_t *data, int count) { USBRedirDevice *dev =3D priv; - Chardev *chr =3D qemu_chr_fe_get_driver(&dev->cs); int r; =20 - if (!chr->be_open) { + if (!qemu_chr_fe_backend_open(&dev->cs)) { return 0; } =20 @@ -1366,7 +1365,7 @@ static void usbredir_realize(USBDevice *udev, Error *= *errp) USBRedirDevice *dev =3D USB_REDIRECT(udev); int i; =20 - if (!qemu_chr_fe_get_driver(&dev->cs)) { + if (!qemu_chr_fe_backend_connected(&dev->cs)) { error_setg(errp, QERR_MISSING_PARAMETER, "chardev"); return; } diff --git a/include/chardev/char-fe.h b/include/chardev/char-fe.h index 588abed..71cd069 100644 --- a/include/chardev/char-fe.h +++ b/include/chardev/char-fe.h @@ -60,6 +60,13 @@ Chardev *qemu_chr_fe_get_driver(CharBackend *be); bool qemu_chr_fe_backend_connected(CharBackend *be); =20 /** + * @qemu_chr_fe_backend_open: + * + * Returns true if chardevice associated with @be is open. + */ +bool qemu_chr_fe_backend_open(CharBackend *be); + +/** * @qemu_chr_fe_set_handlers: * @b: a CharBackend * @fd_can_read: callback to get the amount of data the frontend may diff --git a/net/filter-mirror.c b/net/filter-mirror.c index 62a8265..6043549 100644 --- a/net/filter-mirror.c +++ b/net/filter-mirror.c @@ -163,7 +163,7 @@ static ssize_t filter_redirector_receive_iov(NetFilterS= tate *nf, MirrorState *s =3D FILTER_REDIRECTOR(nf); int ret; =20 - if (qemu_chr_fe_get_driver(&s->chr_out)) { + if (qemu_chr_fe_backend_connected(&s->chr_out)) { ret =3D filter_send(&s->chr_out, iov, iovcnt); if (ret) { error_report("filter redirector send failed(%s)", strerror(-re= t)); --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956463823410.2410870714542; Thu, 13 Jul 2017 07:34:23 -0700 (PDT) Received: from localhost ([::1]:60400 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfC2-0000Mc-85 for importer@patchew.org; Thu, 13 Jul 2017 10:34:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51040) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf38-0000bX-Hb for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf37-00024C-M3 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:02 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:34872) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf37-00023n-G3 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:01 -0400 Received: by mail-wm0-x242.google.com with SMTP id u23so5456027wma.2 for ; Thu, 13 Jul 2017 07:25:01 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:24:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hJN4uAvy1L39fGtp8slCINs8jE2TWT5yYjWDKKApwqw=; b=WqOmf155XAxa/AzgCP7mA1F2tug1D5trYA3kjgsgvb35yjaOGKtmx0R5Qp9eot+Rvv Ds5NkjfLqR5Pj8NRLiM03A/VDnIpr6V4OGYY9do38Z/MRnICZSRzwIpl5oWHTzk7DwxZ wTS0q5POHDKb1//9M36+t4QxReuHd9JeZuwzeXdd4px/X0/s6CbyyS5hOVWawW8tCWPN nG92KQHSbwvX6ZHL4n6eSzrjP+Qw7LcJuo6+99M8brxbrKYpXdn17Q7RlHR/ul2oitu/ CqIB+xRg/xD50fFsRhfJ8dKyjqgos9p6jcaoVYW9YU+CWs3HJ3P/Qqm5eqbPVieJiSUh 31aA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=hJN4uAvy1L39fGtp8slCINs8jE2TWT5yYjWDKKApwqw=; b=D3dExaH6y35R1AMTXCmtqo1kXEE4efgxzr1/7uSyX0s9QSVCrq8OCfjMYP6Gu/MVQ4 hpgR+c7HmVf1grwIHJpOzYYE1WDAZ/EPUdCS6DAIhN0pV0Bdhkze0G5ZdUu93B8pNiME XjafEDSB/AZqZzUQIbPEww5ZHLxxTk9T5sJWYMR2Vibv3o3IacYsqmokVsxt7c/QOtzc 734qjnjc7GSQcPC8pRDvU42nWDYrHzi+C90ONVkYUpXbNl/52Pj9JaGFc3vl7T8pmGJF e9pvbnyh1jXFTo1NidyOSeIbBe/rSVgPGoHEiB7NZSrxBYzFDfh3VWEwgSYVqzVs8sgX 5laQ== X-Gm-Message-State: AIVw112cx1ASq/gPpo/IJLi3vYHY6QdI17zR9YU6dWNKkV/vf0BakGs4 J2M7WOweLXTQF5DQ8SU= X-Received: by 10.28.35.201 with SMTP id j192mr2299605wmj.26.1499955899882; Thu, 13 Jul 2017 07:24:59 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:06 +0200 Message-Id: <1499955874-10954-14-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PULL 13/41] test-char: destroy chardev-udp after test 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov this is only not a problem if the test is last in a suite, otherwise it makes the following main_loop() calls to fail Signed-off-by: Anton Nefedov Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <1499342940-56739-7-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- tests/test-char.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test-char.c b/tests/test-char.c index 38aaa27..536536e 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -450,6 +450,7 @@ static void char_udp_test(void) =20 close(sock); g_free(tmp); + qemu_chr_fe_deinit(&be, true); } =20 #ifdef HAVE_CHARDEV_SERIAL --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956837989676.1638257596491; Thu, 13 Jul 2017 07:40:37 -0700 (PDT) Received: from localhost ([::1]:60432 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfI8-00071L-KU for importer@patchew.org; Thu, 13 Jul 2017 10:40:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51091) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3E-0000kz-Ps for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf39-00025Q-Pb for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:08 -0400 Received: from mail-wr0-x241.google.com ([2a00:1450:400c:c0c::241]:33482) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf39-000255-Jt for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:03 -0400 Received: by mail-wr0-x241.google.com with SMTP id n18so1461796wrb.0 for ; Thu, 13 Jul 2017 07:25:03 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.24.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Z11R0kgY9M85lwDByGHSr+TiFFxUIdLH5nWuehclEWM=; b=pCW1OEXO+potJvbY7HtkEhg+IgYNzvvW0D1kMRvOkcEX3SccjQ1hVkNLmyO4XmepoH r44ZUQJg961plctzebkZxW/6cFVokSq86wRbyjLJtH/GnDfmkM3poaLJkvWLYm4ht3lO A3GZn9sMy3eRFGuGwkQJ6FtPj+9lGWvUMjFEqU2l0FXPCNVy7PokkXBnjkrC472Fr4fp kWrVVfMROSFHBJy/KzXjTqV7R3Qk7zdj7iCXW1JoPAPU01NPmGkFRCQEigi0SnEW5Fm7 jNublW22OclZ31C52Bawf4MvN3V6KFUjZAdF/QYYVBSILV5wtvq4RSScLY3dgE1gFQ1N WIrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=Z11R0kgY9M85lwDByGHSr+TiFFxUIdLH5nWuehclEWM=; b=KyO0+PCd/qdCS9rFyMGvYbK7fGqxRvYOFLHhox7bR+ZUsIXHyDjO+F4Q0Y9KyRH3X8 Ruo7RRG2krIBRrGvpxYvCTFW5ylmItspvRFI8vGTQJ3gpoBTtpCGZXHYF33bjkIraNQW ds8Y23aU5eO3tpHOkTA+DmeIqiMv273rFL2X4d7/Sa0K+qx+GayVOHulOgJsTnVlrG4q ZUHCTrcSI4d7xQq2S/v0ZKJxS8uinW2vNaJPEcIntfpOFIbiA5sML1L8KrNrSqxN/+jr 4FYsUqtd7rY/wEeqIJycPfFsjpKMnKbIDG1HNF+5NOf1KGILthLvi01IHV3VVCKqq226 RobQ== X-Gm-Message-State: AIVw110Lb3yPiU4E5MdL8ueC1aTDSoqBDsxAHdpR9aykHYLH72fS5vFA XV1YvrCXhx4GZvrVsGM= X-Received: by 10.223.133.99 with SMTP id 90mr1795463wrh.44.1499955901926; Thu, 13 Jul 2017 07:25:01 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:07 +0200 Message-Id: <1499955874-10954-15-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::241 Subject: [Qemu-devel] [PULL 14/41] test-char: split char_udp_test 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov makes it possible to test the existing chardev-udp Signed-off-by: Anton Nefedov Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <1499342940-56739-8-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- tests/test-char.c | 56 +++++++++++++++++++++++++++++++++++++++------------= ---- 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/tests/test-char.c b/tests/test-char.c index 536536e..e0bde5e 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -407,16 +407,11 @@ static void char_pipe_test(void) } #endif =20 -static void char_udp_test(void) +static int make_udp_socket(int *port) { - struct sockaddr_in addr =3D { 0, }, other; - SocketIdleData d =3D { 0, }; - Chardev *chr; - CharBackend be; + struct sockaddr_in addr =3D { 0, }; socklen_t alen =3D sizeof(addr); int ret, sock =3D qemu_socket(PF_INET, SOCK_DGRAM, 0); - char buf[10]; - char *tmp; =20 g_assert_cmpint(sock, >, 0); addr.sin_family =3D AF_INET ; @@ -427,19 +422,41 @@ static void char_udp_test(void) ret =3D getsockname(sock, (struct sockaddr *)&addr, &alen); g_assert_cmpint(ret, =3D=3D, 0); =20 - tmp =3D g_strdup_printf("udp:127.0.0.1:%d", - ntohs(addr.sin_port)); - chr =3D qemu_chr_new("client", tmp); - g_assert_nonnull(chr); + *port =3D ntohs(addr.sin_port); + return sock; +} + +static void char_udp_test_internal(Chardev *reuse_chr, int sock) +{ + struct sockaddr_in other; + SocketIdleData d =3D { 0, }; + Chardev *chr; + CharBackend *be; + socklen_t alen =3D sizeof(other); + int ret; + char buf[10]; + char *tmp =3D NULL; + + if (reuse_chr) { + chr =3D reuse_chr; + be =3D chr->be; + } else { + int port; + sock =3D make_udp_socket(&port); + tmp =3D g_strdup_printf("udp:127.0.0.1:%d", port); + chr =3D qemu_chr_new("client", tmp); + g_assert_nonnull(chr); + + be =3D g_alloca(sizeof(CharBackend)); + qemu_chr_fe_init(be, chr, &error_abort); + } =20 d.chr =3D chr; - qemu_chr_fe_init(&be, chr, &error_abort); - qemu_chr_fe_set_handlers(&be, socket_can_read_hello, socket_read_hello, + qemu_chr_fe_set_handlers(be, socket_can_read_hello, socket_read_hello, NULL, NULL, &d, NULL, true); ret =3D qemu_chr_write_all(chr, (uint8_t *)"hello", 5); g_assert_cmpint(ret, =3D=3D, 5); =20 - alen =3D sizeof(addr); ret =3D recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&other, &alen); g_assert_cmpint(ret, =3D=3D, 5); @@ -448,9 +465,16 @@ static void char_udp_test(void) =20 main_loop(); =20 - close(sock); + if (!reuse_chr) { + close(sock); + qemu_chr_fe_deinit(be, true); + } g_free(tmp); - qemu_chr_fe_deinit(&be, true); +} + +static void char_udp_test(void) +{ + char_udp_test_internal(NULL, 0); } =20 #ifdef HAVE_CHARDEV_SERIAL --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956618046543.048484405767; Thu, 13 Jul 2017 07:36:58 -0700 (PDT) Received: from localhost ([::1]:60415 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfEc-0002ZC-Np for importer@patchew.org; Thu, 13 Jul 2017 10:36:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51092) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3E-0000l0-Q9 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3B-00026x-53 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:08 -0400 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:35830) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3A-00025m-RJ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:05 -0400 Received: by mail-wr0-x244.google.com with SMTP id y28so4890920wrd.2 for ; Thu, 13 Jul 2017 07:25:04 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BY45jlRFMaWCkykWhkby0mn/Jt2a+Q0CX4HfrHcGxKg=; b=aXsY/a+BqL76F030rE0xYDrlp3xmjTCpXrcJ3damvqlUoNwP7CvJs/SxuGzr12FY3B FSVIFAN3bx5S/9UGBRX50tF1o7LTkiFrFrbzwt/LqMQzLhOuz0VI6chxVPfujN17n2IM ak+7pPeH/sNBCxGdlzfuIiryD4RBQlZKxbNcBr5PNAhDKZOd99iDj2Xzu7cT4yMFuMb5 JrT6HQQkN9YAdiNZaJJyx7Ot418gJ4bc7dbz2Zrs7TzWcqOzAwus1Dvs58zJ+t3zqbsB 4A5ahovk0esDsXNX0V4KINtLCtKw3Rw6Z9mqjVZfYmB8tu9WK+lasnGQAFJwYywZLasY H6/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=BY45jlRFMaWCkykWhkby0mn/Jt2a+Q0CX4HfrHcGxKg=; b=nb2js0cPCzF+n14aNAsjbyNJLfg2EEXjt7fuJDk9KIx8L1JExkYufiAs+W4CixP+Rn uaT17Ufoqex9Ehktk25kteXDDY7CBBLBue0NIG+IxTdsEsCH79PM/4XyQJgcj2GsvV6Q qmgtFaabC/C6d22/TTH3YMmrq2H+tRU8cLu3P7HgQEyHYy7CIwrBO/xQCPCaFxOS/UqG s/HYhp70+a6c9KRoF1VoTnWL6x6v+EcotW6nfs6kJtNbcExAytTZgTkHZmsXpNln+Tf7 Sru2OmA8lbx8Gt4P3XlOqJb7QNLQjfYBP86NNLtmmdBUmHBovS82CjHcryRNZnZnZxUY m/Jg== X-Gm-Message-State: AIVw1111bEY5hOA98ct8EoaYLh31sO2XZ8/JIODxHy5EjGSLhLghpLfO BZLogBYMkYV8KDjvvEg= X-Received: by 10.223.151.67 with SMTP id r61mr1790343wrb.189.1499955903492; Thu, 13 Jul 2017 07:25:03 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:08 +0200 Message-Id: <1499955874-10954-16-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::244 Subject: [Qemu-devel] [PULL 15/41] test-char: split char_file_test 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov makes it possible to test the existing chardev-file Signed-off-by: Anton Nefedov Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <1499342940-56739-9-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- tests/test-char.c | 137 +++++++++++++++++++++++++++++++++-----------------= ---- 1 file changed, 84 insertions(+), 53 deletions(-) diff --git a/tests/test-char.c b/tests/test-char.c index e0bde5e..c654eea 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -503,82 +503,110 @@ static void char_serial_test(void) } #endif =20 -static void char_file_test(void) +#ifndef _WIN32 +static void char_file_fifo_test(void) { + Chardev *chr; + CharBackend be; char *tmp_path =3D g_dir_make_tmp("qemu-test-char.XXXXXX", NULL); + char *fifo =3D g_build_filename(tmp_path, "fifo", NULL); char *out =3D g_build_filename(tmp_path, "out", NULL); - char *contents =3D NULL; - ChardevFile file =3D { .out =3D out }; + ChardevFile file =3D { .in =3D fifo, + .has_in =3D true, + .out =3D out }; ChardevBackend backend =3D { .type =3D CHARDEV_BACKEND_KIND_FILE, .u.file.data =3D &file }; + FeHandler fe =3D { 0, }; + int fd, ret; + + if (mkfifo(fifo, 0600) < 0) { + abort(); + } + + fd =3D open(fifo, O_RDWR); + ret =3D write(fd, "fifo-in", 8); + g_assert_cmpint(ret, =3D=3D, 8); + + chr =3D qemu_chardev_new("label-file", TYPE_CHARDEV_FILE, &backend, + &error_abort); + + qemu_chr_fe_init(&be, chr, &error_abort); + qemu_chr_fe_set_handlers(&be, + fe_can_read, + fe_read, + fe_event, + NULL, + &fe, NULL, true); + + g_assert_cmpint(fe.last_event, !=3D, CHR_EVENT_BREAK); + qmp_chardev_send_break("label-foo", NULL); + g_assert_cmpint(fe.last_event, !=3D, CHR_EVENT_BREAK); + qmp_chardev_send_break("label-file", NULL); + g_assert_cmpint(fe.last_event, =3D=3D, CHR_EVENT_BREAK); + + main_loop(); + + close(fd); + + g_assert_cmpint(fe.read_count, =3D=3D, 8); + g_assert_cmpstr(fe.read_buf, =3D=3D, "fifo-in"); + + qemu_chr_fe_deinit(&be, true); + + g_unlink(fifo); + g_free(fifo); + g_unlink(out); + g_free(out); + g_rmdir(tmp_path); + g_free(tmp_path); +} +#endif + +static void char_file_test_internal(Chardev *ext_chr, const char *filepath) +{ + char *tmp_path =3D g_dir_make_tmp("qemu-test-char.XXXXXX", NULL); + char *out; Chardev *chr; + char *contents =3D NULL; + ChardevFile file =3D {}; + ChardevBackend backend =3D { .type =3D CHARDEV_BACKEND_KIND_FILE, + .u.file.data =3D &file }; gsize length; int ret; =20 - chr =3D qemu_chardev_new(NULL, TYPE_CHARDEV_FILE, &backend, - &error_abort); + if (ext_chr) { + chr =3D ext_chr; + out =3D g_strdup(filepath); + file.out =3D out; + } else { + out =3D g_build_filename(tmp_path, "out", NULL); + file.out =3D out; + chr =3D qemu_chardev_new(NULL, TYPE_CHARDEV_FILE, &backend, + &error_abort); + } ret =3D qemu_chr_write_all(chr, (uint8_t *)"hello!", 6); g_assert_cmpint(ret, =3D=3D, 6); - object_unref(OBJECT(chr)); =20 ret =3D g_file_get_contents(out, &contents, &length, NULL); g_assert(ret =3D=3D TRUE); g_assert_cmpint(length, =3D=3D, 6); g_assert(strncmp(contents, "hello!", 6) =3D=3D 0); - g_free(contents); - -#ifndef _WIN32 - { - CharBackend be; - FeHandler fe =3D { 0, }; - char *fifo =3D g_build_filename(tmp_path, "fifo", NULL); - int fd; - - if (mkfifo(fifo, 0600) < 0) { - abort(); - } - - fd =3D open(fifo, O_RDWR); - ret =3D write(fd, "fifo-in", 8); - g_assert_cmpint(ret, =3D=3D, 8); - - file.in =3D fifo; - file.has_in =3D true; - chr =3D qemu_chardev_new("label-file", TYPE_CHARDEV_FILE, &backend, - &error_abort); =20 - qemu_chr_fe_init(&be, chr, &error_abort); - qemu_chr_fe_set_handlers(&be, - fe_can_read, - fe_read, - fe_event, - NULL, - &fe, NULL, true); - - g_assert_cmpint(fe.last_event, !=3D, CHR_EVENT_BREAK); - qmp_chardev_send_break("label-foo", NULL); - g_assert_cmpint(fe.last_event, !=3D, CHR_EVENT_BREAK); - qmp_chardev_send_break("label-file", NULL); - g_assert_cmpint(fe.last_event, =3D=3D, CHR_EVENT_BREAK); - - main_loop(); - - close(fd); - - g_assert_cmpint(fe.read_count, =3D=3D, 8); - g_assert_cmpstr(fe.read_buf, =3D=3D, "fifo-in"); - qemu_chr_fe_deinit(&be, true); - g_unlink(fifo); - g_free(fifo); + if (!ext_chr) { + object_unref(OBJECT(chr)); + g_unlink(out); } -#endif - - g_unlink(out); + g_free(contents); g_rmdir(tmp_path); g_free(tmp_path); g_free(out); } =20 +static void char_file_test(void) +{ + char_file_test_internal(NULL, NULL); +} + static void char_null_test(void) { Error *err =3D NULL; @@ -656,6 +684,9 @@ int main(int argc, char **argv) g_test_add_func("/char/pipe", char_pipe_test); #endif g_test_add_func("/char/file", char_file_test); +#ifndef _WIN32 + g_test_add_func("/char/file-fifo", char_file_fifo_test); +#endif g_test_add_func("/char/socket", char_socket_test); g_test_add_func("/char/udp", char_udp_test); #ifdef HAVE_CHARDEV_SERIAL --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956621938585.0584486494141; Thu, 13 Jul 2017 07:37:01 -0700 (PDT) Received: from localhost ([::1]:60416 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfEf-0002bE-LF for importer@patchew.org; Thu, 13 Jul 2017 10:36:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51093) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3E-0000l1-Q8 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3C-0002Bc-UM for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:08 -0400 Received: from mail-wr0-x22d.google.com ([2a00:1450:400c:c0c::22d]:35772) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3C-000292-Nv for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:06 -0400 Received: by mail-wr0-x22d.google.com with SMTP id k67so53863945wrc.2 for ; Thu, 13 Jul 2017 07:25:06 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=9i8SYuwF0dkQLcnDahC07MfX4T42qfQLDl5+zIHereo=; b=VmTXFK5bs8bevESH/sncIBDWDUGJnHuJ7O1HEEE+i0vjBsja0+Txq+PjSNh/b0lb8j NRKiU1pjX/BDk6zTEnu3SVIYcfhgZJks6+LbRiegoIPtTF7NhzfPamkmf5A8CmIQgprO JlGZ6LVTkBd4hNnnbQI77XTLYzhfI6UCFEb+l6MpcL5t7qvWR3CYPwSMtZ6PGHn2K1xc 0+UZ2eCUkZCoks7d25CAjcauLv7CIr2l0qvvx3mIRgqRPCxivGTrSDiI36OR21fZ+y36 aDKpi81YCG19K46xCeS71orlBPQqc6/+TqTrp4BSllP6Rkwyh+OgZLjwWj6U1iVPtKlY wK/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=9i8SYuwF0dkQLcnDahC07MfX4T42qfQLDl5+zIHereo=; b=ul3yp/yqbnTl1i07wxHiJ9tKW6t5Jd05b4QTkNwqM5ESgQeZoJNPDNrqnUlfxAXqJK 1xYVS5V+w1vPo22xvHY7czUjv4RfTHuKdmPDEtHCpS++Ou8WOYPecZbOLkSm9LEwjY9Y GAitPil72MfbJZiNOzefuIBPqIIv7uoF2mIhIDIGeQdTxkQqrgLBR+aVIIIQfLJsI04X DFGkodM8lUGfPvTCxmmZzJisDyYxog7DpKwwLQG3o6yL/UxvGXV1RCRGLF8jPuUmfm8f GsimCPAi/wCrTc8rK7cb+22xoRjrwa3j/jo1ABZeRh2xvGGX8UN7c1JlbqfcMaAGnlmJ +8rA== X-Gm-Message-State: AIVw112eKMBm2o7U5lvvVxvI7LelVfCFOk6ZQdk8QNzbQ7Im3iOOtepI 1puHPCoj9t1xml8mgGk= X-Received: by 10.223.128.209 with SMTP id 75mr1654171wrl.99.1499955905347; Thu, 13 Jul 2017 07:25:05 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:09 +0200 Message-Id: <1499955874-10954-17-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::22d Subject: [Qemu-devel] [PULL 16/41] test-char: add hotswap test 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov Signed-off-by: Anton Nefedov Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <1499342940-56739-10-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- tests/test-char.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 71 insertions(+) diff --git a/tests/test-char.c b/tests/test-char.c index c654eea..7ac25ff 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -658,6 +658,76 @@ static void char_invalid_test(void) g_assert_null(chr); } =20 +static int chardev_change(void *opaque) +{ + return 0; +} + +static int chardev_change_denied(void *opaque) +{ + return -1; +} + +static void char_hotswap_test(void) +{ + char *chr_args; + Chardev *chr; + CharBackend be; + + gchar *tmp_path =3D g_dir_make_tmp("qemu-test-char.XXXXXX", NULL); + char *filename =3D g_build_filename(tmp_path, "file", NULL); + ChardevFile file =3D { .out =3D filename }; + ChardevBackend backend =3D { .type =3D CHARDEV_BACKEND_KIND_FILE, + .u.file.data =3D &file }; + ChardevReturn *ret; + + int port; + int sock =3D make_udp_socket(&port); + g_assert_cmpint(sock, >, 0); + + chr_args =3D g_strdup_printf("udp:127.0.0.1:%d", port); + + chr =3D qemu_chr_new("chardev", chr_args); + qemu_chr_fe_init(&be, chr, &error_abort); + + /* check that chardev operates correctly */ + char_udp_test_internal(chr, sock); + + /* set the handler that denies the hotswap */ + qemu_chr_fe_set_handlers(&be, NULL, NULL, + NULL, chardev_change_denied, NULL, NULL, true= ); + + /* now, change is denied and has to keep the old backend operating */ + ret =3D qmp_chardev_change("chardev", &backend, NULL); + g_assert(!ret); + g_assert(be.chr =3D=3D chr); + + char_udp_test_internal(chr, sock); + + /* now allow the change */ + qemu_chr_fe_set_handlers(&be, NULL, NULL, + NULL, chardev_change, NULL, NULL, true); + + /* has to succeed now */ + ret =3D qmp_chardev_change("chardev", &backend, &error_abort); + g_assert(be.chr !=3D chr); + + close(sock); + chr =3D be.chr; + + /* run the file chardev test */ + char_file_test_internal(chr, filename); + + object_unparent(OBJECT(chr)); + + qapi_free_ChardevReturn(ret); + g_unlink(filename); + g_free(filename); + g_rmdir(tmp_path); + g_free(tmp_path); + g_free(chr_args); +} + int main(int argc, char **argv) { qemu_init_main_loop(&error_abort); @@ -692,6 +762,7 @@ int main(int argc, char **argv) #ifdef HAVE_CHARDEV_SERIAL g_test_add_func("/char/serial", char_serial_test); #endif + g_test_add_func("/char/hotswap", char_hotswap_test); =20 return g_test_run(); } --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956767920813.8281390750864; Thu, 13 Jul 2017 07:39:27 -0700 (PDT) Received: from localhost ([::1]:60425 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfH3-00058n-JB for importer@patchew.org; Thu, 13 Jul 2017 10:39:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51140) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3H-0000om-0h for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3F-0002Fa-GM for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:11 -0400 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:33485) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3F-0002EL-57 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:09 -0400 Received: by mail-wr0-x244.google.com with SMTP id n18so1462060wrb.0 for ; Thu, 13 Jul 2017 07:25:09 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=9wZY28tcE0MESeAsNpbtqsG/z3RepfnW3rg1PEwryUA=; b=XSzbkagJe7q6EFcGK4nlT2cb9JqnotRryo7ir6+yfaotm2z6e7OlH+XN9S3SvaXcmo brcsR9HvWYJbBP8I7jL/kvvLrLDZ5gUeUHzCb68kmZLNRVDt1wKjB0KILKs6ao9Pg/YL v/oRUuvkhrmRqPg/15xBLnbgNIp4bVIsQ9ndC4oKpIBeibbQ5TPPG1Gqq9FHCSARJIcn vwoO2IOuOmewkrHrKRkeShEjA9r+m3zV2FIIwEEu+zttOvrOnkvYBpAHulBv350voh05 Mt5suA69gIo2dFSIiIGMrMXeUGldO8Nsl6/q4NsydKlYkPzmajNTK+c35AZZpwq9w0rR yL9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=9wZY28tcE0MESeAsNpbtqsG/z3RepfnW3rg1PEwryUA=; b=MFMGxvKZuJjJII3tMvY2kH1/IZ+t+Sj9xal65/BAXoM8Pr7rCtWoHO4YaTGg+onsAk ptOv1rOeqqiv6rulB/C+kHjldhzp3sLoELDFHj/SasbwcUE3wfOc3xnal2NIdnlx8jO3 YUZs1nBB6Sj4Kzn9zsB/l8jEyaeRp8nRqWSsJ+YmKJHo6QHf3iUgskXJRu6UHS/nQkMA IUrRMvQvAVDMiEQyaxRbNCKNcIq1W1YxQ3xui+KeG11NGXGz3nUG8dTf5EoI1muXeg2o zVx05TC3wSR72f/1TqGKBPftVDAWaa9Uqk47Orv8m/znL1MZJlGvcUQ7TsZB5LaMp3x5 t0Gw== X-Gm-Message-State: AIVw111OaQFO17iS/TDNFwFSpR8FFuuzQsxG37Ue+mIWBxb1tQJqS33Z J3K6bS4UsCq4lKyq9vM= X-Received: by 10.223.139.218 with SMTP id w26mr1736391wra.206.1499955907115; Thu, 13 Jul 2017 07:25:07 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:10 +0200 Message-Id: <1499955874-10954-18-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::244 Subject: [Qemu-devel] [PULL 17/41] hmp: add hmp analogue for qmp-chardev-change 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Acked-by: Dr. David Alan Gilbert Message-Id: <1499342940-56739-11-git-send-email-anton.nefedov@virtuozzo.com> Reviewed-by: Marc-Andr=C3=A9 Lureau Signed-off-by: Paolo Bonzini --- chardev/char.c | 2 +- hmp-commands.hx | 18 +++++++++++++++++- hmp.c | 34 ++++++++++++++++++++++++++++++++++ hmp.h | 1 + include/chardev/char.h | 10 ++++++++++ tests/test-hmp.c | 1 + 6 files changed, 64 insertions(+), 2 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index d6b9d89..c34b44a 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -567,7 +567,7 @@ static const char *chardev_alias_translate(const char *= name) return name; } =20 -static ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, Error **errp) +ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, Error **errp) { Error *local_err =3D NULL; const ChardevClass *cc; diff --git a/hmp-commands.hx b/hmp-commands.hx index 275ccdf..c4c96db 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1724,7 +1724,23 @@ ETEXI STEXI @item chardev-add args @findex chardev-add -chardev_add accepts the same parameters as the -chardev command line switc= h. +chardev-add accepts the same parameters as the -chardev command line switc= h. + +ETEXI + + { + .name =3D "chardev-change", + .args_type =3D "id:s,args:s", + .params =3D "id args", + .help =3D "change chardev", + .cmd =3D hmp_chardev_change, + }, + +STEXI +@item chardev-change args +@findex chardev-change +chardev-change accepts existing chardev @var{id} and then the same argumen= ts +as the -chardev command line switch (except for "id"). =20 ETEXI =20 diff --git a/hmp.c b/hmp.c index dee4028..1b443e1 100644 --- a/hmp.c +++ b/hmp.c @@ -2228,6 +2228,40 @@ void hmp_chardev_add(Monitor *mon, const QDict *qdic= t) hmp_handle_error(mon, &err); } =20 +void hmp_chardev_change(Monitor *mon, const QDict *qdict) +{ + const char *args =3D qdict_get_str(qdict, "args"); + const char *id; + Error *err =3D NULL; + ChardevBackend *backend =3D NULL; + ChardevReturn *ret =3D NULL; + QemuOpts *opts =3D qemu_opts_parse_noisily(qemu_find_opts("chardev"), = args, + true); + if (!opts) { + error_setg(&err, "Parsing chardev args failed"); + goto end; + } + + id =3D qdict_get_str(qdict, "id"); + if (qemu_opts_id(opts)) { + error_setg(&err, "Unexpected 'id' parameter"); + goto end; + } + + backend =3D qemu_chr_parse_opts(opts, &err); + if (!backend) { + goto end; + } + + ret =3D qmp_chardev_change(id, backend, &err); + +end: + qapi_free_ChardevReturn(ret); + qapi_free_ChardevBackend(backend); + qemu_opts_del(opts); + hmp_handle_error(mon, &err); +} + void hmp_chardev_remove(Monitor *mon, const QDict *qdict) { Error *local_err =3D NULL; diff --git a/hmp.h b/hmp.h index 214b261..1ff4552 100644 --- a/hmp.h +++ b/hmp.h @@ -102,6 +102,7 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qd= ict); void hmp_nbd_server_add(Monitor *mon, const QDict *qdict); void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict); void hmp_chardev_add(Monitor *mon, const QDict *qdict); +void hmp_chardev_change(Monitor *mon, const QDict *qdict); void hmp_chardev_remove(Monitor *mon, const QDict *qdict); void hmp_chardev_send_break(Monitor *mon, const QDict *qdict); void hmp_qemu_io(Monitor *mon, const QDict *qdict); diff --git a/include/chardev/char.h b/include/chardev/char.h index 22fd734..1604ea9 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -81,6 +81,16 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon *backend); =20 /** + * @qemu_chr_parse_opts: + * + * Parse the options to the ChardevBackend struct. + * + * Returns: a new backend or NULL on error + */ +ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, + Error **errp); + +/** * @qemu_chr_new: * * Create a new character backend from a URI. diff --git a/tests/test-hmp.c b/tests/test-hmp.c index 6dfa0c3..d77b3c8 100644 --- a/tests/test-hmp.c +++ b/tests/test-hmp.c @@ -23,6 +23,7 @@ static const char *hmp_cmds[] =3D { "boot_set ndc", "chardev-add null,id=3Dtestchardev1", "chardev-send-break testchardev2", + "chardev-change testchardev1 ringbuf", "chardev-remove testchardev1", "commit all", "cpu-add 1", --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149995734986834.82079070909765; Thu, 13 Jul 2017 07:49:09 -0700 (PDT) Received: from localhost ([::1]:60472 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfQQ-0006nu-L0 for importer@patchew.org; Thu, 13 Jul 2017 10:49:06 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51749) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4H-0001lx-UT for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4D-0004Ct-SV for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:13 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:33550) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4D-0004BZ-Kj for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:09 -0400 Received: by mail-wr0-f195.google.com with SMTP id n18so1462190wrb.0 for ; Thu, 13 Jul 2017 07:26:09 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=izWCwgSD55hnDu925DqQIx8w9GIvWflL/V3HGMK4CWs=; b=uy5bbmAjpuIzn+31qigvvbbgq/H8ctSf7nHttIFsfEHDpUGxxjRgDkGQtUD1tJJkFc fxGWY6qd8yZuFA6+QzbdZhWnyvMMmjnyIn/QI6YTkNWJdMT5NQxZ8qxeJDVnHX3+2HSX Dv+0931nHOOkCM27rkNTBgVxYj604Ye7uY6cm8woI0bQYoaJ/8XMdZQzZXMvqy/apkYi QLS5Tth6zyzkelUaJBj+C/3fDv/ANmxoxpstmpRA+GFTMOh+3KDnhzQ4aNe2fzRkQsep gMFum7bTsex/RG7Cas2dtSgG5LuIsaNV64EGEbD7w7uEJueOHDg0Y5+INKNi/uMpiu0E 0pMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=izWCwgSD55hnDu925DqQIx8w9GIvWflL/V3HGMK4CWs=; b=VImf22ecQfSUm0vdJdsqAVRNIz0D59LODd09XmlZvFvupOxED6r0GYm3Mrp/CuhfPX Yem0lTLXO4wkKNyDm4RFBrr1T4pLfIwV76FX+yHdXaBmwWUXOZ3eEdyxf4aX0O0/jgTZ rarTfQzZGNHr+T/6Rrc5K7dgJw1KEGlAuFT3/0JR0S84Xx5x/ln+5fSTJqBkLaIexYDo dLQ0M18SK/5VSo8TJFn85JORZb/pPSQ+RjNlzAiyv8XNcSAiP4Rb+JZBziGJ47hgtr5s m1zUkCigd6wEz3bhZvRD8YNqYXfPYxu99jlUxia1BB063Azr5XyxNoBsj9+ThYQJ4bjy g3yg== X-Gm-Message-State: AIVw110Ynqr4BXciVpNd7AzgqtfabALi2EuYj4XihVQ8QuU3qLYr3i5l uwzSEg/YZuGiKYIu/KA= X-Received: by 10.223.134.157 with SMTP id 29mr2153877wrx.157.1499955908363; Thu, 13 Jul 2017 07:25:08 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:11 +0200 Message-Id: <1499955874-10954-19-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.195 Subject: [Qemu-devel] [PULL 18/41] virtio-console: chardev hotswap support 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Anton Nefedov In case of a backend change, the handler functions and the watch have to be reset. Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Message-Id: <1499342940-56739-12-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- hw/char/virtio-console.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c index 4d3967c..198b2a8 100644 --- a/hw/char/virtio-console.c +++ b/hw/char/virtio-console.c @@ -163,6 +163,30 @@ static void chr_event(void *opaque, int event) } } =20 +static int chr_be_change(void *opaque) +{ + VirtConsole *vcon =3D opaque; + VirtIOSerialPort *port =3D VIRTIO_SERIAL_PORT(vcon); + VirtIOSerialPortClass *k =3D VIRTIO_SERIAL_PORT_GET_CLASS(port); + + if (k->is_console) { + qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read, + NULL, chr_be_change, vcon, NULL, true); + } else { + qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read, + chr_event, chr_be_change, vcon, NULL, fal= se); + } + + if (vcon->watch) { + g_source_remove(vcon->watch); + vcon->watch =3D qemu_chr_fe_add_watch(&vcon->chr, + G_IO_OUT | G_IO_HUP, + chr_write_unblocked, vcon); + } + + return 0; +} + static void virtconsole_realize(DeviceState *dev, Error **errp) { VirtIOSerialPort *port =3D VIRTIO_SERIAL_PORT(dev); @@ -187,11 +211,13 @@ static void virtconsole_realize(DeviceState *dev, Err= or **errp) */ if (k->is_console) { qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read, - NULL, NULL, vcon, NULL, true); + NULL, chr_be_change, + vcon, NULL, true); virtio_serial_open(port); } else { qemu_chr_fe_set_handlers(&vcon->chr, chr_can_read, chr_read, - chr_event, NULL, vcon, NULL, false); + chr_event, chr_be_change, + vcon, NULL, false); } } } --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956914023350.3331831979283; Thu, 13 Jul 2017 07:41:54 -0700 (PDT) Received: from localhost ([::1]:60439 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfJP-0008BY-In for importer@patchew.org; Thu, 13 Jul 2017 10:41:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51196) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3M-0000vN-OR for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3H-0002JJ-45 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:16 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:34753) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3G-0002Hg-TZ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:11 -0400 Received: by mail-wm0-x241.google.com with SMTP id p204so5455286wmg.1 for ; Thu, 13 Jul 2017 07:25:10 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GKr6ERzeRArY9xY23b3/ChEssE133mvsLqmXlDfOwFk=; b=H70Afx59kzfWKMdL/yfpEZz8D/MKb/ItraF8QVY1YHpSQ5LRNyHhLHzDISatHsqifN rcZZ2//BLenE8d8UDLs+ZVaRNOg4FrHFTFXTBbpn+l4sGELZiAWl5m2Th87q7bwyfEnI y7k8z15OiguuLEKnBvKZLr6COdOrkyalNwrc88x/nywht+N6SWwbwcN7Q11l5ndA2COC sqXwa/ObAX3trg8+hY0SpjFf0NfrEpnaEorMUlrNtm3UowRMEYBxtGB36/pyI5SZLKed owsjA2YQFKEHy5A2x9Q1SiXkIe+Q6HE8MyMUn5ETUyHpAfgkk/v3piJbNLx4498YmuF9 0dLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=GKr6ERzeRArY9xY23b3/ChEssE133mvsLqmXlDfOwFk=; b=qqs+cMBh6Wgbro24GYw0iNnGAqRLrhI604OwTqPJHkFZWdJXSpdgLfKhP4o5Wdb2St Z/2R3bH9MqRPBVeBqC0Aoz1KQfRRC+SYKxT7Bj+c9/L7Ju9D5mNSCHH4zWWCJCeCHsxY IyfYQ8TI1HThGhlpTed+cZnKp0XUr/es6PB1QOEdeCisNaCR3f5ava3kEIx+osrm6whf 11iu3BVjjgT4IIK1MJFUho1JdFLEUjTlO3NE/qarZMVVSqhnL45Es7wT6z3iVlBZvXbZ 6lrOdu5YM58iDiyHxRla59RaM8ESKsk/3IesMiVh+xZbxLR9oyQ7sWwrk5Y8Ixns9C9Y EWtQ== X-Gm-Message-State: AIVw110M9PN1IJ5+8iLncZH7ZYzS0p+ADUfyBWgXnlDcFG00kGe3HZOO zPSwI/R8BMqrm6ZMJuQ= X-Received: by 10.28.100.8 with SMTP id y8mr2500556wmb.83.1499955909672; Thu, 13 Jul 2017 07:25:09 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:12 +0200 Message-Id: <1499955874-10954-20-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PULL 19/41] serial: move TIOCM update to a separate function 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Anton Nefedov will be used by the following patch Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <1499342940-56739-13-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- hw/char/serial.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/hw/char/serial.c b/hw/char/serial.c index b4fb8f3..09157f9 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -312,6 +312,24 @@ static void serial_write_fcr(SerialState *s, uint8_t v= al) } } =20 +static void serial_update_tiocm(SerialState *s) +{ + int flags; + + qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_GET_TIOCM, &flags); + + flags &=3D ~(CHR_TIOCM_RTS | CHR_TIOCM_DTR); + + if (s->mcr & UART_MCR_RTS) { + flags |=3D CHR_TIOCM_RTS; + } + if (s->mcr & UART_MCR_DTR) { + flags |=3D CHR_TIOCM_DTR; + } + + qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_TIOCM, &flags); +} + static void serial_ioport_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { @@ -426,24 +444,13 @@ static void serial_ioport_write(void *opaque, hwaddr = addr, uint64_t val, break; case 4: { - int flags; int old_mcr =3D s->mcr; s->mcr =3D val & 0x1f; if (val & UART_MCR_LOOP) break; =20 if (s->poll_msl >=3D 0 && old_mcr !=3D s->mcr) { - - qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_GET_TIOCM, &fl= ags); - - flags &=3D ~(CHR_TIOCM_RTS | CHR_TIOCM_DTR); - - if (val & UART_MCR_RTS) - flags |=3D CHR_TIOCM_RTS; - if (val & UART_MCR_DTR) - flags |=3D CHR_TIOCM_DTR; - - qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_TIOCM, &fl= ags); + serial_update_tiocm(s); /* Update the modem status after a one-character-send wait= -time, since there may be a response from the device/computer at the other end of the serial= line */ timer_mod(s->modem_status_poll, qemu_clock_get_ns(QEMU_CLO= CK_VIRTUAL) + s->char_transmit_time); --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957620769798.6374002329636; Thu, 13 Jul 2017 07:53:40 -0700 (PDT) Received: from localhost ([::1]:60495 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfUn-0002Gt-6q for importer@patchew.org; Thu, 13 Jul 2017 10:53:37 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51776) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4M-0001oj-1v for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4H-0004Gx-W8 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:18 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:33948) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4H-0004Gg-PJ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:13 -0400 Received: by mail-wr0-f195.google.com with SMTP id k67so9397780wrc.1 for ; Thu, 13 Jul 2017 07:26:13 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=H1ZDQ/thoK9msWQr7kiocoalErn1fARXKwec83RCRHs=; b=Z0W+q5L0HDuV5n6l5QHc4Xo49ahP5HqSdlkIvuYrHne99lw3NoAq3QkkodiLxOa9Nv BYdp2X1r3GgmvfGzOSkh7S9zLmdnePpQTuOXgO6TSe2dggnDRVkpWoauEwrvIGLdFhJg VeQxSvsjcxMykdQ9NjiG2WCl/wvuyEt3ul6zsNtzBEqsrJIBHI5LFUz+pvSMsMI+N+XH 9F8YEd3D1Bb4vfMWlkif3ThswTwoEhDp+ipKb08ajuCfw506VoJZZYnMcF0YIPbVtgtj 4ziu0PA4DFbdgy+WnhFx4x3kEMvg20RSlHvBpA759Uxl4CDUlmY3Li0LJBgpa6DUuv1B PvQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=H1ZDQ/thoK9msWQr7kiocoalErn1fARXKwec83RCRHs=; b=WfIqPct91JnAzYHfhCC2UowjYNJEP48fetgBH5Iz0uCihKF8e6X0hozfMU25dfU93Y osw6XPP7pNme/fqzRTbOty4d+/zfdMK1pkyCNrH35YNoL9aWdrdAkj2JCZld7JHnve7Z T9n3FToBfu4/14OCuX0s6bg08EJsitg050ABioR48YVG51w+YlKItg6CCvXd4HJcA1pW EZMwEPZG364xp3TpA6nzreBI+/IgiH6gtu4Kj+YeiZ6g4Dn2em0KWqMwlR6+5ml3dWYv fPLUQxV6S8GQz9iyE/SpoGHYs/WxtoeCM+8Aee2yN6jyCnswQWv7/HjDsR8V43lfEsLy uoCw== X-Gm-Message-State: AIVw110Xwfm2uUmeQ9UAb3EhC5diR0xx3MBXOo8/wqiDkWxvQvq5H80J lMjpJNQ1CiAsN7Yzjvc= X-Received: by 10.223.133.99 with SMTP id 90mr1795893wrh.44.1499955911127; Thu, 13 Jul 2017 07:25:11 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:13 +0200 Message-Id: <1499955874-10954-21-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.195 Subject: [Qemu-devel] [PULL 20/41] serial: chardev hotswap support 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: Anton Nefedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Anton Nefedov This allows to change the port's backend runtime, e.g. change it from file to a socket making it possible to establish a debug session with WinDbg > qemu-system [..] -chardev file,id=3Dcharchannel2,path=3D/tmp/charchannel2= \ -device isa-serial,chardev=3Dcharchannel2,id=3Dchannel2 QEMU 2.9.50 monitor - type 'help' for more information (qemu) chardev-change charchannel2 \ socket,host=3D127.0.0.1,port=3D4242,server,nowait For a backend change, a number of ioctls has to be replayed to sync the current setup of a frontend to a backend tty. This is hopefully enough so we don't have to track, store and replay the whole original control byte sequence. Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Message-Id: <1499342940-56739-14-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- hw/char/serial.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/hw/char/serial.c b/hw/char/serial.c index 09157f9..9aec6c6 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -891,6 +891,34 @@ static void serial_reset(void *opaque) s->msr &=3D ~UART_MSR_ANY_DELTA; } =20 +static int serial_be_change(void *opaque) +{ + SerialState *s =3D opaque; + + qemu_chr_fe_set_handlers(&s->chr, serial_can_receive1, serial_receive1, + serial_event, serial_be_change, s, NULL, true= ); + + serial_update_parameters(s); + + qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_BREAK, + &s->last_break_enable); + + s->poll_msl =3D (s->ier & UART_IER_MSI) ? 1 : 0; + serial_update_msl(s); + + if (s->poll_msl >=3D 0 && !(s->mcr & UART_MCR_LOOP)) { + serial_update_tiocm(s); + } + + if (s->watch_tag > 0) { + g_source_remove(s->watch_tag); + s->watch_tag =3D qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HU= P, + serial_watch_cb, s); + } + + return 0; +} + void serial_realize_core(SerialState *s, Error **errp) { if (!qemu_chr_fe_backend_connected(&s->chr)) { @@ -904,7 +932,7 @@ void serial_realize_core(SerialState *s, Error **errp) qemu_register_reset(serial_reset, s); =20 qemu_chr_fe_set_handlers(&s->chr, serial_can_receive1, serial_receive1, - serial_event, NULL, s, NULL, true); + serial_event, serial_be_change, s, NULL, true= ); fifo8_create(&s->recv_fifo, UART_FIFO_LENGTH); fifo8_create(&s->xmit_fifo, UART_FIFO_LENGTH); serial_reset(s); --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956985196267.00712060845524; Thu, 13 Jul 2017 07:43:05 -0700 (PDT) Received: from localhost ([::1]:60443 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfKX-0000jY-Vq for importer@patchew.org; Thu, 13 Jul 2017 10:43:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51218) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3Q-0000zL-1I for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3L-0002Na-03 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:20 -0400 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:34406) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3K-0002ME-Pf for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:14 -0400 Received: by mail-wr0-x244.google.com with SMTP id k67so9397810wrc.1 for ; Thu, 13 Jul 2017 07:25:14 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=MmTddcXYR/V4jzJscxyGpU8U8Ct6y90UQ5zqG4yfTWc=; b=Rs88ylohZMAs9ZhnXNy/RmnD3zHw5lo6pPU3ngPiA5QhI2cBKM6hSWjH6N2LlfWgSS HdKEcjhjVIB5vkXMQJyPSfWs5W7Vpyj/mKL2CboTuU0VmnHB1ehHDSVJqxMEV2GoiPET JJSvOOlZtF+3l6xdQ9UK5ejSKuGDe71Ton3QgIcmQl0xNL1vxZWI3rCTCIz/ug+hENhl p0StaUQDxBMmzwHH7ez6G9fCTvnEVAyGmQZllzpWrm5Yra6QvjFE2fSV6UPOj3h2teQ+ 2UQFFY5sPPewuIJYdngThljHErlcRB+X8I7fFFFhuoNKR3p015m0N9wf3aJLqFKvwbT0 /aCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=MmTddcXYR/V4jzJscxyGpU8U8Ct6y90UQ5zqG4yfTWc=; b=eUCLTaHIa6qyhorCfyHiy1ZLZNugTvcd7GFQoXSm6t2Wlj65KXqoendw3QR+VEdFYw UorK2MB2mYEuDayBqMzZglXxqcrUrUUzMKwjfi/yEyZE2K8U9qeuflqB6a5u6/Rt5Lvw 9+fU+BPB3aJCIkA5f+gd7VFnndvvDATxchlS/X6QfBaDwlgwOkEcX8UGF67JXnN+Sp3n tZlD1jaeSoIVxRlUI85OT1fkeMQMPUkVR0uEtAmWwcx1bbGEvzFFaC4lObzKiV/xjGX4 X38ns4518m9PhmjZYHrAMX9YEQPxUjl9cQ0MXhW5L8WsMuJINl8/S812YXgObi/nZefa qVOg== X-Gm-Message-State: AIVw110Ok2Ov02vC6GbYt1/8oy799w+MOn8NYUDsUqT8Vo0OvyB1ucUJ OLvL8CciyFWDCnKS91M= X-Received: by 10.223.169.51 with SMTP id u48mr1725693wrc.176.1499955913651; Thu, 13 Jul 2017 07:25:13 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:14 +0200 Message-Id: <1499955874-10954-22-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::244 Subject: [Qemu-devel] [PULL 21/41] exec: use qemu_ram_ptr_length to access guest ram 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: Prasad J Pandit Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Prasad J Pandit When accessing guest's ram block during DMA operation, use 'qemu_ram_ptr_length' to get ram block pointer. It ensures that DMA operation of given length is possible; And avoids any OOB memory access situations. Reported-by: Alex Signed-off-by: Prasad J Pandit Message-Id: <20170712123840.29328-1-ppandit@redhat.com> Signed-off-by: Paolo Bonzini --- exec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exec.c b/exec.c index a083ff8..ad103ce 100644 --- a/exec.c +++ b/exec.c @@ -2929,7 +2929,7 @@ static MemTxResult address_space_write_continue(Addre= ssSpace *as, hwaddr addr, } } else { /* RAM case */ - ptr =3D qemu_map_ram_ptr(mr->ram_block, addr1); + ptr =3D qemu_ram_ptr_length(mr->ram_block, addr1, &l); memcpy(ptr, buf, l); invalidate_and_set_dirty(mr, addr1, l); } @@ -3020,7 +3020,7 @@ MemTxResult address_space_read_continue(AddressSpace = *as, hwaddr addr, } } else { /* RAM case */ - ptr =3D qemu_map_ram_ptr(mr->ram_block, addr1); + ptr =3D qemu_ram_ptr_length(mr->ram_block, addr1, &l); memcpy(buf, ptr, l); } =20 --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149995776576796.7144546878103; Thu, 13 Jul 2017 07:56:05 -0700 (PDT) Received: from localhost ([::1]:60514 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfX8-0004wC-JA for importer@patchew.org; Thu, 13 Jul 2017 10:56:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51793) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4O-0001rS-PV for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4K-0004I8-KU for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:20 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:33977) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4K-0004Hw-E6 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:16 -0400 Received: by mail-wr0-f194.google.com with SMTP id k67so9397883wrc.1 for ; Thu, 13 Jul 2017 07:26:16 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jfSa+P/II7DTd/OqRwsQqBqDKgg/ok78Fk5dJhqhhpg=; b=HQj0MGJ4T/BUt3N26F/7Z3BLoKok83ZjEFchJ/6i/E1/3+aHX1AI6wuIYckEaOQNRy u/oPCzQZGKGZ6jSDJ7EJ750K1/hC14z8fMwg7qUaOQjc0HUevSmJR6YOXLfoE2ee5Lqn pgvjjmzSi0gA6PHzdpuMQwMvRzqH8eqGMF0N7c4Sl6ZcBitLDY3RaNn6246r3zdtu7G7 fkNFkRpTizNpmJIcA3AB+HIkwkhBiRV06VCkkg2ODwAuSHku9CntxCM1lG12B8/5awds 87QMv+FWXdxJsqm+wsAZnttiYUbdbHnlPoIKD+GBvZ1b3QsZqjyev5K1+P0c6JpEBo3D AAzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=jfSa+P/II7DTd/OqRwsQqBqDKgg/ok78Fk5dJhqhhpg=; b=OVpRphMhAmqmF0LBokNNk1NwZBU1z4XYsCUGI8XYtK4PJ3JO1Za+uva8Sw7nGOjm9n dKYWrOokpVDm6KsARf3/RFG0CAXWz02LpSGjxeJfAaFK3TYenOFqDtTPNvaF/76/senw yWwQXYXEAsKtTxHXJNuKDGepqf72FP70sTgPbWeMh0VIupOqmMPYpbh7k6n41oUw9rpB qd/9oFQVVWJfvMwraYhzz4rLGbaoWq8xfBDvZNRhwpuRxu2I8BoCmmVayV1cCKTW0Zmy Ta32GBzAgScU1DmBCttSNclNw5xAhNtWEZ/mS1CSpSEuKbce/Hg6kH3ZRrvc+aRbgPQ3 R/kg== X-Gm-Message-State: AIVw111Qua/2RjFXP10oko/myBWd+Ca/E6GrWrIKrna9dRNrDjJCOWY6 HoeSEIAstkQGe0kpo9Q= X-Received: by 10.223.182.172 with SMTP id j44mr1799970wre.122.1499955914972; Thu, 13 Jul 2017 07:25:14 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:15 +0200 Message-Id: <1499955874-10954-23-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.194 Subject: [Qemu-devel] [PULL 22/41] Revert "exec.c: Fix breakpoint invalidation race" 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: Peter Maydell , Pranith Kumar , =?UTF-8?q?Alex=20Benn=C3=83=C2=A9e?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Pranith Kumar Now that we have proper locking after MTTCG patches have landed, we can revert the commit. This reverts commit a9353fe897ca2687e5b3385ed39e3db3927a90e0. CC: Peter Maydell CC: Alex Benn=C3=83=C2=A9e Signed-off-by: Pranith Kumar Message-Id: <20170712215143.19594-1-bobby.prani@gmail.com> Signed-off-by: Paolo Bonzini --- exec.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/exec.c b/exec.c index ad103ce..2e8bc43 100644 --- a/exec.c +++ b/exec.c @@ -775,15 +775,28 @@ void cpu_exec_realizefn(CPUState *cpu, Error **errp) #endif } =20 +#if defined(CONFIG_USER_ONLY) static void breakpoint_invalidate(CPUState *cpu, target_ulong pc) { - /* Flush the whole TB as this will not have race conditions - * even if we don't have proper locking yet. - * Ideally we would just invalidate the TBs for the - * specified PC. - */ - tb_flush(cpu); + mmap_lock(); + tb_lock(); + tb_invalidate_phys_page_range(pc, pc + 1, 0); + tb_unlock(); + mmap_unlock(); } +#else +static void breakpoint_invalidate(CPUState *cpu, target_ulong pc) +{ + MemTxAttrs attrs; + hwaddr phys =3D cpu_get_phys_page_attrs_debug(cpu, pc, &attrs); + int asidx =3D cpu_asidx_from_attrs(cpu, attrs); + if (phys !=3D -1) { + /* Locks grabbed by tb_invalidate_phys_addr */ + tb_invalidate_phys_addr(cpu->cpu_ases[asidx].as, + phys | (pc & ~TARGET_PAGE_MASK)); + } +} +#endif =20 #if defined(CONFIG_USER_ONLY) void cpu_watchpoint_remove_all(CPUState *cpu, int mask) --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957133023284.98224759242214; Thu, 13 Jul 2017 07:45:33 -0700 (PDT) Received: from localhost ([::1]:60452 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfMs-0003V2-Ez for importer@patchew.org; Thu, 13 Jul 2017 10:45:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51219) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3Q-0000zN-1o for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3N-0002Qw-Oq for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:20 -0400 Received: from mail-wr0-x241.google.com ([2a00:1450:400c:c0c::241]:34411) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3N-0002Ph-FX for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:17 -0400 Received: by mail-wr0-x241.google.com with SMTP id k67so9397970wrc.1 for ; Thu, 13 Jul 2017 07:25:17 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=LaaZUNSMN5aVOgv3pLPWfJAyvKJjnYIz4A+O2zF8qbo=; b=TJIMGgPc74ZLxinHUm25nOZ6+OMUgMBZOED9gWSFXLBXttOml7184De6XdpbAq5jM7 tINa9k1B2DWbkPL/fNChL9poEFKIUtqB7K86ALqiRInaRSZMFxGyFF+6YWHoQsLuP9x1 3S2AujorQod7SlNkOkAU/H5D6/T/iHyGiM/YsZe6tFbNeyE16j8kGzn44SMxBVWDua6A QdbMPK992TeRNJSQCR8/6WGC4ZclsMRQkKgKOV2oHefxueSbo0KcAbmYqkToxNO+LP41 74zn4AJk43wwRnkdIBKF95rui6wAUiWzXw/J4VANcuyPxs4/v5LlhqTZ/8gHKL4lsSAV 88JA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=LaaZUNSMN5aVOgv3pLPWfJAyvKJjnYIz4A+O2zF8qbo=; b=rKalUepOkMixQgvubXM8DaysWw0VEQoTsexKR9XsYCBAYChFnfkY82PS+nk4fet9pu f7l8Q6OblHTRbu9kWC1PCuepCR+iGifIsCL6Jra4hCq9bEFhKLn36mnamIkpFOSe4KQB HTEIDQ/FfozQpW3/Q2blKTmpoXzyvbXLJb9VfDlCw+ZOIzdw39SrIjrNjHiKiU0DSxta hNPvkiGJV8i7pq0JpR1aXFMMg+uLc1pTr0Q5+lWO9JNt78c5pqFJd374mwXz+XMF01tl BvtJrFrgvj87vzKu1qoIs/PqTB3nK1zrNMgX1mShdXMbaDCd5tLTvMYY0jz35lgHviEA 9slQ== X-Gm-Message-State: AIVw113JpfDqiJsSHkQr20ZCfWK9EQjN+sAKmX+SR6/9nixaJ/1IWoUs YpBl/oRSwaoehJoF3aY= X-Received: by 10.223.164.218 with SMTP id h26mr1998079wrb.100.1499955916272; Thu, 13 Jul 2017 07:25:16 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:16 +0200 Message-Id: <1499955874-10954-24-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::241 Subject: [Qemu-devel] [PULL 23/41] mttcg/i386: Patch instruction using async_safe_* framework 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: Peter Maydell , Pranith Kumar Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Pranith Kumar In mttcg, calling pause_all_vcpus() during execution from the generated TBs causes a deadlock if some vCPU is waiting for exclusive execution in start_exclusive(). Fix this by using the aync_safe_* framework instead of pausing vcpus for patching instructions. CC: Paolo Bonzini CC: Peter Maydell Reviewed-by: Richard Henderson Reviewed-by: Alex Benn=C3=83=C2=A9e Signed-off-by: Pranith Kumar Message-Id: <20170712215143.19594-2-bobby.prani@gmail.com> [Get rid completely of the TCG-specific code. - Paolo] Signed-off-by: Paolo Bonzini --- hw/i386/kvmvapic.c | 85 +++++++++++++++++++++++++-------------------------= ---- 1 file changed, 39 insertions(+), 46 deletions(-) diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c index 0d9ef77..fc962c5 100644 --- a/hw/i386/kvmvapic.c +++ b/hw/i386/kvmvapic.c @@ -383,8 +383,7 @@ static void patch_byte(X86CPU *cpu, target_ulong addr, = uint8_t byte) cpu_memory_rw_debug(CPU(cpu), addr, &byte, 1, 1); } =20 -static void patch_call(VAPICROMState *s, X86CPU *cpu, target_ulong ip, - uint32_t target) +static void patch_call(X86CPU *cpu, target_ulong ip, uint32_t target) { uint32_t offset; =20 @@ -393,77 +392,71 @@ static void patch_call(VAPICROMState *s, X86CPU *cpu,= target_ulong ip, cpu_memory_rw_debug(CPU(cpu), ip + 1, (void *)&offset, sizeof(offset),= 1); } =20 -static void patch_instruction(VAPICROMState *s, X86CPU *cpu, target_ulong = ip) +typedef struct PatchInfo { + VAPICHandlers *handler; + target_ulong ip; +} PatchInfo; + +static void do_patch_instruction(CPUState *cs, run_on_cpu_data data) { - CPUState *cs =3D CPU(cpu); - CPUX86State *env =3D &cpu->env; - VAPICHandlers *handlers; + X86CPU *x86_cpu =3D X86_CPU(cs); + PatchInfo *info =3D (PatchInfo *) data.host_ptr; + VAPICHandlers *handlers =3D info->handler; + target_ulong ip =3D info->ip; uint8_t opcode[2]; uint32_t imm32 =3D 0; - target_ulong current_pc =3D 0; - target_ulong current_cs_base =3D 0; - uint32_t current_flags =3D 0; - - if (smp_cpus =3D=3D 1) { - handlers =3D &s->rom_state.up; - } else { - handlers =3D &s->rom_state.mp; - } - - if (tcg_enabled()) { - cpu_restore_state(cs, cs->mem_io_pc); - cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, - ¤t_flags); - /* Account this instruction, because we will exit the tb. - This is the first instruction in the block. Therefore - there is no need in restoring CPU state. */ - if (use_icount) { - --cs->icount_decr.u16.low; - } - } - - pause_all_vcpus(); =20 cpu_memory_rw_debug(cs, ip, opcode, sizeof(opcode), 0); =20 switch (opcode[0]) { case 0x89: /* mov r32 to r/m32 */ - patch_byte(cpu, ip, 0x50 + modrm_reg(opcode[1])); /* push reg */ - patch_call(s, cpu, ip + 1, handlers->set_tpr); + patch_byte(x86_cpu, ip, 0x50 + modrm_reg(opcode[1])); /* push reg= */ + patch_call(x86_cpu, ip + 1, handlers->set_tpr); break; case 0x8b: /* mov r/m32 to r32 */ - patch_byte(cpu, ip, 0x90); - patch_call(s, cpu, ip + 1, handlers->get_tpr[modrm_reg(opcode[1])]= ); + patch_byte(x86_cpu, ip, 0x90); + patch_call(x86_cpu, ip + 1, handlers->get_tpr[modrm_reg(opcode[1])= ]); break; case 0xa1: /* mov abs to eax */ - patch_call(s, cpu, ip, handlers->get_tpr[0]); + patch_call(x86_cpu, ip, handlers->get_tpr[0]); break; case 0xa3: /* mov eax to abs */ - patch_call(s, cpu, ip, handlers->set_tpr_eax); + patch_call(x86_cpu, ip, handlers->set_tpr_eax); break; case 0xc7: /* mov imm32, r/m32 (c7/0) */ - patch_byte(cpu, ip, 0x68); /* push imm32 */ + patch_byte(x86_cpu, ip, 0x68); /* push imm32 */ cpu_memory_rw_debug(cs, ip + 6, (void *)&imm32, sizeof(imm32), 0); cpu_memory_rw_debug(cs, ip + 1, (void *)&imm32, sizeof(imm32), 1); - patch_call(s, cpu, ip + 5, handlers->set_tpr); + patch_call(x86_cpu, ip + 5, handlers->set_tpr); break; case 0xff: /* push r/m32 */ - patch_byte(cpu, ip, 0x50); /* push eax */ - patch_call(s, cpu, ip + 1, handlers->get_tpr_stack); + patch_byte(x86_cpu, ip, 0x50); /* push eax */ + patch_call(x86_cpu, ip + 1, handlers->get_tpr_stack); break; default: abort(); } =20 - resume_all_vcpus(); + g_free(info); +} + +static void patch_instruction(VAPICROMState *s, X86CPU *cpu, target_ulong = ip) +{ + CPUState *cs =3D CPU(cpu); + VAPICHandlers *handlers; + PatchInfo *info; =20 - if (tcg_enabled()) { - /* Both tb_lock and iothread_mutex will be reset when - * longjmps back into the cpu_exec loop. */ - tb_lock(); - tb_gen_code(cs, current_pc, current_cs_base, current_flags, 1); - cpu_loop_exit_noexc(cs); + if (smp_cpus =3D=3D 1) { + handlers =3D &s->rom_state.up; + } else { + handlers =3D &s->rom_state.mp; } + + info =3D g_new(PatchInfo, 1); + info->handler =3D handlers; + info->ip =3D ip; + + async_safe_run_on_cpu(cs, do_patch_instruction, RUN_ON_CPU_HOST_PTR(in= fo)); } =20 void vapic_report_tpr_access(DeviceState *dev, CPUState *cs, target_ulong = ip, --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956948657132.30759997001144; Thu, 13 Jul 2017 07:42:28 -0700 (PDT) Received: from localhost ([::1]:60441 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfJz-0000EB-9L for importer@patchew.org; Thu, 13 Jul 2017 10:42:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51805) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4R-0001tF-30 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4N-0004KI-2L for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:23 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:35673) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4M-0004K0-PM for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:18 -0400 Received: by mail-wr0-f195.google.com with SMTP id y28so4891663wrd.2 for ; Thu, 13 Jul 2017 07:26:18 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jEI1iyUNgqBDnBVxv41UCPc9Zo2uQoG7t4lksrVr4I0=; b=bX0fRqQHRbf4rkMZ7lNiT5rGYozByqSzVt1X9aNzf6JCIRiHjZqYRMO2qhBWdHYsj2 IF6U7ICHowD7RoWEMcOGtTJszFwYz64++AosAMtwYkL157zxXuSZK7yow0ujIvavPNYM mwy4kJkGAA5r2oITPl7eY0ET357Ldtpq0WkvG7aa+Ql0YAlJWv8oyEXAh4DIJEzpJMsX P77fW/F4PHGWm0y3E/4qq9i7YFyp0IMXfRjpo6aKdjarHEO1ewrAD8ZYdF1CRUAJLQQu 2anfT6OqRXzH4ta+HA3l0Uh5l7jfwRqolUxf/Na/HQGowMStmhpoixJhAbZxFXmFWpy5 SYUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=jEI1iyUNgqBDnBVxv41UCPc9Zo2uQoG7t4lksrVr4I0=; b=VzmwVvN4ssrF8tZd59zsranpxmcLCNNSa4YhI9foth7KEZjyHeLLLJtBYqnG0lMZJl yQH0C3N8IRp+egFZ3eK0uAhoByvPkDzyZBN2onIgN2K/XpffBSOC0lqJiwOHOpe9N1Xu xiIWIykTtmJuPqRmeJxpf91WFniQkGIZ+msWqltSo/PQ+EqdwnMkdBM+dIx3p81D5Gtq z3sccQQlWJpVBmFl+gzaN2fHuWjCBl78skN/Lfg0FemQPO6wABljE2SWykoTsPoxTVIY zdcHlasrbRDCNIlBjGLbSlZeSBAuhRgWMg5eR/vGBnRApxXXwRjBUEOAvudi+nfe3/HA P2lw== X-Gm-Message-State: AIVw113wB4TGkaK2V8J4EERLGzmoBpXMKTIkKKPR9f8JeibZyiULgcfJ bTec5+8AzRqbeya+/CI= X-Received: by 10.223.177.129 with SMTP id q1mr1873673wra.82.1499955917508; Thu, 13 Jul 2017 07:25:17 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:17 +0200 Message-Id: <1499955874-10954-25-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.195 Subject: [Qemu-devel] [PULL 24/41] gdbstub: modernise DEBUG_GDB 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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Alex Benn=C3=A9e Convert the a gdb_debug helper which compiles away to nothing when not used but still ensures the format strings are checked. There is some minor code motion for the incorrect checksum message to report it before we attempt to send the reply. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Greg Kurz Message-Id: <20170712105216.747-2-alex.bennee@linaro.org> Signed-off-by: Paolo Bonzini --- gdbstub.c | 77 +++++++++++++++++++++++++++--------------------------------= ---- 1 file changed, 33 insertions(+), 44 deletions(-) diff --git a/gdbstub.c b/gdbstub.c index e561244..3965980 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -272,7 +272,20 @@ static int gdb_signal_to_target (int sig) return -1; } =20 -//#define DEBUG_GDB +/* #define DEBUG_GDB */ + +#ifdef DEBUG_GDB +# define DEBUG_GDB_GATE 1 +#else +# define DEBUG_GDB_GATE 0 +#endif + +#define gdb_debug(fmt, ...) do { \ + if (DEBUG_GDB_GATE) { \ + fprintf(stderr, "%s: " fmt, __func__, ## __VA_ARGS__); \ + } \ +} while (0) + =20 typedef struct GDBRegisterState { int base_reg; @@ -548,9 +561,7 @@ static int put_packet_binary(GDBState *s, const char *b= uf, int len) /* return -1 if error, 0 if OK */ static int put_packet(GDBState *s, const char *buf) { -#ifdef DEBUG_GDB - printf("reply=3D'%s'\n", buf); -#endif + gdb_debug("reply=3D'%s'\n", buf); =20 return put_packet_binary(s, buf, strlen(buf)); } @@ -956,9 +967,9 @@ static int gdb_handle_packet(GDBState *s, const char *l= ine_buf) uint8_t *registers; target_ulong addr, len; =20 -#ifdef DEBUG_GDB - printf("command=3D'%s'\n", line_buf); -#endif + + gdb_debug("command=3D'%s'\n", line_buf); + p =3D line_buf; ch =3D *p++; switch(ch) { @@ -1519,17 +1530,14 @@ static void gdb_read_byte(GDBState *s, int ch) /* Waiting for a response to the last packet. If we see the start of a new command then abandon the previous response. */ if (ch =3D=3D '-') { -#ifdef DEBUG_GDB - printf("Got NACK, retransmitting\n"); -#endif + gdb_debug("Got NACK, retransmitting\n"); put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len); + } else if (ch =3D=3D '+') { + gdb_debug("Got ACK\n"); + } else { + gdb_debug("Got '%c' when expecting ACK/NACK\n", ch); } -#ifdef DEBUG_GDB - else if (ch =3D=3D '+') - printf("Got ACK\n"); - else - printf("Got '%c' when expecting ACK/NACK\n", ch); -#endif + if (ch =3D=3D '+' || ch =3D=3D '$') s->last_packet_len =3D 0; if (ch !=3D '$') @@ -1550,9 +1558,7 @@ static void gdb_read_byte(GDBState *s, int ch) s->line_sum =3D 0; s->state =3D RS_GETLINE; } else { -#ifdef DEBUG_GDB - printf("gdbstub received garbage between packets: 0x%x\n",= ch); -#endif + gdb_debug("received garbage between packets: 0x%x\n", ch); } break; case RS_GETLINE: @@ -1568,9 +1574,7 @@ static void gdb_read_byte(GDBState *s, int ch) /* end of command, start of checksum*/ s->state =3D RS_CHKSUM1; } else if (s->line_buf_index >=3D sizeof(s->line_buf) - 1) { -#ifdef DEBUG_GDB - printf("gdbstub command buffer overrun, dropping command\n= "); -#endif + gdb_debug("command buffer overrun, dropping command\n"); s->state =3D RS_IDLE; } else { /* unescaped command character */ @@ -1584,9 +1588,7 @@ static void gdb_read_byte(GDBState *s, int ch) s->state =3D RS_CHKSUM1; } else if (s->line_buf_index >=3D sizeof(s->line_buf) - 1) { /* command buffer overrun */ -#ifdef DEBUG_GDB - printf("gdbstub command buffer overrun, dropping command\n= "); -#endif + gdb_debug("command buffer overrun, dropping command\n"); s->state =3D RS_IDLE; } else { /* parse escaped character and leave escape state */ @@ -1598,25 +1600,18 @@ static void gdb_read_byte(GDBState *s, int ch) case RS_GETLINE_RLE: if (ch < ' ') { /* invalid RLE count encoding */ -#ifdef DEBUG_GDB - printf("gdbstub got invalid RLE count: 0x%x\n", ch); -#endif + gdb_debug("got invalid RLE count: 0x%x\n", ch); s->state =3D RS_GETLINE; } else { /* decode repeat length */ int repeat =3D (unsigned char)ch - ' ' + 3; if (s->line_buf_index + repeat >=3D sizeof(s->line_buf) - = 1) { /* that many repeats would overrun the command buffer = */ -#ifdef DEBUG_GDB - printf("gdbstub command buffer overrun," - " dropping command\n"); -#endif + gdb_debug("command buffer overrun, dropping command\n"= ); s->state =3D RS_IDLE; } else if (s->line_buf_index < 1) { /* got a repeat but we have nothing to repeat */ -#ifdef DEBUG_GDB - printf("gdbstub got invalid RLE sequence\n"); -#endif + gdb_debug("got invalid RLE sequence\n"); s->state =3D RS_GETLINE; } else { /* repeat the last character */ @@ -1631,9 +1626,7 @@ static void gdb_read_byte(GDBState *s, int ch) case RS_CHKSUM1: /* get high hex digit of checksum */ if (!isxdigit(ch)) { -#ifdef DEBUG_GDB - printf("gdbstub got invalid command checksum digit\n"); -#endif + gdb_debug("got invalid command checksum digit\n"); s->state =3D RS_GETLINE; break; } @@ -1644,21 +1637,17 @@ static void gdb_read_byte(GDBState *s, int ch) case RS_CHKSUM2: /* get low hex digit of checksum */ if (!isxdigit(ch)) { -#ifdef DEBUG_GDB - printf("gdbstub got invalid command checksum digit\n"); -#endif + gdb_debug("got invalid command checksum digit\n"); s->state =3D RS_GETLINE; break; } s->line_csum |=3D fromhex(ch); =20 if (s->line_csum !=3D (s->line_sum & 0xff)) { + gdb_debug("got command packet with incorrect checksum\n"); /* send NAK reply */ reply =3D '-'; put_buffer(s, &reply, 1); -#ifdef DEBUG_GDB - printf("gdbstub got command packet with incorrect checksum= \n"); -#endif s->state =3D RS_IDLE; } else { /* send ACK reply */ --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956771698949.7628632165536; Thu, 13 Jul 2017 07:39:31 -0700 (PDT) Received: from localhost ([::1]:60426 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfH5-0005A9-DB for importer@patchew.org; Thu, 13 Jul 2017 10:39:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51240) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3R-00010d-AG for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3Q-0002UV-5e for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:21 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:34903) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3P-0002U3-SQ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:20 -0400 Received: by mail-wm0-x242.google.com with SMTP id u23so5457775wma.2 for ; Thu, 13 Jul 2017 07:25:19 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5VxhkUvYqbtgQVQ0wVb8zX32heZrIbbUlUoJMa3P708=; b=soCwjZLR3tm8lr5i94xapgJIFCtNt5yKWkvnThrTndSpJ9i+EPaltN6/IOD+eId88I U/PTA7UaXhIvG+WqvrSvb6jQ8SIdGmvFfeTv7Bubm2G9xoezEzbV5299kguEAOwH2Fcu R4lr4Z2s6d0OZCYHZgaqFyELU8wow4z8gjmAHyycgO3xz9Kk7414sKDfVfiHDlISdRXu KPoHFrq3LFjb7EI8if3hIs5Xxxa4IxXLbFdbzSWKE+HNGuAhqfRdSWFwfcDB1BgJ6HMv ArwQYhFUZ9Z4Ruj+z2uF/18goAgziR/pMhxlieRuP+tF9nLDIAhd9nldKRtUREPF/+lb wSuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=5VxhkUvYqbtgQVQ0wVb8zX32heZrIbbUlUoJMa3P708=; b=Jy99okRe7rpdn9gLa/V0dEjT10v6Mt23m+bW926GpzgfBjuwjMr99p99R5KYPJL/vx rWZcNH4jZGLuZ9Hlogl9iLIeSDCeOxwa95EjxJ5a2kaOJNMlWi+z0ARZjXCfQG49sMwC jP3ZEFj5VakTNsOMMuEKyvu2CiTYQrE467XbtXM3Ila2hp8sRYB2gq4qjXVDgJPSqTfB ibEc2srMcCKQOlwhFIiPz8AGO+VamkZ/H4FrMLg3vWAhHVq+yViLR3U0w5hl3uhwOSja m7J92503IS8f4Xa8TmRRwgwvbaugkVOK7lq+6nQJ+lIT0yqVNQrlCjAGm4cfDtYL+s6o MtLw== X-Gm-Message-State: AIVw110uZvwo/WRlKtST5qEyMsX3CmtZXxltqC8Tr19Y+9smsVbrfo+c E1I2hU3haJRM4JNAl50= X-Received: by 10.28.133.76 with SMTP id h73mr2279815wmd.92.1499955918630; Thu, 13 Jul 2017 07:25:18 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:18 +0200 Message-Id: <1499955874-10954-26-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PULL 25/41] gdbstub: rename cpu_index -> cpu_gdb_index 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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Alex Benn=C3=A9e This is to make it clear the index is purely a gdbstub function and should not be confused with the value of cpu->cpu_index. At the same time we move the function from the header to gdbstub itself which will help with later changes. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Greg Kurz Reviewed-by: Claudio Imbrenda Reviewed-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20170712105216.747-3-alex.bennee@linaro.org> Signed-off-by: Paolo Bonzini --- gdbstub.c | 26 ++++++++++++++++++++------ include/exec/gdbstub.h | 9 --------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/gdbstub.c b/gdbstub.c index 3965980..b1efe0b 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -56,6 +56,20 @@ static inline int target_memory_rw_debug(CPUState *cpu, = target_ulong addr, return cpu_memory_rw_debug(cpu, addr, buf, len, is_write); } =20 +/* Return the GDB index for a given vCPU state. + * + * For user mode this is simply the thread id. In system mode GDB + * numbers CPUs from 1 as 0 is reserved as an "any cpu" index. + */ +static inline int cpu_gdb_index(CPUState *cpu) +{ +#if defined(CONFIG_USER_ONLY) + return cpu->host_tid; +#else + return cpu->cpu_index + 1; +#endif +} + enum { GDB_SIGNAL_0 =3D 0, GDB_SIGNAL_INT =3D 2, @@ -838,7 +852,7 @@ static CPUState *find_cpu(uint32_t thread_id) CPUState *cpu; =20 CPU_FOREACH(cpu) { - if (cpu_index(cpu) =3D=3D thread_id) { + if (cpu_gdb_index(cpu) =3D=3D thread_id) { return cpu; } } @@ -926,7 +940,7 @@ static int gdb_handle_vcont(GDBState *s, const char *p) idx =3D tmp; /* 0 means any thread, so we pick the first valid CPU */ if (!idx) { - idx =3D cpu_index(first_cpu); + idx =3D cpu_gdb_index(first_cpu); } =20 /* @@ -976,7 +990,7 @@ static int gdb_handle_packet(GDBState *s, const char *l= ine_buf) case '?': /* TODO: Make this return the correct value for user-mode. */ snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP, - cpu_index(s->c_cpu)); + cpu_gdb_index(s->c_cpu)); put_packet(s, buf); /* Remove all the breakpoints when this query is issued, * because gdb is doing and initial connect and the state @@ -1244,7 +1258,7 @@ static int gdb_handle_packet(GDBState *s, const char = *line_buf) } else if (strcmp(p,"sThreadInfo") =3D=3D 0) { report_cpuinfo: if (s->query_cpu) { - snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu)); + snprintf(buf, sizeof(buf), "m%x", cpu_gdb_index(s->query_c= pu)); put_packet(s, buf); s->query_cpu =3D CPU_NEXT(s->query_cpu); } else @@ -1401,7 +1415,7 @@ static void gdb_vm_state_change(void *opaque, int run= ning, RunState state) } snprintf(buf, sizeof(buf), "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";", - GDB_SIGNAL_TRAP, cpu_index(cpu), type, + GDB_SIGNAL_TRAP, cpu_gdb_index(cpu), type, (target_ulong)cpu->watchpoint_hit->vaddr); cpu->watchpoint_hit =3D NULL; goto send_packet; @@ -1435,7 +1449,7 @@ static void gdb_vm_state_change(void *opaque, int run= ning, RunState state) break; } gdb_set_stop_cpu(cpu); - snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu)); + snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_gdb_index(cpu= )); =20 send_packet: put_packet(s, buf); diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h index f9708bb..9aa7756 100644 --- a/include/exec/gdbstub.h +++ b/include/exec/gdbstub.h @@ -58,15 +58,6 @@ void gdb_register_coprocessor(CPUState *cpu, gdb_reg_cb get_reg, gdb_reg_cb set_reg, int num_regs, const char *xml, int g_pos); =20 -static inline int cpu_index(CPUState *cpu) -{ -#if defined(CONFIG_USER_ONLY) - return cpu->host_tid; -#else - return cpu->cpu_index + 1; -#endif -} - /* The GDB remote protocol transfers values in target byte order. This me= ans * we can use the raw memory access routines to access the value buffer. * Conveniently, these also handle the case where the buffer is mis-aligne= d. --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957908694468.54908108360473; Thu, 13 Jul 2017 07:58:28 -0700 (PDT) Received: from localhost ([::1]:60522 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfZR-0006yT-BT for importer@patchew.org; Thu, 13 Jul 2017 10:58:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51813) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4T-0001vJ-A9 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4P-0004L4-Dt for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:25 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:34671) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4P-0004Kj-63 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:21 -0400 Received: by mail-wm0-f68.google.com with SMTP id p204so5456275wmg.1 for ; Thu, 13 Jul 2017 07:26:21 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=arbrowqiXXY1I5jnvtk2LC+cC4qs2l9RMhIv9E6O3oQ=; b=aUuNUqh3DyKjJ9Qf6dPQeIJ7qBmlbMtAdMei5uIhE/tccL96VSv28a3yqTRCyJnKTT e4p6YxPfBcRCdXmohLuNvBMrh/D95U67DNtdZo+eOEL0HbGHZpTD3OmdTXxeM5Jbiw5j ZgA/YzLdldMSwCjAJ3S8wcifsGNmkXsCXiIIJb7GeLxdhEu5AC22QCVLM1PYJxE83/jH TQhjD40CSBJ6VIiEvaBYzdD+5nOh0Vmfaf1MwTP6ggqay5d3Hx49tLVOtTcwXD66GUTL Usf5QI50hcdz2luDQ8QLj4fEgLu/wwdZW9HBzWT9CpPXas4vFpxqQMqcvzibEGtTy9C/ 3s1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=arbrowqiXXY1I5jnvtk2LC+cC4qs2l9RMhIv9E6O3oQ=; b=LM+Hh1CP7Pi5AQjTBOWRuRl2F6VOETH7nGuszFjNwA6/fqz0qQgO6bzPpb3VJErqk2 SUrmipxsgSjsYfcd80DbwlJV1/XD6q/IdceR3VLtoYoQaWu8srLUCFf0ZsJrN0BN0Stl 3B+kiM+5inFRvoQZ4ndIQ1K/f/tL8oND2jRaO7Km1x/QXasIfT9N+1vlGgKsN3y9LiLV /pqX77vvJSKEyqfrwZ7hsGop9rslWXJZilOsCm4DSmia4Qomq2AnM2HzAzseXk4fXncy CEeIAzlSU9KnZJRPO8UB08asYdX8fUAmGB331vfz8fA+rsmI0h/VQ9/JnXy3ycs/ov5a LfiQ== X-Gm-Message-State: AIVw111YkbyFGqD2uiD0OjBTR2qhwf0leJQHsSw5eIxn+UkmzidaYOMI XYGiQG41ne/0SUJnXe4= X-Received: by 10.28.22.6 with SMTP id 6mr2458059wmw.124.1499955919716; Thu, 13 Jul 2017 07:25:19 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:19 +0200 Message-Id: <1499955874-10954-27-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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 26/41] qom/cpu: remove host_tid field 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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Alex Benn=C3=A9e This was only used by the gdbstub and even then was only being set for subsequent threads. Rather the continue duplicating the number just make the gdbstub get the information from TaskState structure. Now the tid is correctly reported for all threads the bug I was seeing with "vCont;C04:0;c" packets is fixed as the correct tid is reported to gdb. I moved cpu_gdb_index into the gdbstub to facilitate easy access to the TaskState which is used elsewhere in gdbstub. To prevent BSD failing to build I've included ts_tid into its TaskStruct but not populated it - which was the same state as the old cpu->host_tid. I'll leave it up to the BSD maintainers to actually populate this properly if they want a working gdbstub with user-threads. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Greg Kurz Reviewed-by: Claudio Imbrenda Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Laurent Vivier Message-Id: <20170712105216.747-4-alex.bennee@linaro.org> Signed-off-by: Paolo Bonzini --- bsd-user/qemu.h | 2 ++ gdbstub.c | 3 ++- include/qom/cpu.h | 2 -- linux-user/syscall.c | 1 - 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h index b550cee..19b2b8f 100644 --- a/bsd-user/qemu.h +++ b/bsd-user/qemu.h @@ -85,6 +85,8 @@ struct emulated_sigtable { /* NOTE: we force a big alignment so that the stack stored after is aligned too */ typedef struct TaskState { + pid_t ts_tid; /* tid (or pid) of this task */ + struct TaskState *next; int used; /* non zero if used */ struct image_info *info; diff --git a/gdbstub.c b/gdbstub.c index b1efe0b..378fdd8 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -64,7 +64,8 @@ static inline int target_memory_rw_debug(CPUState *cpu, t= arget_ulong addr, static inline int cpu_gdb_index(CPUState *cpu) { #if defined(CONFIG_USER_ONLY) - return cpu->host_tid; + TaskState *ts =3D (TaskState *) cpu->opaque; + return ts->ts_tid; #else return cpu->cpu_index + 1; #endif diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 7bfd50c..d3c783b 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -265,7 +265,6 @@ struct qemu_work_item; * @cpu_index: CPU index (informative). * @nr_cores: Number of cores within this CPU package. * @nr_threads: Number of threads within this CPU. - * @host_tid: Host thread ID. * @running: #true if CPU is currently running (lockless). * @has_waiter: #true if a CPU is currently waiting for the cpu_exec_end; * valid under cpu_list_lock. @@ -319,7 +318,6 @@ struct CPUState { HANDLE hThread; #endif int thread_id; - uint32_t host_tid; bool running, has_waiter; struct QemuCond *halt_cond; bool thread_kicked; diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 925ae11..003943b 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6219,7 +6219,6 @@ static void *clone_func(void *arg) thread_cpu =3D cpu; ts =3D (TaskState *)cpu->opaque; info->tid =3D gettid(); - cpu->host_tid =3D info->tid; task_settid(ts); if (info->child_tidptr) put_user_u32(info->tid, info->child_tidptr); --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957059164189.89572991553507; Thu, 13 Jul 2017 07:44:19 -0700 (PDT) Received: from localhost ([::1]:60447 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfLm-0001qg-0M for importer@patchew.org; Thu, 13 Jul 2017 10:44:18 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51271) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3T-00012w-Ka for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3S-0002WC-JQ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:23 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:34904) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3S-0002Va-Ca for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:22 -0400 Received: by mail-wm0-x244.google.com with SMTP id u23so5457948wma.2 for ; Thu, 13 Jul 2017 07:25:22 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CMlD808lugJXGmG58AGJr1dxcm+wOz+OewK7oNnwtzA=; b=N32PRGwGYSBM2V3ezdy6x3rYu32xwpzbKYXxhaMwPm43vUEPXdc9JsygulGvjgDGtB BNGN2zabP0CKXV6BHw/myyoYdZedBUvybOtIchhEx74u8CK6ecAzvulVOzQjKRb9ApZC b8+HHXdAp60dLKKOah0pnqDSR+nnGWh4j84lz5928Tr4MYQiecg3OrOsHyOhOvUeLRlC QlPa7ltGxt6QDstVIcq8fWorck9mdPPx0yL3VL/pGXbE1XE3bpBTWfHaQHHum2Py5BR/ j+Fv+LwDZLJMGR67pFRAJ9CLbt5Vp/wnm3gisAmzfcBhufnPDzOlupiUTZ+P2ahgR5uF VPuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=CMlD808lugJXGmG58AGJr1dxcm+wOz+OewK7oNnwtzA=; b=SG20miiwdtTNLjKXT8bcPAV1VnU9fxFfQrcdsEooXoR2VyfFaKv0sY+7PVn9R/qbMr zgp1D6tcegdAH3qZSJhGbsD+EPMXEri3n0pAgUL7q2euT7JAvq6D8zlo2XIW+rjx7FiW wy8aP9GkhR+OFcndrlwAd64uKXPcL62Rm6sqN8c3RAkPMQIZ94jBWUbCXZuYj/4TJMck P8w0KYIWZ+n8mh/qdUy6t9BHosMNV+CiHkDAKDvDNH/604EEWXj0OLNXGbSVpNrcniOs Lpgx6pH75IBQykLP8FoqRXplCM+fXqZrlO+NJWP85/AB1KK19YIicsG4V6Lkm2BOC22F Gwwg== X-Gm-Message-State: AIVw111sv3RQvmKRTkCJZwOOV+UKp+Gp8fZD72aas/fJKm8pI3NyV3Lk MmRgJsiEZJsAygbmUxQ= X-Received: by 10.28.34.130 with SMTP id i124mr2294752wmi.116.1499955921125; Thu, 13 Jul 2017 07:25:21 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:20 +0200 Message-Id: <1499955874-10954-28-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PULL 27/41] gdbstub: don't fail on vCont; C04:0; c packets 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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Alex Benn=C3=A9e The thread-id of 0 means any CPU but we then ignore the fact we find the first_cpu in this case who can have an index of 0. Instead of bailing out just test if we have managed to match up thread-id to a CPU. Otherwise you get: gdb_handle_packet: command=3D'vCont;C04:0;c' put_packet: reply=3D'E22' The actual reason for gdb sending vCont;C04:0;c was fixed in a previous commit where we ensure the first_cpu's tid is correctly reported to gdb however we should still behave correctly next time it does send 0. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Greg Kurz Reviewed-by: Claudio Imbrenda Reviewed-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20170712105216.747-5-alex.bennee@linaro.org> Signed-off-by: Paolo Bonzini --- gdbstub.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/gdbstub.c b/gdbstub.c index 378fdd8..f936ddd 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -938,23 +938,16 @@ static int gdb_handle_vcont(GDBState *s, const char *= p) if (res) { goto out; } - idx =3D tmp; + /* 0 means any thread, so we pick the first valid CPU */ - if (!idx) { - idx =3D cpu_gdb_index(first_cpu); - } + cpu =3D tmp ? find_cpu(tmp) : first_cpu; =20 - /* - * If we are in user mode, the thread specified is actually a - * thread id, and not an index. We need to find the actual - * CPU first, and only then we can use its index. - */ - cpu =3D find_cpu(idx); /* invalid CPU/thread specified */ - if (!idx || !cpu) { + if (!cpu) { res =3D -EINVAL; goto out; } + /* only use if no previous match occourred */ if (newstates[cpu->cpu_index] =3D=3D 1) { newstates[cpu->cpu_index] =3D cur_action; --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499956915989353.18083271942635; Thu, 13 Jul 2017 07:41:55 -0700 (PDT) Received: from localhost ([::1]:60440 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfJR-0008Cz-ON for importer@patchew.org; Thu, 13 Jul 2017 10:41:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51291) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3U-00013z-SV for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3T-0002Wf-Kg for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:24 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:33698) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3T-0002WI-DT for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:23 -0400 Received: by mail-wm0-x241.google.com with SMTP id j85so5439879wmj.0 for ; Thu, 13 Jul 2017 07:25:23 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=iwk1i5N7oQRNqV9Q85f4q0c9wTDe7y4pvvA+65PKQQs=; b=BYPNcbtKUxWQtp8M1CVd9UTHB9c4lNSvlyUIB2a/UGqIbQGP1A/W1yvRe02GxThjHA /u7kzvWQ53J+jwoC/n6BEcFCHsJfWcEgQ41/SOciBEMIdyEwI0rthMGvSpZ49cW+ncf9 Xd1gRotbSZo530495UP0NWBD7yuVvIH2jE4kRODHh7ZQT7sBUoX+Kvoe17pOpeP1QyO5 j+84RCYCO9DwZzAFP3UIm86UMxlZslcGSlYhhqKs7XShmx0j0hVTU4+vvwhdkmoQ1UKc ppNvkRCZHlYkJvvTaRkpHpIymuLPcWnFkTJza43H5IICtwePHRHLJFBpSJpavnTLo9+g hN+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=iwk1i5N7oQRNqV9Q85f4q0c9wTDe7y4pvvA+65PKQQs=; b=J8z45HJ4IG7XU5rkNYkZGwRu1InZHSEj+cOnDCevCyU+jWTBsafeHYtGJIwdO3WzNX YeBkZhM97uPDWkCAvOCfUriwynAD/KLqninqwhMvB0ZMDHKdQ39mmoBNhBTlTSBmNkTb lJl0FxCVjRilmcF2F4RqpXYR7w7jwaQpq3nEGu3xBVEcsHxBHE1MURfhsSRF1s4/TyFl 9rxRzanRKu+1fIPAEZrnVhe8ySzQsoLO+3S94ZuBKKSM37QJOhmvkxTKxYBNJsyZKp4K DCX4cpKebupi9cquhz5lI9xtDBekqXClvuI7fYmB2gp69kRwEKRsr4mUEyzcgYvNkxgB Huwg== X-Gm-Message-State: AIVw111UCS5Zvqxmm4LYU2YE2ICVjVZbUHmdyRBIs69GuIwTgmb81pRg Pwh3b+7O9VSxS6X8RHc= X-Received: by 10.28.133.209 with SMTP id h200mr2257373wmd.20.1499955922229; Thu, 13 Jul 2017 07:25:22 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:21 +0200 Message-Id: <1499955874-10954-29-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PULL 28/41] chardev: fix parallel device can't be reconnect 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: Peng Hao Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Peng Hao Parallel device don't register be->chr_can_read function, but remote disconnect event is handled in chr_read.So connected parallel device can not detect remote disconnect event. The chardevs with chr_can_read=3DNU= LL has the same problem. Signed-off-by: Peng Hao Reviewed-by: Wang Yechao Reviewed-by: Jiang Biao Message-Id: <1499874119-67558-1-git-send-email-peng.hao2@zte.com.cn> Signed-off-by: Paolo Bonzini --- hw/char/parallel.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/char/parallel.c b/hw/char/parallel.c index 055789f..f79dc76 100644 --- a/hw/char/parallel.c +++ b/hw/char/parallel.c @@ -503,6 +503,10 @@ static const VMStateDescription vmstate_parallel_isa = =3D { } }; =20 +static int parallel_can_receive(void *opaque) +{ + return 1; +} =20 static void parallel_isa_realizefn(DeviceState *dev, Error **errp) { @@ -535,6 +539,8 @@ static void parallel_isa_realizefn(DeviceState *dev, Er= ror **errp) isa_init_irq(isadev, &s->irq, isa->isairq); qemu_register_reset(parallel_reset, s); =20 + qemu_chr_fe_set_handlers(&s->chr, parallel_can_receive, NULL, + NULL, NULL, s, NULL, true); if (qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_PP_READ_STATUS, &dummy) =3D= =3D 0) { s->hw_driver =3D 1; s->status =3D dummy; --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499958179565816.456218097889; Thu, 13 Jul 2017 08:02:59 -0700 (PDT) Received: from localhost ([::1]:60551 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfdm-0002of-Qy for importer@patchew.org; Thu, 13 Jul 2017 11:02:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51839) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4Y-0001zn-Ae for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4U-0004NV-9S for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:30 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:33796) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4T-0004N2-QU for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:26 -0400 Received: by mail-wm0-f65.google.com with SMTP id p204so5456627wmg.1 for ; Thu, 13 Jul 2017 07:26:25 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=m0CT3OWATYqxIwrvcmX0R19+ryjj5jre5cigYZNLSB0=; b=Hxbjh8rEOO0bXaZlMB1N8X7ykeg4iVLZnqz7ljHWQxl1HSgbFPV5fTTyuJMuqfaYvu Pm65RA4Ywzlosr5VXIEtKYYGnKdLILeGxIJCJBrxgQ83RGK9QvDtgEdoKctlxMAndxso UJbNELHpU637H5++dYNknmHH9t+VBal8f0qzqjtXfdI/pE76hWWVOGQ8ImR2TBC3gzjs 4uorFL1LjGPvQ6omgk+dqIVkwBs/Pyo1HCbmz389rwbBlIkTd95YLDD/DlQZxVRwmovK +EsQyJ06UCu1hkjwvZsQ+UlCk5fl5HmW4lNcdMUcD/NPxhi31/iqXOG/BMPzALGbgv9W nFSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=m0CT3OWATYqxIwrvcmX0R19+ryjj5jre5cigYZNLSB0=; b=lDx5EMJd7FjQG19BOcq9ZNShz1hzzPdKZ31JEExLzAaKHlT113GF4UaxfYQUNsNrH2 rRWRys5CbRfs9f+ufZm8NQyBFLam1tBkcDWh/QUGzLJlkq62rbkWiX3ixUtl2tms//w1 uA0Wu1p6cl6Z7Mm4ZeeplsSWlUEOzQjEga+UqhD0v2uT7EkD6AilpjJHxO+UDBei5KTa jjTOxQNX8hUpeeTwholsx/Wx8vJvq+mA4RmU2X843Fdh5z+H0f6dkUAYPSg4vOEs9lBu S8YSc689hDTNnHTibsT1iSLu8YpEpU8Hr69zmKM/tSCxQR/VDqSdeV5ddufLzd8u+Wn8 EG+A== X-Gm-Message-State: AIVw111XZLm4Kx6l+eCT5IHMntd3MMtYbBUEU+XVLwNXk395PMoRwCtV IUb6p+Fg/yOGM77Vh+Y= X-Received: by 10.28.195.67 with SMTP id t64mr2443788wmf.41.1499955924057; Thu, 13 Jul 2017 07:25:24 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:22 +0200 Message-Id: <1499955874-10954-30-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 74.125.82.65 Subject: [Qemu-devel] [PULL 29/41] memory/iommu: QOM'fy IOMMU MemoryRegion 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: Alexey Kardashevskiy Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Alexey Kardashevskiy This defines new QOM object - IOMMUMemoryRegion - with MemoryRegion as a parent. This moves IOMMU-related fields from MR to IOMMU MR. However to avoid dymanic QOM casting in fast path (address_space_translate, etc), this adds an @is_iommu boolean flag to MR and provides new helper to do simple cast to IOMMU MR - memory_region_get_iommu. The flag is set in the instance init callback. This defines memory_region_is_iommu as memory_region_get_iommu()!=3DNULL. This switches MemoryRegion to IOMMUMemoryRegion in most places except the ones where MemoryRegion may be an alias. Signed-off-by: Alexey Kardashevskiy Reviewed-by: David Gibson Message-Id: <20170711035620.4232-2-aik@ozlabs.ru> Acked-by: Cornelia Huck Signed-off-by: Paolo Bonzini --- exec.c | 12 ++--- hw/alpha/typhoon.c | 8 ++-- hw/dma/rc4030.c | 8 ++-- hw/i386/amd_iommu.c | 9 ++-- hw/i386/intel_iommu.c | 17 +++---- hw/mips/mips_jazz.c | 2 +- hw/pci-host/apb.c | 6 +-- hw/ppc/spapr_iommu.c | 16 ++++--- hw/s390x/s390-pci-bus.c | 6 +-- hw/s390x/s390-pci-bus.h | 2 +- hw/s390x/s390-pci-inst.c | 8 ++-- hw/vfio/common.c | 12 +++-- hw/vfio/spapr.c | 3 +- include/exec/memory.h | 55 ++++++++++++++-------- include/hw/i386/intel_iommu.h | 2 +- include/hw/mips/mips.h | 2 +- include/hw/ppc/spapr.h | 3 +- include/hw/vfio/vfio-common.h | 2 +- include/qemu/typedefs.h | 1 + memory.c | 105 ++++++++++++++++++++++++++++----------= ---- 20 files changed, 170 insertions(+), 109 deletions(-) diff --git a/exec.c b/exec.c index 2e8bc43..2aa8be5 100644 --- a/exec.c +++ b/exec.c @@ -480,19 +480,19 @@ static MemoryRegionSection address_space_do_translate= (AddressSpace *as, { IOMMUTLBEntry iotlb; MemoryRegionSection *section; - MemoryRegion *mr; + IOMMUMemoryRegion *iommu_mr; =20 for (;;) { AddressSpaceDispatch *d =3D atomic_rcu_read(&as->dispatch); section =3D address_space_translate_internal(d, addr, &addr, plen,= is_mmio); - mr =3D section->mr; =20 - if (!mr->iommu_ops) { + iommu_mr =3D memory_region_get_iommu(section->mr); + if (!iommu_mr) { break; } =20 - iotlb =3D mr->iommu_ops->translate(mr, addr, is_write ? - IOMMU_WO : IOMMU_RO); + iotlb =3D iommu_mr->iommu_ops->translate(iommu_mr, addr, is_write ? + IOMMU_WO : IOMMU_RO); addr =3D ((iotlb.translated_addr & ~iotlb.addr_mask) | (addr & iotlb.addr_mask)); *plen =3D MIN(*plen, (addr | iotlb.addr_mask) - addr + 1); @@ -588,7 +588,7 @@ address_space_translate_for_iotlb(CPUState *cpu, int as= idx, hwaddr addr, =20 section =3D address_space_translate_internal(d, addr, xlat, plen, fals= e); =20 - assert(!section->mr->iommu_ops); + assert(!memory_region_is_iommu(section->mr)); return section; } #endif diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c index c1cf780..dd47b45 100644 --- a/hw/alpha/typhoon.c +++ b/hw/alpha/typhoon.c @@ -41,7 +41,7 @@ typedef struct TyphoonPchip { MemoryRegion reg_conf; =20 AddressSpace iommu_as; - MemoryRegion iommu; + IOMMUMemoryRegion iommu; =20 uint64_t ctl; TyphoonWindow win[4]; @@ -663,7 +663,8 @@ static bool window_translate(TyphoonWindow *win, hwaddr= addr, /* Handle PCI-to-system address translation. */ /* TODO: A translation failure here ought to set PCI error codes on the Pchip and generate a machine check interrupt. */ -static IOMMUTLBEntry typhoon_translate_iommu(MemoryRegion *iommu, hwaddr a= ddr, +static IOMMUTLBEntry typhoon_translate_iommu(IOMMUMemoryRegion *iommu, + hwaddr addr, IOMMUAccessFlags flag) { TyphoonPchip *pchip =3D container_of(iommu, TyphoonPchip, iommu); @@ -893,7 +894,8 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_= bus, /* Host memory as seen from the PCI side, via the IOMMU. */ memory_region_init_iommu(&s->pchip.iommu, OBJECT(s), &typhoon_iommu_op= s, "iommu-typhoon", UINT64_MAX); - address_space_init(&s->pchip.iommu_as, &s->pchip.iommu, "pchip0-pci"); + address_space_init(&s->pchip.iommu_as, MEMORY_REGION(&s->pchip.iommu), + "pchip0-pci"); pci_setup_iommu(b, typhoon_pci_dma_iommu, s); =20 /* Pchip0 PCI special/interrupt acknowledge, 0x801.F800.0000, 64MB. */ diff --git a/hw/dma/rc4030.c b/hw/dma/rc4030.c index edf9432..32c0676 100644 --- a/hw/dma/rc4030.c +++ b/hw/dma/rc4030.c @@ -90,7 +90,7 @@ typedef struct rc4030State qemu_irq jazz_bus_irq; =20 /* whole DMA memory region, root of DMA address space */ - MemoryRegion dma_mr; + IOMMUMemoryRegion dma_mr; AddressSpace dma_as; =20 MemoryRegion iomem_chipset; @@ -488,7 +488,7 @@ static const MemoryRegionOps jazzio_ops =3D { .endianness =3D DEVICE_NATIVE_ENDIAN, }; =20 -static IOMMUTLBEntry rc4030_dma_translate(MemoryRegion *iommu, hwaddr addr, +static IOMMUTLBEntry rc4030_dma_translate(IOMMUMemoryRegion *iommu, hwaddr= addr, IOMMUAccessFlags flag) { rc4030State *s =3D container_of(iommu, rc4030State, dma_mr); @@ -679,7 +679,7 @@ static void rc4030_realize(DeviceState *dev, Error **er= rp) =20 memory_region_init_iommu(&s->dma_mr, o, &rc4030_dma_ops, "rc4030.dma", UINT32_MAX); - address_space_init(&s->dma_as, &s->dma_mr, "rc4030-dma"); + address_space_init(&s->dma_as, MEMORY_REGION(&s->dma_mr), "rc4030-dma"= ); } =20 static void rc4030_unrealize(DeviceState *dev, Error **errp) @@ -717,7 +717,7 @@ static void rc4030_register_types(void) =20 type_init(rc4030_register_types) =20 -DeviceState *rc4030_init(rc4030_dma **dmas, MemoryRegion **dma_mr) +DeviceState *rc4030_init(rc4030_dma **dmas, IOMMUMemoryRegion **dma_mr) { DeviceState *dev; =20 diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c index d93ffc2..7a67c57 100644 --- a/hw/i386/amd_iommu.c +++ b/hw/i386/amd_iommu.c @@ -52,7 +52,7 @@ struct AMDVIAddressSpace { uint8_t bus_num; /* bus number */ uint8_t devfn; /* device function */ AMDVIState *iommu_state; /* AMDVI - one per machine */ - MemoryRegion iommu; /* Device's address translation region */ + IOMMUMemoryRegion iommu; /* Device's address translation region */ MemoryRegion iommu_ir; /* Device's interrupt remapping region */ AddressSpace as; /* device's corresponding address space */ }; @@ -987,7 +987,7 @@ static inline bool amdvi_is_interrupt_addr(hwaddr addr) return addr >=3D AMDVI_INT_ADDR_FIRST && addr <=3D AMDVI_INT_ADDR_LAST; } =20 -static IOMMUTLBEntry amdvi_translate(MemoryRegion *iommu, hwaddr addr, +static IOMMUTLBEntry amdvi_translate(IOMMUMemoryRegion *iommu, hwaddr addr, IOMMUAccessFlags flag) { AMDVIAddressSpace *as =3D container_of(iommu, AMDVIAddressSpace, iommu= ); @@ -1046,7 +1046,8 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus= , void *opaque, int devfn) =20 memory_region_init_iommu(&iommu_as[devfn]->iommu, OBJECT(s), &s->iommu_ops, "amd-iommu", UINT64_MAX); - address_space_init(&iommu_as[devfn]->as, &iommu_as[devfn]->iommu, + address_space_init(&iommu_as[devfn]->as, + MEMORY_REGION(&iommu_as[devfn]->iommu), "amd-iommu"); } return &iommu_as[devfn]->as; @@ -1067,7 +1068,7 @@ static const MemoryRegionOps mmio_mem_ops =3D { } }; =20 -static void amdvi_iommu_notify_flag_changed(MemoryRegion *iommu, +static void amdvi_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu, IOMMUNotifierFlag old, IOMMUNotifierFlag new) { diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index 88dc042..11dba0e 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -972,9 +972,9 @@ static bool vtd_switch_address_space(VTDAddressSpace *a= s) /* Turn off first then on the other */ if (use_iommu) { memory_region_set_enabled(&as->sys_alias, false); - memory_region_set_enabled(&as->iommu, true); + memory_region_set_enabled(MEMORY_REGION(&as->iommu), true); } else { - memory_region_set_enabled(&as->iommu, false); + memory_region_set_enabled(MEMORY_REGION(&as->iommu), false); memory_region_set_enabled(&as->sys_alias, true); } =20 @@ -1366,7 +1366,7 @@ static void vtd_iotlb_domain_invalidate(IntelIOMMUSta= te *s, uint16_t domain_id) static int vtd_page_invalidate_notify_hook(IOMMUTLBEntry *entry, void *private) { - memory_region_notify_iommu((MemoryRegion *)private, *entry); + memory_region_notify_iommu((IOMMUMemoryRegion *)private, *entry); return 0; } =20 @@ -2264,7 +2264,7 @@ static void vtd_mem_write(void *opaque, hwaddr addr, } } =20 -static IOMMUTLBEntry vtd_iommu_translate(MemoryRegion *iommu, hwaddr addr, +static IOMMUTLBEntry vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr = addr, IOMMUAccessFlags flag) { VTDAddressSpace *vtd_as =3D container_of(iommu, VTDAddressSpace, iommu= ); @@ -2303,7 +2303,7 @@ static IOMMUTLBEntry vtd_iommu_translate(MemoryRegion= *iommu, hwaddr addr, return iotlb; } =20 -static void vtd_iommu_notify_flag_changed(MemoryRegion *iommu, +static void vtd_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu, IOMMUNotifierFlag old, IOMMUNotifierFlag new) { @@ -2736,7 +2736,8 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, = PCIBus *bus, int devfn) memory_region_add_subregion_overlap(&vtd_dev_as->root, 0, &vtd_dev_as->sys_alias, 1); memory_region_add_subregion_overlap(&vtd_dev_as->root, 0, - &vtd_dev_as->iommu, 1); + MEMORY_REGION(&vtd_dev_as->iom= mu), + 1); vtd_switch_address_space(vtd_dev_as); } return vtd_dev_as; @@ -2816,9 +2817,9 @@ static int vtd_replay_hook(IOMMUTLBEntry *entry, void= *private) return 0; } =20 -static void vtd_iommu_replay(MemoryRegion *mr, IOMMUNotifier *n) +static void vtd_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n) { - VTDAddressSpace *vtd_as =3D container_of(mr, VTDAddressSpace, iommu); + VTDAddressSpace *vtd_as =3D container_of(iommu_mr, VTDAddressSpace, io= mmu); IntelIOMMUState *s =3D vtd_as->iommu_state; uint8_t bus_n =3D pci_bus_num(vtd_as->bus); VTDContextEntry ce; diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c index 1cef581..1f69322 100644 --- a/hw/mips/mips_jazz.c +++ b/hw/mips/mips_jazz.c @@ -130,7 +130,7 @@ static void mips_jazz_init(MachineState *machine, CPUMIPSState *env; qemu_irq *i8259; rc4030_dma *dmas; - MemoryRegion *rc4030_dma_mr; + IOMMUMemoryRegion *rc4030_dma_mr; MemoryRegion *isa_mem =3D g_new(MemoryRegion, 1); MemoryRegion *isa_io =3D g_new(MemoryRegion, 1); MemoryRegion *rtc =3D g_new(MemoryRegion, 1); diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c index 326f5ef..76a56ae 100644 --- a/hw/pci-host/apb.c +++ b/hw/pci-host/apb.c @@ -123,7 +123,7 @@ do { printf("IOMMU: " fmt , ## __VA_ARGS__); } while (0) =20 typedef struct IOMMUState { AddressSpace iommu_as; - MemoryRegion iommu; + IOMMUMemoryRegion iommu; =20 uint64_t regs[IOMMU_NREGS]; } IOMMUState; @@ -208,7 +208,7 @@ static AddressSpace *pbm_pci_dma_iommu(PCIBus *bus, voi= d *opaque, int devfn) } =20 /* Called from RCU critical section */ -static IOMMUTLBEntry pbm_translate_iommu(MemoryRegion *iommu, hwaddr addr, +static IOMMUTLBEntry pbm_translate_iommu(IOMMUMemoryRegion *iommu, hwaddr = addr, IOMMUAccessFlags flag) { IOMMUState *is =3D container_of(iommu, IOMMUState, iommu); @@ -699,7 +699,7 @@ PCIBus *pci_apb_init(hwaddr special_base, =20 memory_region_init_iommu(&is->iommu, OBJECT(dev), &pbm_iommu_ops, "iommu-apb", UINT64_MAX); - address_space_init(&is->iommu_as, &is->iommu, "pbm-as"); + address_space_init(&is->iommu_as, MEMORY_REGION(&is->iommu), "pbm-as"); pci_setup_iommu(phb->bus, pbm_pci_dma_iommu, is); =20 /* APB secondary busses */ diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c index 8656a54..6b6ced5 100644 --- a/hw/ppc/spapr_iommu.c +++ b/hw/ppc/spapr_iommu.c @@ -110,7 +110,8 @@ static void spapr_tce_free_table(uint64_t *table, int f= d, uint32_t nb_table) } =20 /* Called from RCU critical section */ -static IOMMUTLBEntry spapr_tce_translate_iommu(MemoryRegion *iommu, hwaddr= addr, +static IOMMUTLBEntry spapr_tce_translate_iommu(IOMMUMemoryRegion *iommu, + hwaddr addr, IOMMUAccessFlags flag) { sPAPRTCETable *tcet =3D container_of(iommu, sPAPRTCETable, iommu); @@ -150,14 +151,14 @@ static void spapr_tce_table_pre_save(void *opaque) tcet->bus_offset, tcet->page_shift); } =20 -static uint64_t spapr_tce_get_min_page_size(MemoryRegion *iommu) +static uint64_t spapr_tce_get_min_page_size(IOMMUMemoryRegion *iommu) { sPAPRTCETable *tcet =3D container_of(iommu, sPAPRTCETable, iommu); =20 return 1ULL << tcet->page_shift; } =20 -static void spapr_tce_notify_flag_changed(MemoryRegion *iommu, +static void spapr_tce_notify_flag_changed(IOMMUMemoryRegion *iommu, IOMMUNotifierFlag old, IOMMUNotifierFlag new) { @@ -348,9 +349,10 @@ void spapr_tce_table_enable(sPAPRTCETable *tcet, &tcet->fd, tcet->need_vfio); =20 - memory_region_set_size(&tcet->iommu, + memory_region_set_size(MEMORY_REGION(&tcet->iommu), (uint64_t)tcet->nb_table << tcet->page_shift); - memory_region_add_subregion(&tcet->root, tcet->bus_offset, &tcet->iomm= u); + memory_region_add_subregion(&tcet->root, tcet->bus_offset, + MEMORY_REGION(&tcet->iommu)); } =20 void spapr_tce_table_disable(sPAPRTCETable *tcet) @@ -359,8 +361,8 @@ void spapr_tce_table_disable(sPAPRTCETable *tcet) return; } =20 - memory_region_del_subregion(&tcet->root, &tcet->iommu); - memory_region_set_size(&tcet->iommu, 0); + memory_region_del_subregion(&tcet->root, MEMORY_REGION(&tcet->iommu)); + memory_region_set_size(MEMORY_REGION(&tcet->iommu), 0); =20 spapr_tce_free_table(tcet->table, tcet->fd, tcet->nb_table); tcet->fd =3D -1; diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index 5651483..e4fc82c 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -356,7 +356,7 @@ out: return pte; } =20 -static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *mr, hwaddr addr, +static IOMMUTLBEntry s390_translate_iommu(IOMMUMemoryRegion *mr, hwaddr ad= dr, IOMMUAccessFlags flag) { uint64_t pte; @@ -525,14 +525,14 @@ void s390_pci_iommu_enable(S390PCIIOMMU *iommu) memory_region_init_iommu(&iommu->iommu_mr, OBJECT(&iommu->mr), &s390_iommu_ops, name, iommu->pal + 1); iommu->enabled =3D true; - memory_region_add_subregion(&iommu->mr, 0, &iommu->iommu_mr); + memory_region_add_subregion(&iommu->mr, 0, MEMORY_REGION(&iommu->iommu= _mr)); g_free(name); } =20 void s390_pci_iommu_disable(S390PCIIOMMU *iommu) { iommu->enabled =3D false; - memory_region_del_subregion(&iommu->mr, &iommu->iommu_mr); + memory_region_del_subregion(&iommu->mr, MEMORY_REGION(&iommu->iommu_mr= )); object_unparent(OBJECT(&iommu->iommu_mr)); } =20 diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h index cf142a3..6a599ed 100644 --- a/hw/s390x/s390-pci-bus.h +++ b/hw/s390x/s390-pci-bus.h @@ -266,7 +266,7 @@ typedef struct S390PCIIOMMU { S390PCIBusDevice *pbdev; AddressSpace as; MemoryRegion mr; - MemoryRegion iommu_mr; + IOMMUMemoryRegion iommu_mr; bool enabled; uint64_t g_iota; uint64_t pba; diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c index 8bc7c98..a53c29c 100644 --- a/hw/s390x/s390-pci-inst.c +++ b/hw/s390x/s390-pci-inst.c @@ -563,7 +563,7 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_= t r2) S390PCIIOMMU *iommu; hwaddr start, end; IOMMUTLBEntry entry; - MemoryRegion *mr; + IOMMUMemoryRegion *iommu_mr; =20 cpu_synchronize_state(CPU(cpu)); =20 @@ -622,9 +622,9 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_= t r2) goto out; } =20 - mr =3D &iommu->iommu_mr; + iommu_mr =3D &iommu->iommu_mr; while (start < end) { - entry =3D mr->iommu_ops->translate(mr, start, IOMMU_NONE); + entry =3D iommu_mr->iommu_ops->translate(iommu_mr, start, IOMMU_NO= NE); =20 if (!entry.translated_addr) { pbdev->state =3D ZPCI_FS_ERROR; @@ -635,7 +635,7 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_= t r2) goto out; } =20 - memory_region_notify_iommu(mr, entry); + memory_region_notify_iommu(iommu_mr, entry); start +=3D entry.addr_mask + 1; } =20 diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 29923e4..c1bb6d4 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -479,6 +479,7 @@ static void vfio_listener_region_add(MemoryListener *li= stener, =20 if (memory_region_is_iommu(section->mr)) { VFIOGuestIOMMU *giommu; + IOMMUMemoryRegion *iommu_mr =3D IOMMU_MEMORY_REGION(section->mr); =20 trace_vfio_listener_region_add_iommu(iova, end); /* @@ -488,7 +489,7 @@ static void vfio_listener_region_add(MemoryListener *li= stener, * device emulation the VFIO iommu handles to use). */ giommu =3D g_malloc0(sizeof(*giommu)); - giommu->iommu =3D section->mr; + giommu->iommu =3D iommu_mr; giommu->iommu_offset =3D section->offset_within_address_space - section->offset_within_region; giommu->container =3D container; @@ -501,7 +502,7 @@ static void vfio_listener_region_add(MemoryListener *li= stener, int128_get64(llend)); QLIST_INSERT_HEAD(&container->giommu_list, giommu, giommu_next); =20 - memory_region_register_iommu_notifier(giommu->iommu, &giommu->n); + memory_region_register_iommu_notifier(section->mr, &giommu->n); memory_region_iommu_replay(giommu->iommu, &giommu->n); =20 return; @@ -569,9 +570,9 @@ static void vfio_listener_region_del(MemoryListener *li= stener, VFIOGuestIOMMU *giommu; =20 QLIST_FOREACH(giommu, &container->giommu_list, giommu_next) { - if (giommu->iommu =3D=3D section->mr && + if (MEMORY_REGION(giommu->iommu) =3D=3D section->mr && giommu->n.start =3D=3D section->offset_within_region) { - memory_region_unregister_iommu_notifier(giommu->iommu, + memory_region_unregister_iommu_notifier(section->mr, &giommu->n); QLIST_REMOVE(giommu, giommu_next); g_free(giommu); @@ -1163,7 +1164,8 @@ static void vfio_disconnect_container(VFIOGroup *grou= p) QLIST_REMOVE(container, next); =20 QLIST_FOREACH_SAFE(giommu, &container->giommu_list, giommu_next, t= mp) { - memory_region_unregister_iommu_notifier(giommu->iommu, &giommu= ->n); + memory_region_unregister_iommu_notifier( + MEMORY_REGION(giommu->iommu), &giommu->n); QLIST_REMOVE(giommu, giommu_next); g_free(giommu); } diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c index 4409bcc..32fd6a9 100644 --- a/hw/vfio/spapr.c +++ b/hw/vfio/spapr.c @@ -143,7 +143,8 @@ int vfio_spapr_create_window(VFIOContainer *container, hwaddr *pgsize) { int ret; - unsigned pagesize =3D memory_region_iommu_get_min_page_size(section->m= r); + IOMMUMemoryRegion *iommu_mr =3D IOMMU_MEMORY_REGION(section->mr); + unsigned pagesize =3D memory_region_iommu_get_min_page_size(iommu_mr); unsigned entries, pages; struct vfio_iommu_spapr_tce_create create =3D { .argsz =3D sizeof(crea= te) }; =20 diff --git a/include/exec/memory.h b/include/exec/memory.h index 8503685..92980ab 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -35,6 +35,10 @@ #define MEMORY_REGION(obj) \ OBJECT_CHECK(MemoryRegion, (obj), TYPE_MEMORY_REGION) =20 +#define TYPE_IOMMU_MEMORY_REGION "qemu:iommu-memory-region" +#define IOMMU_MEMORY_REGION(obj) \ + OBJECT_CHECK(IOMMUMemoryRegion, (obj), TYPE_IOMMU_MEMORY_REGION) + typedef struct MemoryRegionOps MemoryRegionOps; typedef struct MemoryRegionMmio MemoryRegionMmio; =20 @@ -198,16 +202,16 @@ struct MemoryRegionIOMMUOps { * set flag to IOMMU_NONE to mean that we don't need any * read/write permission checks, like, when for region replay. */ - IOMMUTLBEntry (*translate)(MemoryRegion *iommu, hwaddr addr, + IOMMUTLBEntry (*translate)(IOMMUMemoryRegion *iommu, hwaddr addr, IOMMUAccessFlags flag); /* Returns minimum supported page size */ - uint64_t (*get_min_page_size)(MemoryRegion *iommu); + uint64_t (*get_min_page_size)(IOMMUMemoryRegion *iommu); /* Called when IOMMU Notifier flag changed */ - void (*notify_flag_changed)(MemoryRegion *iommu, + void (*notify_flag_changed)(IOMMUMemoryRegion *iommu, IOMMUNotifierFlag old_flags, IOMMUNotifierFlag new_flags); /* Set this up to provide customized IOMMU replay function */ - void (*replay)(MemoryRegion *iommu, IOMMUNotifier *notifier); + void (*replay)(IOMMUMemoryRegion *iommu, IOMMUNotifier *notifier); }; =20 typedef struct CoalescedMemoryRange CoalescedMemoryRange; @@ -227,9 +231,9 @@ struct MemoryRegion { bool flush_coalesced_mmio; bool global_locking; uint8_t dirty_log_mask; + bool is_iommu; RAMBlock *ram_block; Object *owner; - const MemoryRegionIOMMUOps *iommu_ops; =20 const MemoryRegionOps *ops; void *opaque; @@ -252,6 +256,12 @@ struct MemoryRegion { const char *name; unsigned ioeventfd_nb; MemoryRegionIoeventfd *ioeventfds; +}; + +struct IOMMUMemoryRegion { + MemoryRegion parent_obj; + + const MemoryRegionIOMMUOps *iommu_ops; QLIST_HEAD(, IOMMUNotifier) iommu_notify; IOMMUNotifierFlag iommu_notify_flags; }; @@ -618,13 +628,13 @@ static inline void memory_region_init_reservation(Mem= oryRegion *mr, * An IOMMU region translates addresses and forwards accesses to a target * memory region. * - * @mr: the #MemoryRegion to be initialized + * @iommu_mr: the #IOMMUMemoryRegion to be initialized * @owner: the object that tracks the region's reference count * @ops: a function that translates addresses into the @target region * @name: used for debugging; not visible to the user or ABI * @size: size of the region. */ -void memory_region_init_iommu(MemoryRegion *mr, +void memory_region_init_iommu(IOMMUMemoryRegion *iommu_mr, struct Object *owner, const MemoryRegionIOMMUOps *ops, const char *name, @@ -679,20 +689,25 @@ static inline bool memory_region_is_romd(MemoryRegion= *mr) } =20 /** - * memory_region_is_iommu: check whether a memory region is an iommu + * memory_region_get_iommu: check whether a memory region is an iommu * - * Returns %true is a memory region is an iommu. + * Returns pointer to IOMMUMemoryRegion if a memory region is an iommu, + * otherwise NULL. * * @mr: the memory region being queried */ -static inline bool memory_region_is_iommu(MemoryRegion *mr) +static inline IOMMUMemoryRegion *memory_region_get_iommu(MemoryRegion *mr) { if (mr->alias) { - return memory_region_is_iommu(mr->alias); + return memory_region_get_iommu(mr->alias); + } + if (mr->is_iommu) { + return (IOMMUMemoryRegion *) mr; } - return mr->iommu_ops; + return NULL; } =20 +#define memory_region_is_iommu(mr) (memory_region_get_iommu(mr) !=3D NULL) =20 /** * memory_region_iommu_get_min_page_size: get minimum supported page size @@ -700,9 +715,9 @@ static inline bool memory_region_is_iommu(MemoryRegion = *mr) * * Returns minimum supported page size for an iommu. * - * @mr: the memory region being queried + * @iommu_mr: the memory region being queried */ -uint64_t memory_region_iommu_get_min_page_size(MemoryRegion *mr); +uint64_t memory_region_iommu_get_min_page_size(IOMMUMemoryRegion *iommu_mr= ); =20 /** * memory_region_notify_iommu: notify a change in an IOMMU translation ent= ry. @@ -716,12 +731,12 @@ uint64_t memory_region_iommu_get_min_page_size(Memory= Region *mr); * Note: for any IOMMU implementation, an in-place mapping change * should be notified with an UNMAP followed by a MAP. * - * @mr: the memory region that was changed + * @iommu_mr: the memory region that was changed * @entry: the new entry in the IOMMU translation table. The entry * replaces all old entries for the same virtual I/O address range. * Deleted entries have .@perm =3D=3D 0. */ -void memory_region_notify_iommu(MemoryRegion *mr, +void memory_region_notify_iommu(IOMMUMemoryRegion *iommu_mr, IOMMUTLBEntry entry); =20 /** @@ -756,18 +771,18 @@ void memory_region_register_iommu_notifier(MemoryRegi= on *mr, * a notifier with the minimum page granularity returned by * mr->iommu_ops->get_page_size(). * - * @mr: the memory region to observe + * @iommu_mr: the memory region to observe * @n: the notifier to which to replay iommu mappings */ -void memory_region_iommu_replay(MemoryRegion *mr, IOMMUNotifier *n); +void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier= *n); =20 /** * memory_region_iommu_replay_all: replay existing IOMMU translations * to all the notifiers registered. * - * @mr: the memory region to observe + * @iommu_mr: the memory region to observe */ -void memory_region_iommu_replay_all(MemoryRegion *mr); +void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr); =20 /** * memory_region_unregister_iommu_notifier: unregister a notifier for diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h index 3e51876..45fba4f 100644 --- a/include/hw/i386/intel_iommu.h +++ b/include/hw/i386/intel_iommu.h @@ -83,7 +83,7 @@ struct VTDAddressSpace { PCIBus *bus; uint8_t devfn; AddressSpace as; - MemoryRegion iommu; + IOMMUMemoryRegion iommu; MemoryRegion root; MemoryRegion sys_alias; MemoryRegion iommu_ir; /* Interrupt region: 0xfeeXXXXX */ diff --git a/include/hw/mips/mips.h b/include/hw/mips/mips.h index 16412dc..2f6774d 100644 --- a/include/hw/mips/mips.h +++ b/include/hw/mips/mips.h @@ -19,6 +19,6 @@ typedef struct rc4030DMAState *rc4030_dma; void rc4030_dma_read(void *dma, uint8_t *buf, int len); void rc4030_dma_write(void *dma, uint8_t *buf, int len); =20 -DeviceState *rc4030_init(rc4030_dma **dmas, MemoryRegion **dma_mr); +DeviceState *rc4030_init(rc4030_dma **dmas, IOMMUMemoryRegion **dma_mr); =20 #endif diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index a184ffa..b353dff 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -594,7 +594,8 @@ struct sPAPRTCETable { bool bypass; bool need_vfio; int fd; - MemoryRegion root, iommu; + MemoryRegion root; + IOMMUMemoryRegion iommu; struct VIOsPAPRDevice *vdev; /* for @bypass migration compatibility on= ly */ QLIST_ENTRY(sPAPRTCETable) list; }; diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index 0b475a3..f3a2ac9 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -95,7 +95,7 @@ typedef struct VFIOContainer { =20 typedef struct VFIOGuestIOMMU { VFIOContainer *container; - MemoryRegion *iommu; + IOMMUMemoryRegion *iommu; hwaddr iommu_offset; IOMMUNotifier n; QLIST_ENTRY(VFIOGuestIOMMU) giommu_next; diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h index 2706aab..b191591 100644 --- a/include/qemu/typedefs.h +++ b/include/qemu/typedefs.h @@ -45,6 +45,7 @@ typedef struct MachineState MachineState; typedef struct MemoryListener MemoryListener; typedef struct MemoryMappingList MemoryMappingList; typedef struct MemoryRegion MemoryRegion; +typedef struct IOMMUMemoryRegion IOMMUMemoryRegion; typedef struct MemoryRegionCache MemoryRegionCache; typedef struct MemoryRegionSection MemoryRegionSection; typedef struct MigrationIncomingState MigrationIncomingState; diff --git a/memory.c b/memory.c index 1044bba..45e10e2 100644 --- a/memory.c +++ b/memory.c @@ -977,12 +977,11 @@ static char *memory_region_escape_name(const char *na= me) return escaped; } =20 -void memory_region_init(MemoryRegion *mr, - Object *owner, - const char *name, - uint64_t size) +static void memory_region_do_init(MemoryRegion *mr, + Object *owner, + const char *name, + uint64_t size) { - object_initialize(mr, sizeof(*mr), TYPE_MEMORY_REGION); mr->size =3D int128_make64(size); if (size =3D=3D UINT64_MAX) { mr->size =3D int128_2_64(); @@ -1006,6 +1005,15 @@ void memory_region_init(MemoryRegion *mr, } } =20 +void memory_region_init(MemoryRegion *mr, + Object *owner, + const char *name, + uint64_t size) +{ + object_initialize(mr, sizeof(*mr), TYPE_MEMORY_REGION); + memory_region_do_init(mr, owner, name, size); +} + static void memory_region_get_addr(Object *obj, Visitor *v, const char *na= me, void *opaque, Error **errp) { @@ -1092,6 +1100,13 @@ static void memory_region_initfn(Object *obj) NULL, NULL, &error_abort); } =20 +static void iommu_memory_region_initfn(Object *obj) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + + mr->is_iommu =3D true; +} + static uint64_t unassigned_mem_read(void *opaque, hwaddr addr, unsigned size) { @@ -1491,17 +1506,22 @@ void memory_region_init_rom_device(MemoryRegion *mr, mr->ram_block =3D qemu_ram_alloc(size, mr, errp); } =20 -void memory_region_init_iommu(MemoryRegion *mr, +void memory_region_init_iommu(IOMMUMemoryRegion *iommu_mr, Object *owner, const MemoryRegionIOMMUOps *ops, const char *name, uint64_t size) { - memory_region_init(mr, owner, name, size); - mr->iommu_ops =3D ops, + struct MemoryRegion *mr; + + object_initialize(iommu_mr, sizeof(*iommu_mr), TYPE_IOMMU_MEMORY_REGIO= N); + mr =3D MEMORY_REGION(iommu_mr); + memory_region_do_init(mr, owner, name, size); + iommu_mr =3D IOMMU_MEMORY_REGION(mr); + iommu_mr->iommu_ops =3D ops, mr->terminates =3D true; /* then re-forwards */ - QLIST_INIT(&mr->iommu_notify); - mr->iommu_notify_flags =3D IOMMU_NOTIFIER_NONE; + QLIST_INIT(&iommu_mr->iommu_notify); + iommu_mr->iommu_notify_flags =3D IOMMU_NOTIFIER_NONE; } =20 static void memory_region_finalize(Object *obj) @@ -1596,63 +1616,67 @@ bool memory_region_is_logging(MemoryRegion *mr, uin= t8_t client) return memory_region_get_dirty_log_mask(mr) & (1 << client); } =20 -static void memory_region_update_iommu_notify_flags(MemoryRegion *mr) +static void memory_region_update_iommu_notify_flags(IOMMUMemoryRegion *iom= mu_mr) { IOMMUNotifierFlag flags =3D IOMMU_NOTIFIER_NONE; IOMMUNotifier *iommu_notifier; =20 - IOMMU_NOTIFIER_FOREACH(iommu_notifier, mr) { + IOMMU_NOTIFIER_FOREACH(iommu_notifier, iommu_mr) { flags |=3D iommu_notifier->notifier_flags; } =20 - if (flags !=3D mr->iommu_notify_flags && - mr->iommu_ops->notify_flag_changed) { - mr->iommu_ops->notify_flag_changed(mr, mr->iommu_notify_flags, - flags); + if (flags !=3D iommu_mr->iommu_notify_flags && + iommu_mr->iommu_ops->notify_flag_changed) { + iommu_mr->iommu_ops->notify_flag_changed(iommu_mr, + iommu_mr->iommu_notify_fla= gs, + flags); } =20 - mr->iommu_notify_flags =3D flags; + iommu_mr->iommu_notify_flags =3D flags; } =20 void memory_region_register_iommu_notifier(MemoryRegion *mr, IOMMUNotifier *n) { + IOMMUMemoryRegion *iommu_mr; + if (mr->alias) { memory_region_register_iommu_notifier(mr->alias, n); return; } =20 /* We need to register for at least one bitfield */ + iommu_mr =3D IOMMU_MEMORY_REGION(mr); assert(n->notifier_flags !=3D IOMMU_NOTIFIER_NONE); assert(n->start <=3D n->end); - QLIST_INSERT_HEAD(&mr->iommu_notify, n, node); - memory_region_update_iommu_notify_flags(mr); + QLIST_INSERT_HEAD(&iommu_mr->iommu_notify, n, node); + memory_region_update_iommu_notify_flags(iommu_mr); } =20 -uint64_t memory_region_iommu_get_min_page_size(MemoryRegion *mr) +uint64_t memory_region_iommu_get_min_page_size(IOMMUMemoryRegion *iommu_mr) { - assert(memory_region_is_iommu(mr)); - if (mr->iommu_ops && mr->iommu_ops->get_min_page_size) { - return mr->iommu_ops->get_min_page_size(mr); + if (iommu_mr->iommu_ops && iommu_mr->iommu_ops->get_min_page_size) { + return iommu_mr->iommu_ops->get_min_page_size(iommu_mr); } return TARGET_PAGE_SIZE; } =20 -void memory_region_iommu_replay(MemoryRegion *mr, IOMMUNotifier *n) +void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier= *n) { + MemoryRegion *mr =3D MEMORY_REGION(iommu_mr); hwaddr addr, granularity; IOMMUTLBEntry iotlb; =20 /* If the IOMMU has its own replay callback, override */ - if (mr->iommu_ops->replay) { - mr->iommu_ops->replay(mr, n); + if (iommu_mr->iommu_ops->replay) { + iommu_mr->iommu_ops->replay(iommu_mr, n); return; } =20 - granularity =3D memory_region_iommu_get_min_page_size(mr); + granularity =3D memory_region_iommu_get_min_page_size(iommu_mr); =20 for (addr =3D 0; addr < memory_region_size(mr); addr +=3D granularity)= { - iotlb =3D mr->iommu_ops->translate(mr, addr, IOMMU_NONE); + iotlb =3D iommu_mr->iommu_ops->translate(iommu_mr, addr, IOMMU_NON= E); if (iotlb.perm !=3D IOMMU_NONE) { n->notify(n, &iotlb); } @@ -1665,24 +1689,27 @@ void memory_region_iommu_replay(MemoryRegion *mr, I= OMMUNotifier *n) } } =20 -void memory_region_iommu_replay_all(MemoryRegion *mr) +void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr) { IOMMUNotifier *notifier; =20 - IOMMU_NOTIFIER_FOREACH(notifier, mr) { - memory_region_iommu_replay(mr, notifier); + IOMMU_NOTIFIER_FOREACH(notifier, iommu_mr) { + memory_region_iommu_replay(iommu_mr, notifier); } } =20 void memory_region_unregister_iommu_notifier(MemoryRegion *mr, IOMMUNotifier *n) { + IOMMUMemoryRegion *iommu_mr; + if (mr->alias) { memory_region_unregister_iommu_notifier(mr->alias, n); return; } QLIST_REMOVE(n, node); - memory_region_update_iommu_notify_flags(mr); + iommu_mr =3D IOMMU_MEMORY_REGION(mr); + memory_region_update_iommu_notify_flags(iommu_mr); } =20 void memory_region_notify_one(IOMMUNotifier *notifier, @@ -1710,14 +1737,14 @@ void memory_region_notify_one(IOMMUNotifier *notifi= er, } } =20 -void memory_region_notify_iommu(MemoryRegion *mr, +void memory_region_notify_iommu(IOMMUMemoryRegion *iommu_mr, IOMMUTLBEntry entry) { IOMMUNotifier *iommu_notifier; =20 - assert(memory_region_is_iommu(mr)); + assert(memory_region_is_iommu(MEMORY_REGION(iommu_mr))); =20 - IOMMU_NOTIFIER_FOREACH(iommu_notifier, mr) { + IOMMU_NOTIFIER_FOREACH(iommu_notifier, iommu_mr) { memory_region_notify_one(iommu_notifier, &entry); } } @@ -2825,9 +2852,17 @@ static const TypeInfo memory_region_info =3D { .instance_finalize =3D memory_region_finalize, }; =20 +static const TypeInfo iommu_memory_region_info =3D { + .parent =3D TYPE_MEMORY_REGION, + .name =3D TYPE_IOMMU_MEMORY_REGION, + .instance_size =3D sizeof(IOMMUMemoryRegion), + .instance_init =3D iommu_memory_region_initfn, +}; + static void memory_register_types(void) { type_register_static(&memory_region_info); + type_register_static(&iommu_memory_region_info); } =20 type_init(memory_register_types) --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499958035637300.9152678903471; Thu, 13 Jul 2017 08:00:35 -0700 (PDT) Received: from localhost ([::1]:60536 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfbU-0000xR-4U for importer@patchew.org; Thu, 13 Jul 2017 11:00:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51843) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4Y-000201-JK for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4V-0004O2-Oq for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:30 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:35553) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4V-0004Nf-C4 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:27 -0400 Received: by mail-wm0-f65.google.com with SMTP id u23so5458277wma.2 for ; Thu, 13 Jul 2017 07:26:27 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=EI0FWF2UVnn53z0uiUOL58vho4sfK6h6a0x9KAR4G8E=; b=elDpHI7oG/c6eaEiIeyl6YQJ5/SL276rT6XAkTdVxR3mvMcyq+Y2GWYASNkBI+NjrT aC1ov6gzEe4wYtQNs9PQnUC3rk4GE+6v/6/lvwVQNhdWllMcae4A6ps4ar6bAQfC9Pn9 LXzvME6hSwF8loRSFWG+ypibXqYq6FKXmjdhsv9ZlkN6iVzJ0AOc+DvvN+MnPIMNLPrh 7QxLU4SAPKE5yZSr4NQ8v0lvPGuDfTjmS4ipml2pk8pKSYcOAd/uhKv7L+5Z+vfdL/Tu 0W9jmT2sgXHnvfT4CD1cANKzuFiHBOKb+bgr2vj1BKF3uoYzPVH6HneNRH1Eq96t58TP Fsng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=EI0FWF2UVnn53z0uiUOL58vho4sfK6h6a0x9KAR4G8E=; b=fjlKRf1fVX0zQFfQKx0BldHfe3WikWeGlYik107JUDOklsAFTjoxYWLNl4CnYhm9/C Q73nr8y2ToJ4qRUzMjGjr+DiAmpPk3gLdHoOlBnPnFtjsK2GIjHQSshU85FSUzmf8oKt lZy+uOAVibRkLiAgo30XYwm5zOkQoQQiNgfcZ1nvc3qnI6YkQGBzaF6VOKGevjr9LXJM ljgmSwr7cmn0/10luJm5i5IBMxyYIi1nljZBebc6FIeTlNWi2oKxveDPtValck7aUtwF PCL3M5kh5Vo88224Dsn/2AaC5Z2lEls5ASboQcokLa1Fdvnh+uhEabd7Xb6u8MQFY/Rt lIhw== X-Gm-Message-State: AIVw112Xrq/adJ4bYVS2O98xKgXzQ3DymOEa/KdVWYeZto6rybFx2LmR SgJyNZv/MVMRdhs37QQ= X-Received: by 10.28.232.141 with SMTP id f13mr2270645wmi.59.1499955925736; Thu, 13 Jul 2017 07:25:25 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:23 +0200 Message-Id: <1499955874-10954-31-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 74.125.82.65 Subject: [Qemu-devel] [PULL 30/41] memory/iommu: introduce IOMMUMemoryRegionClass 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: Alexey Kardashevskiy Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Alexey Kardashevskiy This finishes QOM'fication of IOMMUMemoryRegion by introducing a IOMMUMemoryRegionClass. This also provides a fastpath analog for IOMMU_MEMORY_REGION_GET_CLASS(). This makes IOMMUMemoryRegion an abstract class. Signed-off-by: Alexey Kardashevskiy Message-Id: <20170711035620.4232-3-aik@ozlabs.ru> Acked-by: Cornelia Huck Signed-off-by: Paolo Bonzini --- exec.c | 6 ++++-- hw/alpha/typhoon.c | 23 +++++++++++++++++----- hw/dma/rc4030.c | 26 +++++++++++++++++++------ hw/i386/amd_iommu.c | 24 +++++++++++++++++++---- hw/i386/amd_iommu.h | 5 ++--- hw/i386/intel_iommu.c | 25 +++++++++++++++++++----- hw/pci-host/apb.c | 23 +++++++++++++++++----- hw/ppc/spapr_iommu.c | 26 ++++++++++++++++++------- hw/s390x/s390-pci-bus.c | 23 ++++++++++++++++------ hw/s390x/s390-pci-bus.h | 1 + hw/s390x/s390-pci-inst.c | 5 ++++- include/exec/memory.h | 45 +++++++++++++++++++++++++++++++++------= ---- include/hw/i386/intel_iommu.h | 3 ++- include/hw/ppc/spapr.h | 4 ++++ memory.c | 36 +++++++++++++++++++--------------- 15 files changed, 205 insertions(+), 70 deletions(-) diff --git a/exec.c b/exec.c index 2aa8be5..b3c080f 100644 --- a/exec.c +++ b/exec.c @@ -481,6 +481,7 @@ static MemoryRegionSection address_space_do_translate(A= ddressSpace *as, IOMMUTLBEntry iotlb; MemoryRegionSection *section; IOMMUMemoryRegion *iommu_mr; + IOMMUMemoryRegionClass *imrc; =20 for (;;) { AddressSpaceDispatch *d =3D atomic_rcu_read(&as->dispatch); @@ -490,9 +491,10 @@ static MemoryRegionSection address_space_do_translate(= AddressSpace *as, if (!iommu_mr) { break; } + imrc =3D memory_region_get_iommu_class_nocheck(iommu_mr); =20 - iotlb =3D iommu_mr->iommu_ops->translate(iommu_mr, addr, is_write ? - IOMMU_WO : IOMMU_RO); + iotlb =3D imrc->translate(iommu_mr, addr, is_write ? + IOMMU_WO : IOMMU_RO); addr =3D ((iotlb.translated_addr & ~iotlb.addr_mask) | (addr & iotlb.addr_mask)); *plen =3D MIN(*plen, (addr | iotlb.addr_mask) - addr + 1); diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c index dd47b45..ae11e01 100644 --- a/hw/alpha/typhoon.c +++ b/hw/alpha/typhoon.c @@ -17,6 +17,7 @@ =20 =20 #define TYPE_TYPHOON_PCI_HOST_BRIDGE "typhoon-pcihost" +#define TYPE_TYPHOON_IOMMU_MEMORY_REGION "typhoon-iommu-memory-region" =20 typedef struct TyphoonCchip { MemoryRegion region; @@ -725,10 +726,6 @@ static IOMMUTLBEntry typhoon_translate_iommu(IOMMUMemo= ryRegion *iommu, return ret; } =20 -static const MemoryRegionIOMMUOps typhoon_iommu_ops =3D { - .translate =3D typhoon_translate_iommu, -}; - static AddressSpace *typhoon_pci_dma_iommu(PCIBus *bus, void *opaque, int = devfn) { TyphoonState *s =3D opaque; @@ -892,7 +889,8 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_= bus, qdev_init_nofail(dev); =20 /* Host memory as seen from the PCI side, via the IOMMU. */ - memory_region_init_iommu(&s->pchip.iommu, OBJECT(s), &typhoon_iommu_op= s, + memory_region_init_iommu(&s->pchip.iommu, sizeof(s->pchip.iommu), + TYPE_TYPHOON_IOMMU_MEMORY_REGION, OBJECT(s), "iommu-typhoon", UINT64_MAX); address_space_init(&s->pchip.iommu_as, MEMORY_REGION(&s->pchip.iommu), "pchip0-pci"); @@ -953,9 +951,24 @@ static const TypeInfo typhoon_pcihost_info =3D { .class_init =3D typhoon_pcihost_class_init, }; =20 +static void typhoon_iommu_memory_region_class_init(ObjectClass *klass, + void *data) +{ + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_CLASS(klass); + + imrc->translate =3D typhoon_translate_iommu; +} + +static const TypeInfo typhoon_iommu_memory_region_info =3D { + .parent =3D TYPE_IOMMU_MEMORY_REGION, + .name =3D TYPE_TYPHOON_IOMMU_MEMORY_REGION, + .class_init =3D typhoon_iommu_memory_region_class_init, +}; + static void typhoon_register_types(void) { type_register_static(&typhoon_pcihost_info); + type_register_static(&typhoon_iommu_memory_region_info); } =20 type_init(typhoon_register_types) diff --git a/hw/dma/rc4030.c b/hw/dma/rc4030.c index 32c0676..5d4833e 100644 --- a/hw/dma/rc4030.c +++ b/hw/dma/rc4030.c @@ -54,6 +54,8 @@ typedef struct dma_pagetable_entry { #define RC4030(obj) \ OBJECT_CHECK(rc4030State, (obj), TYPE_RC4030) =20 +#define TYPE_RC4030_IOMMU_MEMORY_REGION "rc4030-iommu-memory-region" + typedef struct rc4030State { SysBusDevice parent; @@ -516,10 +518,6 @@ static IOMMUTLBEntry rc4030_dma_translate(IOMMUMemoryR= egion *iommu, hwaddr addr, return ret; } =20 -static const MemoryRegionIOMMUOps rc4030_dma_ops =3D { - .translate =3D rc4030_dma_translate, -}; - static void rc4030_reset(DeviceState *dev) { rc4030State *s =3D RC4030(dev); @@ -677,8 +675,9 @@ static void rc4030_realize(DeviceState *dev, Error **er= rp) memory_region_init_io(&s->iomem_jazzio, NULL, &jazzio_ops, s, "rc4030.jazzio", 0x00001000); =20 - memory_region_init_iommu(&s->dma_mr, o, &rc4030_dma_ops, - "rc4030.dma", UINT32_MAX); + memory_region_init_iommu(&s->dma_mr, sizeof(s->dma_mr), + TYPE_RC4030_IOMMU_MEMORY_REGION, + o, "rc4030.dma", UINT32_MAX); address_space_init(&s->dma_as, MEMORY_REGION(&s->dma_mr), "rc4030-dma"= ); } =20 @@ -710,9 +709,24 @@ static const TypeInfo rc4030_info =3D { .class_init =3D rc4030_class_init, }; =20 +static void rc4030_iommu_memory_region_class_init(ObjectClass *klass, + void *data) +{ + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_CLASS(klass); + + imrc->translate =3D rc4030_dma_translate; +} + +static const TypeInfo rc4030_iommu_memory_region_info =3D { + .parent =3D TYPE_IOMMU_MEMORY_REGION, + .name =3D TYPE_RC4030_IOMMU_MEMORY_REGION, + .class_init =3D rc4030_iommu_memory_region_class_init, +}; + static void rc4030_register_types(void) { type_register_static(&rc4030_info); + type_register_static(&rc4030_iommu_memory_region_info); } =20 type_init(rc4030_register_types) diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c index 7a67c57..334938a 100644 --- a/hw/i386/amd_iommu.c +++ b/hw/i386/amd_iommu.c @@ -1044,8 +1044,11 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bu= s, void *opaque, int devfn) iommu_as[devfn]->devfn =3D (uint8_t)devfn; iommu_as[devfn]->iommu_state =3D s; =20 - memory_region_init_iommu(&iommu_as[devfn]->iommu, OBJECT(s), - &s->iommu_ops, "amd-iommu", UINT64_MAX); + memory_region_init_iommu(&iommu_as[devfn]->iommu, + sizeof(iommu_as[devfn]->iommu), + TYPE_AMD_IOMMU_MEMORY_REGION, + OBJECT(s), + "amd-iommu", UINT64_MAX); address_space_init(&iommu_as[devfn]->as, MEMORY_REGION(&iommu_as[devfn]->iommu), "amd-iommu"); @@ -1086,8 +1089,6 @@ static void amdvi_init(AMDVIState *s) { amdvi_iotlb_reset(s); =20 - s->iommu_ops.translate =3D amdvi_translate; - s->iommu_ops.notify_flag_changed =3D amdvi_iommu_notify_flag_changed; s->devtab_len =3D 0; s->cmdbuf_len =3D 0; s->cmdbuf_head =3D 0; @@ -1228,10 +1229,25 @@ static const TypeInfo amdviPCI =3D { .instance_size =3D sizeof(AMDVIPCIState), }; =20 +static void amdvi_iommu_memory_region_class_init(ObjectClass *klass, void = *data) +{ + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_CLASS(klass); + + imrc->translate =3D amdvi_translate; + imrc->notify_flag_changed =3D amdvi_iommu_notify_flag_changed; +} + +static const TypeInfo amdvi_iommu_memory_region_info =3D { + .parent =3D TYPE_IOMMU_MEMORY_REGION, + .name =3D TYPE_AMD_IOMMU_MEMORY_REGION, + .class_init =3D amdvi_iommu_memory_region_class_init, +}; + static void amdviPCI_register_types(void) { type_register_static(&amdviPCI); type_register_static(&amdvi); + type_register_static(&amdvi_iommu_memory_region_info); } =20 type_init(amdviPCI_register_types); diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h index 0d3dc6a..d370ae3 100644 --- a/hw/i386/amd_iommu.h +++ b/hw/i386/amd_iommu.h @@ -220,6 +220,8 @@ =20 #define TYPE_AMD_IOMMU_PCI "AMDVI-PCI" =20 +#define TYPE_AMD_IOMMU_MEMORY_REGION "amd-iommu-iommu-memory-region" + typedef struct AMDVIAddressSpace AMDVIAddressSpace; =20 /* functions to steal PCI config space */ @@ -276,9 +278,6 @@ typedef struct AMDVIState { uint8_t romask[AMDVI_MMIO_SIZE]; /* MMIO read/only mask */ bool mmio_enabled; =20 - /* IOMMU function */ - MemoryRegionIOMMUOps iommu_ops; - /* for each served device */ AMDVIAddressSpace **address_spaces[PCI_BUS_MAX]; =20 diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index 11dba0e..e398746 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -2718,8 +2718,9 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, = PCIBus *bus, int devfn) * vtd_sys_alias and intel_iommu regions. IR region is always * enabled. */ - memory_region_init_iommu(&vtd_dev_as->iommu, OBJECT(s), - &s->iommu_ops, "intel_iommu_dmar", + memory_region_init_iommu(&vtd_dev_as->iommu, sizeof(vtd_dev_as->io= mmu), + TYPE_INTEL_IOMMU_MEMORY_REGION, OBJECT(s), + "intel_iommu_dmar", UINT64_MAX); memory_region_init_alias(&vtd_dev_as->sys_alias, OBJECT(s), "vtd_sys_alias", get_system_memory(), @@ -2857,9 +2858,6 @@ static void vtd_init(IntelIOMMUState *s) memset(s->w1cmask, 0, DMAR_REG_SIZE); memset(s->womask, 0, DMAR_REG_SIZE); =20 - s->iommu_ops.translate =3D vtd_iommu_translate; - s->iommu_ops.notify_flag_changed =3D vtd_iommu_notify_flag_changed; - s->iommu_ops.replay =3D vtd_iommu_replay; s->root =3D 0; s->root_extended =3D false; s->dmar_enabled =3D false; @@ -3074,9 +3072,26 @@ static const TypeInfo vtd_info =3D { .class_init =3D vtd_class_init, }; =20 +static void vtd_iommu_memory_region_class_init(ObjectClass *klass, + void *data) +{ + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_CLASS(klass); + + imrc->translate =3D vtd_iommu_translate; + imrc->notify_flag_changed =3D vtd_iommu_notify_flag_changed; + imrc->replay =3D vtd_iommu_replay; +} + +static const TypeInfo vtd_iommu_memory_region_info =3D { + .parent =3D TYPE_IOMMU_MEMORY_REGION, + .name =3D TYPE_INTEL_IOMMU_MEMORY_REGION, + .class_init =3D vtd_iommu_memory_region_class_init, +}; + static void vtd_register_types(void) { type_register_static(&vtd_info); + type_register_static(&vtd_iommu_memory_region_info); } =20 type_init(vtd_register_types) diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c index 76a56ae..96e5d0b 100644 --- a/hw/pci-host/apb.c +++ b/hw/pci-host/apb.c @@ -133,6 +133,8 @@ typedef struct IOMMUState { #define APB_DEVICE(obj) \ OBJECT_CHECK(APBState, (obj), TYPE_APB) =20 +#define TYPE_APB_IOMMU_MEMORY_REGION "pbm-iommu-memory-region" + typedef struct APBState { PCIHostState parent_obj; =20 @@ -322,10 +324,6 @@ static IOMMUTLBEntry pbm_translate_iommu(IOMMUMemoryRe= gion *iommu, hwaddr addr, return ret; } =20 -static MemoryRegionIOMMUOps pbm_iommu_ops =3D { - .translate =3D pbm_translate_iommu, -}; - static void iommu_config_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { @@ -697,7 +695,8 @@ PCIBus *pci_apb_init(hwaddr special_base, is =3D &d->iommu; memset(is, 0, sizeof(IOMMUState)); =20 - memory_region_init_iommu(&is->iommu, OBJECT(dev), &pbm_iommu_ops, + memory_region_init_iommu(&is->iommu, sizeof(is->iommu), + TYPE_APB_IOMMU_MEMORY_REGION, OBJECT(dev), "iommu-apb", UINT64_MAX); address_space_init(&is->iommu_as, MEMORY_REGION(&is->iommu), "pbm-as"); pci_setup_iommu(phb->bus, pbm_pci_dma_iommu, is); @@ -860,11 +859,25 @@ static const TypeInfo pbm_pci_bridge_info =3D { .class_init =3D pbm_pci_bridge_class_init, }; =20 +static void pbm_iommu_memory_region_class_init(ObjectClass *klass, void *d= ata) +{ + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_CLASS(klass); + + imrc->translate =3D pbm_translate_iommu; +} + +static const TypeInfo pbm_iommu_memory_region_info =3D { + .parent =3D TYPE_IOMMU_MEMORY_REGION, + .name =3D TYPE_APB_IOMMU_MEMORY_REGION, + .class_init =3D pbm_iommu_memory_region_class_init, +}; + static void pbm_register_types(void) { type_register_static(&pbm_host_info); type_register_static(&pbm_pci_host_info); type_register_static(&pbm_pci_bridge_info); + type_register_static(&pbm_iommu_memory_region_info); } =20 type_init(pbm_register_types) diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c index 6b6ced5..d07b4b4 100644 --- a/hw/ppc/spapr_iommu.c +++ b/hw/ppc/spapr_iommu.c @@ -248,12 +248,6 @@ static const VMStateDescription vmstate_spapr_tce_tabl= e =3D { } }; =20 -static MemoryRegionIOMMUOps spapr_iommu_ops =3D { - .translate =3D spapr_tce_translate_iommu, - .get_min_page_size =3D spapr_tce_get_min_page_size, - .notify_flag_changed =3D spapr_tce_notify_flag_changed, -}; - static int spapr_tce_table_realize(DeviceState *dev) { sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(dev); @@ -266,7 +260,9 @@ static int spapr_tce_table_realize(DeviceState *dev) memory_region_init(&tcet->root, tcetobj, tmp, UINT64_MAX); =20 snprintf(tmp, sizeof(tmp), "tce-iommu-%x", tcet->liobn); - memory_region_init_iommu(&tcet->iommu, tcetobj, &spapr_iommu_ops, tmp,= 0); + memory_region_init_iommu(&tcet->iommu, sizeof(tcet->iommu), + TYPE_SPAPR_IOMMU_MEMORY_REGION, + tcetobj, tmp, 0); =20 QLIST_INSERT_HEAD(&spapr_tce_tables, tcet, list); =20 @@ -639,9 +635,25 @@ static TypeInfo spapr_tce_table_info =3D { .class_init =3D spapr_tce_table_class_init, }; =20 +static void spapr_iommu_memory_region_class_init(ObjectClass *klass, void = *data) +{ + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_CLASS(klass); + + imrc->translate =3D spapr_tce_translate_iommu; + imrc->get_min_page_size =3D spapr_tce_get_min_page_size; + imrc->notify_flag_changed =3D spapr_tce_notify_flag_changed; +} + +static const TypeInfo spapr_iommu_memory_region_info =3D { + .parent =3D TYPE_IOMMU_MEMORY_REGION, + .name =3D TYPE_SPAPR_IOMMU_MEMORY_REGION, + .class_init =3D spapr_iommu_memory_region_class_init, +}; + static void register_types(void) { type_register_static(&spapr_tce_table_info); + type_register_static(&spapr_iommu_memory_region_info); } =20 type_init(register_types); diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index e4fc82c..903b3ca 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -407,10 +407,6 @@ static IOMMUTLBEntry s390_translate_iommu(IOMMUMemoryR= egion *mr, hwaddr addr, return ret; } =20 -static const MemoryRegionIOMMUOps s390_iommu_ops =3D { - .translate =3D s390_translate_iommu, -}; - static S390PCIIOMMU *s390_pci_get_iommu(S390pciState *s, PCIBus *bus, int devfn) { @@ -522,8 +518,9 @@ static const MemoryRegionOps s390_msi_ctrl_ops =3D { void s390_pci_iommu_enable(S390PCIIOMMU *iommu) { char *name =3D g_strdup_printf("iommu-s390-%04x", iommu->pbdev->uid); - memory_region_init_iommu(&iommu->iommu_mr, OBJECT(&iommu->mr), - &s390_iommu_ops, name, iommu->pal + 1); + memory_region_init_iommu(&iommu->iommu_mr, sizeof(iommu->iommu_mr), + TYPE_S390_IOMMU_MEMORY_REGION, OBJECT(&iommu-= >mr), + name, iommu->pal + 1); iommu->enabled =3D true; memory_region_add_subregion(&iommu->mr, 0, MEMORY_REGION(&iommu->iommu= _mr)); g_free(name); @@ -1058,12 +1055,26 @@ static TypeInfo s390_pci_iommu_info =3D { .instance_size =3D sizeof(S390PCIIOMMU), }; =20 +static void s390_iommu_memory_region_class_init(ObjectClass *klass, void *= data) +{ + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_CLASS(klass); + + imrc->translate =3D s390_translate_iommu; +} + +static const TypeInfo s390_iommu_memory_region_info =3D { + .parent =3D TYPE_IOMMU_MEMORY_REGION, + .name =3D TYPE_S390_IOMMU_MEMORY_REGION, + .class_init =3D s390_iommu_memory_region_class_init, +}; + static void s390_pci_register_types(void) { type_register_static(&s390_pcihost_info); type_register_static(&s390_pcibus_info); type_register_static(&s390_pci_device_info); type_register_static(&s390_pci_iommu_info); + type_register_static(&s390_iommu_memory_region_info); } =20 type_init(s390_pci_register_types) diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h index 6a599ed..67af2c1 100644 --- a/hw/s390x/s390-pci-bus.h +++ b/hw/s390x/s390-pci-bus.h @@ -24,6 +24,7 @@ #define TYPE_S390_PCI_BUS "s390-pcibus" #define TYPE_S390_PCI_DEVICE "zpci" #define TYPE_S390_PCI_IOMMU "s390-pci-iommu" +#define TYPE_S390_IOMMU_MEMORY_REGION "s390-iommu-memory-region" #define FH_MASK_ENABLE 0x80000000 #define FH_MASK_INSTANCE 0x7f000000 #define FH_MASK_SHM 0x00ff0000 diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c index a53c29c..b7beb8c 100644 --- a/hw/s390x/s390-pci-inst.c +++ b/hw/s390x/s390-pci-inst.c @@ -564,6 +564,7 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_= t r2) hwaddr start, end; IOMMUTLBEntry entry; IOMMUMemoryRegion *iommu_mr; + IOMMUMemoryRegionClass *imrc; =20 cpu_synchronize_state(CPU(cpu)); =20 @@ -623,8 +624,10 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8= _t r2) } =20 iommu_mr =3D &iommu->iommu_mr; + imrc =3D IOMMU_MEMORY_REGION_GET_CLASS(iommu_mr); + while (start < end) { - entry =3D iommu_mr->iommu_ops->translate(iommu_mr, start, IOMMU_NO= NE); + entry =3D imrc->translate(iommu_mr, start, IOMMU_NONE); =20 if (!entry.translated_addr) { pbdev->state =3D ZPCI_FS_ERROR; diff --git a/include/exec/memory.h b/include/exec/memory.h index 92980ab..b796601 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -25,6 +25,7 @@ #include "qemu/notify.h" #include "qom/object.h" #include "qemu/rcu.h" +#include "hw/qdev-core.h" =20 #define RAM_ADDR_INVALID (~(ram_addr_t)0) =20 @@ -38,6 +39,12 @@ #define TYPE_IOMMU_MEMORY_REGION "qemu:iommu-memory-region" #define IOMMU_MEMORY_REGION(obj) \ OBJECT_CHECK(IOMMUMemoryRegion, (obj), TYPE_IOMMU_MEMORY_REGION) +#define IOMMU_MEMORY_REGION_CLASS(klass) \ + OBJECT_CLASS_CHECK(IOMMUMemoryRegionClass, (klass), \ + TYPE_IOMMU_MEMORY_REGION) +#define IOMMU_MEMORY_REGION_GET_CLASS(obj) \ + OBJECT_GET_CLASS(IOMMUMemoryRegionClass, (obj), \ + TYPE_IOMMU_MEMORY_REGION) =20 typedef struct MemoryRegionOps MemoryRegionOps; typedef struct MemoryRegionMmio MemoryRegionMmio; @@ -193,9 +200,10 @@ struct MemoryRegionOps { const MemoryRegionMmio old_mmio; }; =20 -typedef struct MemoryRegionIOMMUOps MemoryRegionIOMMUOps; +typedef struct IOMMUMemoryRegionClass { + /* private */ + struct DeviceClass parent_class; =20 -struct MemoryRegionIOMMUOps { /* * Return a TLB entry that contains a given address. Flag should * be the access permission of this translation operation. We can @@ -212,7 +220,7 @@ struct MemoryRegionIOMMUOps { IOMMUNotifierFlag new_flags); /* Set this up to provide customized IOMMU replay function */ void (*replay)(IOMMUMemoryRegion *iommu, IOMMUNotifier *notifier); -}; +} IOMMUMemoryRegionClass; =20 typedef struct CoalescedMemoryRange CoalescedMemoryRange; typedef struct MemoryRegionIoeventfd MemoryRegionIoeventfd; @@ -261,7 +269,6 @@ struct MemoryRegion { struct IOMMUMemoryRegion { MemoryRegion parent_obj; =20 - const MemoryRegionIOMMUOps *iommu_ops; QLIST_HEAD(, IOMMUNotifier) iommu_notify; IOMMUNotifierFlag iommu_notify_flags; }; @@ -622,21 +629,24 @@ static inline void memory_region_init_reservation(Mem= oryRegion *mr, } =20 /** - * memory_region_init_iommu: Initialize a memory region that translates - * addresses + * memory_region_init_iommu: Initialize a memory region of a custom type + * that translates addresses * * An IOMMU region translates addresses and forwards accesses to a target * memory region. * - * @iommu_mr: the #IOMMUMemoryRegion to be initialized + * @typename: QOM class name + * @_iommu_mr: the #IOMMUMemoryRegion to be initialized + * @instance_size: the IOMMUMemoryRegion subclass instance size * @owner: the object that tracks the region's reference count * @ops: a function that translates addresses into the @target region * @name: used for debugging; not visible to the user or ABI * @size: size of the region. */ -void memory_region_init_iommu(IOMMUMemoryRegion *iommu_mr, - struct Object *owner, - const MemoryRegionIOMMUOps *ops, +void memory_region_init_iommu(void *_iommu_mr, + size_t instance_size, + const char *mrtypename, + Object *owner, const char *name, uint64_t size); =20 @@ -707,6 +717,21 @@ static inline IOMMUMemoryRegion *memory_region_get_iom= mu(MemoryRegion *mr) return NULL; } =20 +/** + * memory_region_get_iommu_class_nocheck: returns iommu memory region class + * if an iommu or NULL if not + * + * Returns pointer to IOMMUMemoryRegioniClass if a memory region is an iom= mu, + * otherwise NULL. This is fast path avoinding QOM checking, use with caut= ion. + * + * @mr: the memory region being queried + */ +static inline IOMMUMemoryRegionClass *memory_region_get_iommu_class_nochec= k( + IOMMUMemoryRegion *iommu_mr) +{ + return (IOMMUMemoryRegionClass *) (((Object *)iommu_mr)->class); +} + #define memory_region_is_iommu(mr) (memory_region_get_iommu(mr) !=3D NULL) =20 /** diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h index 45fba4f..08d8a26 100644 --- a/include/hw/i386/intel_iommu.h +++ b/include/hw/i386/intel_iommu.h @@ -32,6 +32,8 @@ #define INTEL_IOMMU_DEVICE(obj) \ OBJECT_CHECK(IntelIOMMUState, (obj), TYPE_INTEL_IOMMU_DEVICE) =20 +#define TYPE_INTEL_IOMMU_MEMORY_REGION "intel-iommu-iommu-memory-region" + /* DMAR Hardware Unit Definition address (IOMMU unit) */ #define Q35_HOST_BRIDGE_IOMMU_ADDR 0xfed90000ULL =20 @@ -289,7 +291,6 @@ struct IntelIOMMUState { uint32_t context_cache_gen; /* Should be in [1,MAX] */ GHashTable *iotlb; /* IOTLB */ =20 - MemoryRegionIOMMUOps iommu_ops; GHashTable *vtd_as_by_busptr; /* VTDBus objects indexed by PCIBus* r= eference */ VTDBus *vtd_as_by_bus_num[VTD_PCI_BUS_MAX]; /* VTDBus objects indexed = by bus number */ /* list of registered notifiers */ diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index b353dff..5f708ee 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -582,6 +582,10 @@ typedef struct sPAPRTCETable sPAPRTCETable; #define SPAPR_TCE_TABLE(obj) \ OBJECT_CHECK(sPAPRTCETable, (obj), TYPE_SPAPR_TCE_TABLE) =20 +#define TYPE_SPAPR_IOMMU_MEMORY_REGION "spapr-iommu-memory-region" +#define SPAPR_IOMMU_MEMORY_REGION(obj) \ + OBJECT_CHECK(IOMMUMemoryRegion, (obj), TYPE_SPAPR_IOMMU_MEMORY_REG= ION) + struct sPAPRTCETable { DeviceState parent; uint32_t liobn; diff --git a/memory.c b/memory.c index 45e10e2..69f697c 100644 --- a/memory.c +++ b/memory.c @@ -1506,19 +1506,20 @@ void memory_region_init_rom_device(MemoryRegion *mr, mr->ram_block =3D qemu_ram_alloc(size, mr, errp); } =20 -void memory_region_init_iommu(IOMMUMemoryRegion *iommu_mr, +void memory_region_init_iommu(void *_iommu_mr, + size_t instance_size, + const char *mrtypename, Object *owner, - const MemoryRegionIOMMUOps *ops, const char *name, uint64_t size) { + struct IOMMUMemoryRegion *iommu_mr; struct MemoryRegion *mr; =20 - object_initialize(iommu_mr, sizeof(*iommu_mr), TYPE_IOMMU_MEMORY_REGIO= N); - mr =3D MEMORY_REGION(iommu_mr); + object_initialize(_iommu_mr, instance_size, mrtypename); + mr =3D MEMORY_REGION(_iommu_mr); memory_region_do_init(mr, owner, name, size); iommu_mr =3D IOMMU_MEMORY_REGION(mr); - iommu_mr->iommu_ops =3D ops, mr->terminates =3D true; /* then re-forwards */ QLIST_INIT(&iommu_mr->iommu_notify); iommu_mr->iommu_notify_flags =3D IOMMU_NOTIFIER_NONE; @@ -1620,16 +1621,16 @@ static void memory_region_update_iommu_notify_flags= (IOMMUMemoryRegion *iommu_mr) { IOMMUNotifierFlag flags =3D IOMMU_NOTIFIER_NONE; IOMMUNotifier *iommu_notifier; + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_GET_CLASS(iommu_m= r); =20 IOMMU_NOTIFIER_FOREACH(iommu_notifier, iommu_mr) { flags |=3D iommu_notifier->notifier_flags; } =20 - if (flags !=3D iommu_mr->iommu_notify_flags && - iommu_mr->iommu_ops->notify_flag_changed) { - iommu_mr->iommu_ops->notify_flag_changed(iommu_mr, - iommu_mr->iommu_notify_fla= gs, - flags); + if (flags !=3D iommu_mr->iommu_notify_flags && imrc->notify_flag_chang= ed) { + imrc->notify_flag_changed(iommu_mr, + iommu_mr->iommu_notify_flags, + flags); } =20 iommu_mr->iommu_notify_flags =3D flags; @@ -1655,8 +1656,10 @@ void memory_region_register_iommu_notifier(MemoryReg= ion *mr, =20 uint64_t memory_region_iommu_get_min_page_size(IOMMUMemoryRegion *iommu_mr) { - if (iommu_mr->iommu_ops && iommu_mr->iommu_ops->get_min_page_size) { - return iommu_mr->iommu_ops->get_min_page_size(iommu_mr); + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_GET_CLASS(iommu_m= r); + + if (imrc->get_min_page_size) { + return imrc->get_min_page_size(iommu_mr); } return TARGET_PAGE_SIZE; } @@ -1664,19 +1667,20 @@ uint64_t memory_region_iommu_get_min_page_size(IOMM= UMemoryRegion *iommu_mr) void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier= *n) { MemoryRegion *mr =3D MEMORY_REGION(iommu_mr); + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_GET_CLASS(iommu_m= r); hwaddr addr, granularity; IOMMUTLBEntry iotlb; =20 /* If the IOMMU has its own replay callback, override */ - if (iommu_mr->iommu_ops->replay) { - iommu_mr->iommu_ops->replay(iommu_mr, n); + if (imrc->replay) { + imrc->replay(iommu_mr, n); return; } =20 granularity =3D memory_region_iommu_get_min_page_size(iommu_mr); =20 for (addr =3D 0; addr < memory_region_size(mr); addr +=3D granularity)= { - iotlb =3D iommu_mr->iommu_ops->translate(iommu_mr, addr, IOMMU_NON= E); + iotlb =3D imrc->translate(iommu_mr, addr, IOMMU_NONE); if (iotlb.perm !=3D IOMMU_NONE) { n->notify(n, &iotlb); } @@ -2855,8 +2859,10 @@ static const TypeInfo memory_region_info =3D { static const TypeInfo iommu_memory_region_info =3D { .parent =3D TYPE_MEMORY_REGION, .name =3D TYPE_IOMMU_MEMORY_REGION, + .class_size =3D sizeof(IOMMUMemoryRegionClass), .instance_size =3D sizeof(IOMMUMemoryRegion), .instance_init =3D iommu_memory_region_initfn, + .abstract =3D true, }; =20 static void memory_register_types(void) --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957216759111.48893328105987; Thu, 13 Jul 2017 07:46:56 -0700 (PDT) Received: from localhost ([::1]:60462 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfOG-0004l7-3i for importer@patchew.org; Thu, 13 Jul 2017 10:46:52 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51883) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4c-00023L-6d for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4Y-0004Ou-3t for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:34 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:36042) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4X-0004OP-Q2 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:30 -0400 Received: by mail-wm0-f66.google.com with SMTP id y5so5447375wmh.3 for ; Thu, 13 Jul 2017 07:26:29 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=IsAraw053T4x2DBHhLiM65BKnj8Pc0NKS0x9glIkqI4=; b=orw9rKCXhYh3Itj0grPDdqwBqOzGlK4B/lNanhHYepJT62kGVWKkY7jRZgLZ24Co4b aTSO/q6MOjsIQs3MZPIeCyCHguTd2EYM8E6Z8wCTBZMZMq/BRJw1Oq1QTnGZM3gyU6zt T/dk+1Yaq/736MvkFDFLUfCkllH9xXFHu5IwsD5hWVX7HztLksObp1c3yHVx7F+oYmKi 60TPK2U/AltZRj6KTJHjFS6rTCz+TgomG4ECXEoI9Of+vSXt9abtJfQHvhu+KRxc0zGh r6mqxZmNjxk5GttzQSQ0QMFPpll/kW98HHHZkUZeDxU8i0DnhDog9KqfowZOuSS0ER+h BlTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=IsAraw053T4x2DBHhLiM65BKnj8Pc0NKS0x9glIkqI4=; b=oqZGZ4lG9RQNuzuqh2eMsVXtBuyjXye42tZKKzdURRN351MvDH1QQJ9mmiZ+auAuwp o3vonAcYbVrTyYT2n5WwMbpuFWEK/3oRiZa1TBpSvgkkmNtgtyXHj7qDMiQQyOeShe2F Ol4qBFIWc+dLSdvOZXy2QRbNjzcEjsuEsZpTSZQogYfpbR1I14DUPu9VLSbqwyb5Xlt/ Gth4KJ0gmSaVHnUxtPkqb0/56cDAozLj5ZBd81N9LaCalYhKC6BexcHgA1nMuiRhkS89 nZ8SJGeA9LWMfh4+q+OnKAxq2U3rQh2BUZaxpY39UjaqVnmsx43YQu+U2ULXkloPLpSt NlJQ== X-Gm-Message-State: AIVw1126IaqLbqhLCh9TvmZGCMl1SCMzoBW6Ch0Hvg7ydWAzdW6o2WfY lNDVmOsN9dcRdRYD7fY= X-Received: by 10.28.20.67 with SMTP id 64mr2342602wmu.60.1499955927031; Thu, 13 Jul 2017 07:25:27 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:24 +0200 Message-Id: <1499955874-10954-32-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 74.125.82.66 Subject: [Qemu-devel] [PULL 31/41] nbd: Create struct for tracking export info 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake The NBD Protocol is introducing some additional information about exports, such as minimum request size and alignment, as well as an advertised maximum request size. It will be easier to feed this information back to the block layer if we gather all the information into a struct, rather than adding yet more pointer parameters during negotiation. Signed-off-by: Eric Blake Message-Id: <20170707203049.534-2-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- block/nbd-client.c | 18 ++++++++---------- block/nbd-client.h | 3 +-- block/nbd.c | 2 +- include/block/nbd.h | 15 +++++++++++---- nbd/client.c | 44 ++++++++++++++++++++++---------------------- qemu-nbd.c | 10 ++++------ 6 files changed, 47 insertions(+), 45 deletions(-) diff --git a/block/nbd-client.c b/block/nbd-client.c index 208f907..aab1e32 100644 --- a/block/nbd-client.c +++ b/block/nbd-client.c @@ -242,7 +242,7 @@ int nbd_client_co_pwritev(BlockDriverState *bs, uint64_= t offset, ssize_t ret; =20 if (flags & BDRV_REQ_FUA) { - assert(client->nbdflags & NBD_FLAG_SEND_FUA); + assert(client->info.flags & NBD_FLAG_SEND_FUA); request.flags |=3D NBD_CMD_FLAG_FUA; } =20 @@ -270,12 +270,12 @@ int nbd_client_co_pwrite_zeroes(BlockDriverState *bs,= int64_t offset, }; NBDReply reply; =20 - if (!(client->nbdflags & NBD_FLAG_SEND_WRITE_ZEROES)) { + if (!(client->info.flags & NBD_FLAG_SEND_WRITE_ZEROES)) { return -ENOTSUP; } =20 if (flags & BDRV_REQ_FUA) { - assert(client->nbdflags & NBD_FLAG_SEND_FUA); + assert(client->info.flags & NBD_FLAG_SEND_FUA); request.flags |=3D NBD_CMD_FLAG_FUA; } if (!(flags & BDRV_REQ_MAY_UNMAP)) { @@ -299,7 +299,7 @@ int nbd_client_co_flush(BlockDriverState *bs) NBDReply reply; ssize_t ret; =20 - if (!(client->nbdflags & NBD_FLAG_SEND_FLUSH)) { + if (!(client->info.flags & NBD_FLAG_SEND_FLUSH)) { return 0; } =20 @@ -327,7 +327,7 @@ int nbd_client_co_pdiscard(BlockDriverState *bs, int64_= t offset, int bytes) NBDReply reply; ssize_t ret; =20 - if (!(client->nbdflags & NBD_FLAG_SEND_TRIM)) { + if (!(client->info.flags & NBD_FLAG_SEND_TRIM)) { return 0; } =20 @@ -385,19 +385,17 @@ int nbd_client_init(BlockDriverState *bs, qio_channel_set_blocking(QIO_CHANNEL(sioc), true, NULL); =20 ret =3D nbd_receive_negotiate(QIO_CHANNEL(sioc), export, - &client->nbdflags, tlscreds, hostname, - &client->ioc, - &client->size, errp); + &client->ioc, &client->info, errp); if (ret < 0) { logout("Failed to negotiate with the NBD server\n"); return ret; } - if (client->nbdflags & NBD_FLAG_SEND_FUA) { + if (client->info.flags & NBD_FLAG_SEND_FUA) { bs->supported_write_flags =3D BDRV_REQ_FUA; bs->supported_zero_flags |=3D BDRV_REQ_FUA; } - if (client->nbdflags & NBD_FLAG_SEND_WRITE_ZEROES) { + if (client->info.flags & NBD_FLAG_SEND_WRITE_ZEROES) { bs->supported_zero_flags |=3D BDRV_REQ_MAY_UNMAP; } =20 diff --git a/block/nbd-client.h b/block/nbd-client.h index 49636bc..df80771 100644 --- a/block/nbd-client.h +++ b/block/nbd-client.h @@ -20,8 +20,7 @@ typedef struct NBDClientSession { QIOChannelSocket *sioc; /* The master data channel */ QIOChannel *ioc; /* The current I/O channel which may differ (eg TLS) = */ - uint16_t nbdflags; - off_t size; + NBDExportInfo info; =20 CoMutex send_mutex; CoQueue free_sema; diff --git a/block/nbd.c b/block/nbd.c index d529305..4a9048c 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -492,7 +492,7 @@ static int64_t nbd_getlength(BlockDriverState *bs) { BDRVNBDState *s =3D bs->opaque; =20 - return s->client.size; + return s->client.info.size; } =20 static void nbd_detach_aio_context(BlockDriverState *bs) diff --git a/include/block/nbd.h b/include/block/nbd.h index 6d75d5a..9092374 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -123,13 +123,20 @@ enum { * aren't overflowing some other buffer. */ #define NBD_MAX_NAME_SIZE 256 =20 +/* Details collected by NBD_OPT_EXPORT_NAME and NBD_OPT_GO */ +struct NBDExportInfo { + uint64_t size; + uint16_t flags; +}; +typedef struct NBDExportInfo NBDExportInfo; + ssize_t nbd_rwv(QIOChannel *ioc, struct iovec *iov, size_t niov, size_t le= ngth, bool do_read, Error **errp); -int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *fla= gs, +int nbd_receive_negotiate(QIOChannel *ioc, const char *name, QCryptoTLSCreds *tlscreds, const char *hostname, - QIOChannel **outioc, - off_t *size, Error **errp); -int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size, + QIOChannel **outioc, NBDExportInfo *info, + Error **errp); +int nbd_init(int fd, QIOChannelSocket *sioc, NBDExportInfo *info, Error **errp); ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest *request); ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply, Error **errp); diff --git a/nbd/client.c b/nbd/client.c index 9c52b9b..1250273 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -425,13 +425,13 @@ static QIOChannel *nbd_receive_starttls(QIOChannel *i= oc, } =20 =20 -int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *fla= gs, +int nbd_receive_negotiate(QIOChannel *ioc, const char *name, QCryptoTLSCreds *tlscreds, const char *hostname, - QIOChannel **outioc, - off_t *size, Error **errp) + QIOChannel **outioc, NBDExportInfo *info, + Error **errp) { char buf[256]; - uint64_t magic, s; + uint64_t magic; int rc; bool zeroes =3D true; =20 @@ -532,17 +532,17 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char= *name, uint16_t *flags, } =20 /* Read the response */ - if (nbd_read(ioc, &s, sizeof(s), errp) < 0) { + if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) { error_prepend(errp, "Failed to read export length"); goto fail; } - *size =3D be64_to_cpu(s); + be64_to_cpus(&info->size); =20 - if (nbd_read(ioc, flags, sizeof(*flags), errp) < 0) { + if (nbd_read(ioc, &info->flags, sizeof(info->flags), errp) < 0) { error_prepend(errp, "Failed to read export flags"); goto fail; } - be16_to_cpus(flags); + be16_to_cpus(&info->flags); } else if (magic =3D=3D NBD_CLIENT_MAGIC) { uint32_t oldflags; =20 @@ -555,11 +555,11 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char= *name, uint16_t *flags, goto fail; } =20 - if (nbd_read(ioc, &s, sizeof(s), errp) < 0) { + if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) { error_prepend(errp, "Failed to read export length"); goto fail; } - *size =3D be64_to_cpu(s); + be64_to_cpus(&info->size); =20 if (nbd_read(ioc, &oldflags, sizeof(oldflags), errp) < 0) { error_prepend(errp, "Failed to read export flags"); @@ -570,13 +570,13 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char= *name, uint16_t *flags, error_setg(errp, "Unexpected export flags %0x" PRIx32, oldflag= s); goto fail; } - *flags =3D oldflags; + info->flags =3D oldflags; } else { error_setg(errp, "Bad magic received"); goto fail; } =20 - trace_nbd_receive_negotiate_size_flags(*size, *flags); + trace_nbd_receive_negotiate_size_flags(info->size, info->flags); if (zeroes && nbd_drop(ioc, 124, errp) < 0) { error_prepend(errp, "Failed to read reserved block"); goto fail; @@ -588,13 +588,13 @@ fail: } =20 #ifdef __linux__ -int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size, +int nbd_init(int fd, QIOChannelSocket *sioc, NBDExportInfo *info, Error **errp) { - unsigned long sectors =3D size / BDRV_SECTOR_SIZE; - if (size / BDRV_SECTOR_SIZE !=3D sectors) { - error_setg(errp, "Export size %lld too large for 32-bit kernel", - (long long) size); + unsigned long sectors =3D info->size / BDRV_SECTOR_SIZE; + if (info->size / BDRV_SECTOR_SIZE !=3D sectors) { + error_setg(errp, "Export size %" PRIu64 " too large for 32-bit ker= nel", + info->size); return -E2BIG; } =20 @@ -615,8 +615,8 @@ int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t f= lags, off_t size, } =20 trace_nbd_init_set_size(sectors); - if (size % BDRV_SECTOR_SIZE) { - trace_nbd_init_trailing_bytes(size % BDRV_SECTOR_SIZE); + if (info->size % BDRV_SECTOR_SIZE) { + trace_nbd_init_trailing_bytes(info->size % BDRV_SECTOR_SIZE); } =20 if (ioctl(fd, NBD_SET_SIZE_BLOCKS, sectors) < 0) { @@ -625,9 +625,9 @@ int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t f= lags, off_t size, return -serrno; } =20 - if (ioctl(fd, NBD_SET_FLAGS, (unsigned long) flags) < 0) { + if (ioctl(fd, NBD_SET_FLAGS, (unsigned long) info->flags) < 0) { if (errno =3D=3D ENOTTY) { - int read_only =3D (flags & NBD_FLAG_READ_ONLY) !=3D 0; + int read_only =3D (info->flags & NBD_FLAG_READ_ONLY) !=3D 0; trace_nbd_init_set_readonly(); =20 if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) { @@ -685,7 +685,7 @@ int nbd_disconnect(int fd) } =20 #else -int nbd_init(int fd, QIOChannelSocket *ioc, uint16_t flags, off_t size, +int nbd_init(int fd, QIOChannelSocket *ioc, NBDExportInfo *info, Error **errp) { error_setg(errp, "nbd_init is only supported on Linux"); diff --git a/qemu-nbd.c b/qemu-nbd.c index 4dd3fd4..c8bd47f 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -255,8 +255,7 @@ static void *show_parts(void *arg) static void *nbd_client_thread(void *arg) { char *device =3D arg; - off_t size; - uint16_t nbdflags; + NBDExportInfo info; QIOChannelSocket *sioc; int fd; int ret; @@ -271,9 +270,8 @@ static void *nbd_client_thread(void *arg) goto out; } =20 - ret =3D nbd_receive_negotiate(QIO_CHANNEL(sioc), NULL, &nbdflags, - NULL, NULL, NULL, - &size, &local_error); + ret =3D nbd_receive_negotiate(QIO_CHANNEL(sioc), NULL, + NULL, NULL, NULL, &info, &local_error); if (ret < 0) { if (local_error) { error_report_err(local_error); @@ -288,7 +286,7 @@ static void *nbd_client_thread(void *arg) goto out_socket; } =20 - ret =3D nbd_init(fd, sioc, nbdflags, size, &local_error); + ret =3D nbd_init(fd, sioc, &info, &local_error); if (ret < 0) { error_report_err(local_error); goto out_fd; --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957350502535.5655013588863; Thu, 13 Jul 2017 07:49:10 -0700 (PDT) Received: from localhost ([::1]:60473 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfQQ-0006oR-76 for importer@patchew.org; Thu, 13 Jul 2017 10:49:06 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51907) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4e-00025V-BG for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4a-0004Q4-8y for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:36 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:34861) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4a-0004Pg-1c for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:32 -0400 Received: by mail-wr0-f194.google.com with SMTP id y28so4892105wrd.2 for ; Thu, 13 Jul 2017 07:26:31 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=E78CqE7L5NGGWGyI0zBEc07d2C0Ja+NGdwmRn8n6j44=; b=tEsrt89L6e2B8HagW+uQ5B9TvNZc7iRyHFlxr6Qn2HGixsCBMvb5WgYATB9mrTgJsG 0krIWmEliLAs4SVut963Q+HxAjuQdHmXYHgu4aVKSRjgiVt0qyo1CkWqWvZWzTgJxYhE EuqaYFL5ckskVGmWiFe8SHERrjdDBZZVuDA5xqo8eHvsncqbZ0d15ib4VBJTOW4pkp2l gAj2fUR7Vyvv5fRi/sSPvPfeRKJCKIhORJyuY7KOoWIYeU7uyF0lnciL95CcAiIlIWK2 hDpVd8AdFN2EAJMRhq6qG/Nif0N2MFWYHGCCpIDzXIgQGonNbwwebGWsPZbFdodcrnT0 D/BA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=E78CqE7L5NGGWGyI0zBEc07d2C0Ja+NGdwmRn8n6j44=; b=DGJkUYszJGTVj7qDbidK00bbJW0tdw3koMsohV01+961EXf8dsbw/4uOzX1HK62nca UD7bspXtg9bTS2diYUPjIqLKqVfofcgcFDFYnH5TBFvSX5Zx6aybiSonD2zY6Nxr8WD7 emSwVjEfn8IwFL2VwIEhSCiBViGmAEqrnEs9zamjBvjDLa9DpQHf8SCLf7MvL88OAOHi ffdfphnOPZD57pkYn7op8m9aZNTIXtC4IdHGSqPnV2toyyVReCz22QSemCq59O7zrf9Y T5A0FVcjXxuANsRPkAyrt+MrXoq2yn+Y//Di+LHNPyfT1KrSGKPz7yzFlAKTAa0h/4U0 fpLg== X-Gm-Message-State: AIVw110wRKDocNjYdLRcvzpGC/fM4Q7rCZQNzI5wEMmLvRGASz4Bo1Ax n3OU4M7uzvpRxXxqR1I= X-Received: by 10.223.148.37 with SMTP id 34mr1726438wrq.137.1499955929634; Thu, 13 Jul 2017 07:25:29 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:25 +0200 Message-Id: <1499955874-10954-33-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.194 Subject: [Qemu-devel] [PULL 32/41] nbd: Don't bother tracing an NBD_OPT_ABORT response failure 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake We really don't care if our spec-compliant reply to NBD_OPT_ABORT was received, so shave off some lines of code by not even tracing it. Signed-off-by: Eric Blake Message-Id: <20170707203049.534-3-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- nbd/server.c | 15 ++++----------- nbd/trace-events | 1 - 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index 9b0c588..e15385b 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -376,7 +376,6 @@ static int nbd_negotiate_options(NBDClient *client, Err= or **errp) { uint32_t flags; bool fixedNewstyle =3D false; - Error *local_err =3D NULL; =20 /* Client sends: [ 0 .. 3] client flags @@ -479,7 +478,9 @@ static int nbd_negotiate_options(NBDClient *client, Err= or **errp) if (ret < 0) { return ret; } - /* Let the client keep trying, unless they asked to quit */ + /* Let the client keep trying, unless they asked to + * quit. In this mode, we've already sent an error, so + * we can't ack the abort. */ if (option =3D=3D NBD_OPT_ABORT) { return 1; } @@ -498,15 +499,7 @@ static int nbd_negotiate_options(NBDClient *client, Er= ror **errp) /* NBD spec says we must try to reply before * disconnecting, but that we must also tolerate * guests that don't wait for our reply. */ - nbd_negotiate_send_rep(client->ioc, NBD_REP_ACK, option, - &local_err); - - if (local_err !=3D NULL) { - const char *error =3D error_get_pretty(local_err); - trace_nbd_opt_abort_reply_failed(error); - error_free(local_err); - } - + nbd_negotiate_send_rep(client->ioc, NBD_REP_ACK, option, N= ULL); return 1; =20 case NBD_OPT_EXPORT_NAME: diff --git a/nbd/trace-events b/nbd/trace-events index 4b233b8..c6f898e 100644 --- a/nbd/trace-events +++ b/nbd/trace-events @@ -40,7 +40,6 @@ nbd_negotiate_options_newstyle(void) "Client supports fix= ed newstyle handshake" nbd_negotiate_options_no_zeroes(void) "Client supports no zeroes at handsh= ake end" nbd_negotiate_options_check_magic(uint64_t magic) "Checking opts magic 0x%= " PRIx64 nbd_negotiate_options_check_option(uint32_t option) "Checking option 0x%" = PRIx32 -nbd_opt_abort_reply_failed(const char *error) "Reply to NBD_OPT_ABORT requ= est failed: %s" nbd_negotiate_begin(void) "Beginning negotiation" nbd_negotiate_old_style(uint64_t size, unsigned flags) "advertising size %= " PRIu64 " and flags %x" nbd_negotiate_new_style_size_flags(uint64_t size, unsigned flags) "adverti= sing size %" PRIu64 " and flags %x" --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957506544131.4627254419264; Thu, 13 Jul 2017 07:51:46 -0700 (PDT) Received: from localhost ([::1]:60486 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfSv-0000jQ-3M for importer@patchew.org; Thu, 13 Jul 2017 10:51:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51929) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4g-000280-SQ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4c-0004R0-Oq for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:38 -0400 Received: from mail-wr0-f181.google.com ([209.85.128.181]:33427) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4c-0004QV-E0 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:34 -0400 Received: by mail-wr0-f181.google.com with SMTP id r103so54033249wrb.0 for ; Thu, 13 Jul 2017 07:26:34 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=CXBYLCBJVqBPv5dqrg3wn4h9lSY9rMsj87wrvjvNPm4=; b=uzh2ZnSoim+2FO0M77Jh52aHGtojSgdiyR15wuKGEEIWn0eoUldGDrr/vnI5H5khRj 7t+g82tv8JfAyrtwsm5vVAf8VJvUuTDx5F8r4zQLpGZRC891LsLBtxwNvzRccmJIR4+3 /NqdpOhyb6Dem6TVbJAdaXLGXGc0sT2md5+zHi8Bw8l5UQ4tQLnxiWHpHdibE0BhVY80 tRMHjizNyhu01B+ijZj+P6BpREbdECqnv0f+qIMUAnxNEHy2zBqNW9FWYJwcH/f6MRsl gW/vPJjCJLLhzkGeVHATd4OVx/By9fygd4BnTDwID0a53F8fVZPnvvk72BSE9rHb5MST EWpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=CXBYLCBJVqBPv5dqrg3wn4h9lSY9rMsj87wrvjvNPm4=; b=qHvCpInePst9ZDhcprPsEm2PJ9FcejdrjiDIdcg95scKNkd9PDdvFqvHAzW6wmBEoW Vj7w7sX8TWemYXoWrrCNHEci6FYKRohRlZyKqjGvh9mW7N8YagYotvD3FZfCy0b7/DpC /bsaHktsIUkxf9a8ktNwhRXQJ1eAmA7OlPCtQTCiSmA3jNU4CMIMOOVv6zOs/dGN1Ofj xeL7/lUDokVA0NuKOnPrm+3Nl7/bM7pHTHhB7WZGcBX22gWqGyqLYR8hAzKU/o3PD26L Z2WUACEORZXfxCm5ejRLRPQRvXgIZL+kmelj/BiZxwB1P+LdRSQB+x0FrMn7/DYuj6zU E71Q== X-Gm-Message-State: AIVw110kkO1ooRlJij5l6inRage+8d2mHXz+y1KBMoS5yKEvykxPeNCO Z0hx6chTgsrMaDN/psc= X-Received: by 10.223.160.68 with SMTP id l4mr1702515wrl.90.1499955932444; Thu, 13 Jul 2017 07:25:32 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:26 +0200 Message-Id: <1499955874-10954-34-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.181 Subject: [Qemu-devel] [PULL 33/41] nbd: Expose and debug more NBD constants 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake The NBD protocol has several constants defined in various extensions that we are about to implement. Expose them to the code, along with an easy way to map various constants to strings during diagnostic messages. Signed-off-by: Eric Blake Message-Id: <20170707203049.534-4-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- include/block/nbd.h | 37 +++++++++++++++------ nbd/client.c | 52 +++++++++++++++++++----------- nbd/common.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++ nbd/nbd-internal.h | 10 +++--- nbd/server.c | 18 +++++++---- nbd/trace-events | 12 +++---- 6 files changed, 175 insertions(+), 46 deletions(-) diff --git a/include/block/nbd.h b/include/block/nbd.h index 9092374..4a22eca 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Red Hat, Inc. + * Copyright (C) 2016-2017 Red Hat, Inc. * Copyright (C) 2005 Anthony Liguori * * Network Block Device @@ -83,18 +83,37 @@ typedef struct NBDReply NBDReply; #define NBD_FLAG_C_FIXED_NEWSTYLE (1 << 0) /* Fixed newstyle protocol. */ #define NBD_FLAG_C_NO_ZEROES (1 << 1) /* End handshake without zeroes= . */ =20 -/* Reply types. */ +/* Option requests. */ +#define NBD_OPT_EXPORT_NAME (1) +#define NBD_OPT_ABORT (2) +#define NBD_OPT_LIST (3) +/* #define NBD_OPT_PEEK_EXPORT (4) not in use */ +#define NBD_OPT_STARTTLS (5) +#define NBD_OPT_INFO (6) +#define NBD_OPT_GO (7) +#define NBD_OPT_STRUCTURED_REPLY (8) + +/* Option reply types. */ #define NBD_REP_ERR(value) ((UINT32_C(1) << 31) | (value)) =20 #define NBD_REP_ACK (1) /* Data sending finished. = */ #define NBD_REP_SERVER (2) /* Export description. */ - -#define NBD_REP_ERR_UNSUP NBD_REP_ERR(1) /* Unknown option */ -#define NBD_REP_ERR_POLICY NBD_REP_ERR(2) /* Server denied */ -#define NBD_REP_ERR_INVALID NBD_REP_ERR(3) /* Invalid length */ -#define NBD_REP_ERR_PLATFORM NBD_REP_ERR(4) /* Not compiled in */ -#define NBD_REP_ERR_TLS_REQD NBD_REP_ERR(5) /* TLS required */ -#define NBD_REP_ERR_SHUTDOWN NBD_REP_ERR(7) /* Server shutting down */ +#define NBD_REP_INFO (3) /* NBD_OPT_INFO/GO. */ + +#define NBD_REP_ERR_UNSUP NBD_REP_ERR(1) /* Unknown option */ +#define NBD_REP_ERR_POLICY NBD_REP_ERR(2) /* Server denied */ +#define NBD_REP_ERR_INVALID NBD_REP_ERR(3) /* Invalid length */ +#define NBD_REP_ERR_PLATFORM NBD_REP_ERR(4) /* Not compiled in */ +#define NBD_REP_ERR_TLS_REQD NBD_REP_ERR(5) /* TLS required */ +#define NBD_REP_ERR_UNKNOWN NBD_REP_ERR(6) /* Export unknown */ +#define NBD_REP_ERR_SHUTDOWN NBD_REP_ERR(7) /* Server shutting dow= n */ +#define NBD_REP_ERR_BLOCK_SIZE_REQD NBD_REP_ERR(8) /* Need INFO_BLOCK_SIZ= E */ + +/* Info types, used during NBD_REP_INFO */ +#define NBD_INFO_EXPORT 0 +#define NBD_INFO_NAME 1 +#define NBD_INFO_DESCRIPTION 2 +#define NBD_INFO_BLOCK_SIZE 3 =20 /* Request flags, sent from client to server during transmission phase */ #define NBD_CMD_FLAG_FUA (1 << 0) /* 'force unit access' during wri= te */ diff --git a/nbd/client.c b/nbd/client.c index 1250273..a443e51 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Red Hat, Inc. + * Copyright (C) 2016-2017 Red Hat, Inc. * Copyright (C) 2005 Anthony Liguori * * Network Block Device Client Side @@ -104,7 +104,7 @@ static int nbd_send_option_request(QIOChannel *ioc, uin= t32_t opt, if (len =3D=3D -1) { req.length =3D len =3D strlen(data); } - trace_nbd_send_option_request(opt, len); + trace_nbd_send_option_request(opt, nbd_opt_lookup(opt), len); =20 stq_be_p(&req.magic, NBD_OPTS_MAGIC); stl_be_p(&req.option, opt); @@ -154,7 +154,9 @@ static int nbd_receive_option_reply(QIOChannel *ioc, ui= nt32_t opt, be32_to_cpus(&reply->type); be32_to_cpus(&reply->length); =20 - trace_nbd_receive_option_reply(reply->option, reply->type, reply->leng= th); + trace_nbd_receive_option_reply(reply->option, nbd_opt_lookup(reply->op= tion), + reply->type, nbd_rep_lookup(reply->type= ), + reply->length); =20 if (reply->magic !=3D NBD_REP_MAGIC) { error_setg(errp, "Unexpected option reply magic"); @@ -188,12 +190,16 @@ static int nbd_handle_reply_err(QIOChannel *ioc, nbd_= opt_reply *reply, =20 if (reply->length) { if (reply->length > NBD_MAX_BUFFER_SIZE) { - error_setg(errp, "server's error message is too long"); + error_setg(errp, "server error 0x%" PRIx32 + " (%s) message is too long", + reply->type, nbd_rep_lookup(reply->type)); goto cleanup; } msg =3D g_malloc(reply->length + 1); if (nbd_read(ioc, msg, reply->length, errp) < 0) { - error_prepend(errp, "failed to read option error message"); + error_prepend(errp, "failed to read option error 0x%" PRIx32 + " (%s) message", + reply->type, nbd_rep_lookup(reply->type)); goto cleanup; } msg[reply->length] =3D '\0'; @@ -201,38 +207,48 @@ static int nbd_handle_reply_err(QIOChannel *ioc, nbd_= opt_reply *reply, =20 switch (reply->type) { case NBD_REP_ERR_UNSUP: - trace_nbd_reply_err_unsup(reply->option); + trace_nbd_reply_err_unsup(reply->option, nbd_opt_lookup(reply->opt= ion)); result =3D 0; goto cleanup; =20 case NBD_REP_ERR_POLICY: - error_setg(errp, "Denied by server for option %" PRIx32, - reply->option); + error_setg(errp, "Denied by server for option %" PRIx32 " (%s)", + reply->option, nbd_opt_lookup(reply->option)); break; =20 case NBD_REP_ERR_INVALID: - error_setg(errp, "Invalid data length for option %" PRIx32, - reply->option); + error_setg(errp, "Invalid data length for option %" PRIx32 " (%s)", + reply->option, nbd_opt_lookup(reply->option)); break; =20 case NBD_REP_ERR_PLATFORM: - error_setg(errp, "Server lacks support for option %" PRIx32, - reply->option); + error_setg(errp, "Server lacks support for option %" PRIx32 " (%s)= ", + reply->option, nbd_opt_lookup(reply->option)); break; =20 case NBD_REP_ERR_TLS_REQD: - error_setg(errp, "TLS negotiation required before option %" PRIx32, - reply->option); + error_setg(errp, "TLS negotiation required before option %" PRIx32 + " (%s)", reply->option, nbd_opt_lookup(reply->option)); + break; + + case NBD_REP_ERR_UNKNOWN: + error_setg(errp, "Requested export not available for option %" PRI= x32 + " (%s)", reply->option, nbd_opt_lookup(reply->option)); break; =20 case NBD_REP_ERR_SHUTDOWN: - error_setg(errp, "Server shutting down before option %" PRIx32, - reply->option); + error_setg(errp, "Server shutting down before option %" PRIx32 " (= %s)", + reply->option, nbd_opt_lookup(reply->option)); + break; + + case NBD_REP_ERR_BLOCK_SIZE_REQD: + error_setg(errp, "Server requires INFO_BLOCK_SIZE for option %" PR= Ix32 + " (%s)", reply->option, nbd_opt_lookup(reply->option)); break; =20 default: - error_setg(errp, "Unknown error code when asking for option %" PRI= x32, - reply->option); + error_setg(errp, "Unknown error code when asking for option %" PRI= x32 + " (%s)", reply->option, nbd_opt_lookup(reply->option)); break; } =20 diff --git a/nbd/common.c b/nbd/common.c index 4dab41e..a2f28f2 100644 --- a/nbd/common.c +++ b/nbd/common.c @@ -101,3 +101,95 @@ void nbd_tls_handshake(QIOTask *task, data->complete =3D true; g_main_loop_quit(data->loop); } + + +const char *nbd_opt_lookup(uint32_t opt) +{ + switch (opt) { + case NBD_OPT_EXPORT_NAME: + return "export name"; + case NBD_OPT_ABORT: + return "abort"; + case NBD_OPT_LIST: + return "list"; + case NBD_OPT_STARTTLS: + return "starttls"; + case NBD_OPT_INFO: + return "info"; + case NBD_OPT_GO: + return "go"; + case NBD_OPT_STRUCTURED_REPLY: + return "structured reply"; + default: + return ""; + } +} + + +const char *nbd_rep_lookup(uint32_t rep) +{ + switch (rep) { + case NBD_REP_ACK: + return "ack"; + case NBD_REP_SERVER: + return "server"; + case NBD_REP_INFO: + return "info"; + case NBD_REP_ERR_UNSUP: + return "unsupported"; + case NBD_REP_ERR_POLICY: + return "denied by policy"; + case NBD_REP_ERR_INVALID: + return "invalid"; + case NBD_REP_ERR_PLATFORM: + return "platform lacks support"; + case NBD_REP_ERR_TLS_REQD: + return "TLS required"; + case NBD_REP_ERR_UNKNOWN: + return "export unknown"; + case NBD_REP_ERR_SHUTDOWN: + return "server shutting down"; + case NBD_REP_ERR_BLOCK_SIZE_REQD: + return "block size required"; + default: + return ""; + } +} + + +const char *nbd_info_lookup(uint16_t info) +{ + switch (info) { + case NBD_INFO_EXPORT: + return "export"; + case NBD_INFO_NAME: + return "name"; + case NBD_INFO_DESCRIPTION: + return "description"; + case NBD_INFO_BLOCK_SIZE: + return "block size"; + default: + return ""; + } +} + + +const char *nbd_cmd_lookup(uint16_t cmd) +{ + switch (cmd) { + case NBD_CMD_READ: + return "read"; + case NBD_CMD_WRITE: + return "write"; + case NBD_CMD_DISC: + return "discard"; + case NBD_CMD_FLUSH: + return "flush"; + case NBD_CMD_TRIM: + return "trim"; + case NBD_CMD_WRITE_ZEROES: + return "write zeroes"; + default: + return ""; + } +} diff --git a/nbd/nbd-internal.h b/nbd/nbd-internal.h index cf6ecbf..bf95601 100644 --- a/nbd/nbd-internal.h +++ b/nbd/nbd-internal.h @@ -57,12 +57,6 @@ #define NBD_SET_TIMEOUT _IO(0xab, 9) #define NBD_SET_FLAGS _IO(0xab, 10) =20 -#define NBD_OPT_EXPORT_NAME (1) -#define NBD_OPT_ABORT (2) -#define NBD_OPT_LIST (3) -#define NBD_OPT_PEEK_EXPORT (4) -#define NBD_OPT_STARTTLS (5) - /* NBD errors are based on errno numbers, so there is a 1:1 mapping, * but only a limited set of errno values is specified in the protocol. * Everything else is squashed to EINVAL. @@ -133,6 +127,10 @@ struct NBDTLSHandshakeData { =20 void nbd_tls_handshake(QIOTask *task, void *opaque); +const char *nbd_opt_lookup(uint32_t opt); +const char *nbd_rep_lookup(uint32_t rep); +const char *nbd_info_lookup(uint16_t info); +const char *nbd_cmd_lookup(uint16_t info); =20 int nbd_drop(QIOChannel *ioc, size_t size, Error **errp); =20 diff --git a/nbd/server.c b/nbd/server.c index e15385b..27a0aab 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Red Hat, Inc. + * Copyright (C) 2016-2017 Red Hat, Inc. * Copyright (C) 2005 Anthony Liguori * * Network Block Device Server Side @@ -139,7 +139,8 @@ static int nbd_negotiate_send_rep_len(QIOChannel *ioc, = uint32_t type, { uint64_t magic; =20 - trace_nbd_negotiate_send_rep_len(opt, type, len); + trace_nbd_negotiate_send_rep_len(opt, nbd_opt_lookup(opt), + type, nbd_rep_lookup(type), len); =20 magic =3D cpu_to_be64(NBD_REP_MAGIC); if (nbd_write(ioc, &magic, sizeof(magic), errp) < 0) { @@ -441,7 +442,8 @@ static int nbd_negotiate_options(NBDClient *client, Err= or **errp) } length =3D be32_to_cpu(length); =20 - trace_nbd_negotiate_options_check_option(option); + trace_nbd_negotiate_options_check_option(option, + nbd_opt_lookup(option)); if (client->tlscreds && client->ioc =3D=3D (QIOChannel *)client->sioc) { QIOChannel *tioc; @@ -532,8 +534,8 @@ static int nbd_negotiate_options(NBDClient *client, Err= or **errp) NBD_REP_ERR_UNSUP, option, errp, "Unsupported option 0x%" - PRIx32, - option); + PRIx32 " (%s)", option, + nbd_opt_lookup(option)); if (ret < 0) { return ret; } @@ -549,7 +551,8 @@ static int nbd_negotiate_options(NBDClient *client, Err= or **errp) return nbd_negotiate_handle_export_name(client, length, er= rp); =20 default: - error_setg(errp, "Unsupported option 0x%" PRIx32, option); + error_setg(errp, "Unsupported option 0x%" PRIx32 " (%s)", + option, nbd_opt_lookup(option)); return -EINVAL; } } @@ -1033,7 +1036,8 @@ static int nbd_co_receive_request(NBDRequestData *req= , NBDRequest *request, return -EIO; } =20 - trace_nbd_co_receive_request_decode_type(request->handle, request->typ= e); + trace_nbd_co_receive_request_decode_type(request->handle, request->typ= e, + nbd_cmd_lookup(request->type)= ); =20 if (request->type !=3D NBD_CMD_WRITE) { /* No payload, we are ready to read the next request. */ diff --git a/nbd/trace-events b/nbd/trace-events index c6f898e..5e2f961 100644 --- a/nbd/trace-events +++ b/nbd/trace-events @@ -1,8 +1,8 @@ # nbd/client.c nbd_unknown_error(int err) "Squashing unexpected error %d to EINVAL" -nbd_send_option_request(uint32_t opt, uint32_t len) "Sending option reques= t %" PRIu32", len %" PRIu32 -nbd_receive_option_reply(uint32_t option, uint32_t type, uint32_t length) = "Received option reply %" PRIx32", type %" PRIx32", len %" PRIu32 -nbd_reply_err_unsup(uint32_t option) "server doesn't understand request %"= PRIx32 ", attempting fallback" +nbd_send_option_request(uint32_t opt, const char *name, uint32_t len) "Sen= ding option request %" PRIu32" (%s), len %" PRIu32 +nbd_receive_option_reply(uint32_t option, const char *optname, uint32_t ty= pe, const char *typename, uint32_t length) "Received option reply %" PRIx32= " (%s), type %" PRIx32" (%s), len %" PRIu32 +nbd_reply_err_unsup(uint32_t option, const char *name) "server doesn't und= erstand request %" PRIx32 " (%s), attempting fallback" nbd_receive_query_exports_start(const char *wantname) "Querying export lis= t for '%s'" nbd_receive_query_exports_success(const char *wantname) "Found desired exp= ort name '%s'" nbd_receive_starttls_request(void) "Requesting TLS from server" @@ -28,7 +28,7 @@ nbd_send_request(uint64_t from, uint32_t len, uint64_t ha= ndle, uint16_t flags, u nbd_receive_reply(uint32_t magic, int32_t error, uint64_t handle) "Got rep= ly: { magic =3D 0x%" PRIx32 ", .error =3D % " PRId32 ", handle =3D %" PRIu6= 4" }" =20 # nbd/server.c -nbd_negotiate_send_rep_len(uint32_t opt, uint32_t type, uint32_t len) "Rep= ly opt=3D%" PRIx32 " type=3D%" PRIx32 " len=3D%" PRIu32 +nbd_negotiate_send_rep_len(uint32_t opt, const char *optname, uint32_t typ= e, const char *typename, uint32_t len) "Reply opt=3D%" PRIx32 " (%s), type= =3D%" PRIx32 " (%s), len=3D%" PRIu32 nbd_negotiate_send_rep_err(const char *msg) "sending error message \"%s\"" nbd_negotiate_send_rep_list(const char *name, const char *desc) "Advertisi= ng export name '%s' description '%s'" nbd_negotiate_handle_export_name(void) "Checking length" @@ -39,7 +39,7 @@ nbd_negotiate_options_flags(void) "Checking client flags" nbd_negotiate_options_newstyle(void) "Client supports fixed newstyle hands= hake" nbd_negotiate_options_no_zeroes(void) "Client supports no zeroes at handsh= ake end" nbd_negotiate_options_check_magic(uint64_t magic) "Checking opts magic 0x%= " PRIx64 -nbd_negotiate_options_check_option(uint32_t option) "Checking option 0x%" = PRIx32 +nbd_negotiate_options_check_option(uint32_t option, const char *name) "Che= cking option 0x%" PRIx32 " (%s)" nbd_negotiate_begin(void) "Beginning negotiation" nbd_negotiate_old_style(uint64_t size, unsigned flags) "advertising size %= " PRIu64 " and flags %x" nbd_negotiate_new_style_size_flags(uint64_t size, unsigned flags) "adverti= sing size %" PRIu64 " and flags %x" @@ -49,7 +49,7 @@ nbd_send_reply(int32_t error, uint64_t handle) "Sending r= esponse to client: { .e nbd_blk_aio_attached(const char *name, void *ctx) "Export %s: Attaching cl= ients to AIO context %p\n" nbd_blk_aio_detach(const char *name, void *ctx) "Export %s: Detaching clie= nts from AIO context %p\n" nbd_co_send_reply(uint64_t handle, uint32_t error, int len) "Send reply: h= andle =3D %" PRIu64 ", error =3D %" PRIu32 ", len =3D %d" -nbd_co_receive_request_decode_type(uint64_t handle, uint16_t type) "Decodi= ng type: handle =3D %" PRIu64 ", type =3D %" PRIu16 +nbd_co_receive_request_decode_type(uint64_t handle, uint16_t type, const c= har *name) "Decoding type: handle =3D %" PRIu64 ", type =3D %" PRIu16 " (%s= )" nbd_co_receive_request_payload_received(uint64_t handle, uint32_t len) "Pa= yload received: handle =3D %" PRIu64 ", len =3D %" PRIu32 nbd_co_receive_request_cmd_write(uint32_t len) "Reading %" PRIu32 " byte(s= )" nbd_trip(void) "Reading request" --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957209545944.4284089382488; Thu, 13 Jul 2017 07:46:49 -0700 (PDT) Received: from localhost ([::1]:60461 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfOB-0004iE-4D for importer@patchew.org; Thu, 13 Jul 2017 10:46:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51457) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3g-0001Ev-Ka for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3f-0002gV-F2 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:36 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:36527) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3f-0002et-8j for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:35 -0400 Received: by mail-wm0-x244.google.com with SMTP id y5so5447973wmh.3 for ; Thu, 13 Jul 2017 07:25:35 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=ROpYbrYbWuRQD/9VG2hiw6xBGJ+TPhuui2kbrVihR7s=; b=JzGTwr0p8caEwevuG63Aa1tDIMoPhvWWN9Gl0wYv+AvoeNW6plzD2JfBj+wqcmrKLp ImKluVak74ehkaLTxGz+CqIE6YrNh61UlyUuYYmtDrs5eJaKAl9hnVCkcZ4vpw90l9/R Tlg7G1C7n29ohZ4w7T+6CrykcY/+KynFQKItc3W5qZwDGTBsofw50926Xl+mOLnITP5o qV8VSyV/tFVl/zpLiJ5yMBxEVyYTjp5R35p/8ITPWmhlvSoWKx8BVgjeAdmrzhWag7L+ +XBbBIMARwZ/Df6XoLOQcyelFjpLuvEwfAmmb2rY78rX5Xx7WdIAEC3aOC0k2egaXeoI lljA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=ROpYbrYbWuRQD/9VG2hiw6xBGJ+TPhuui2kbrVihR7s=; b=HoEnh2X1br+fl8y4HGVmOA714fsIVh9NPtGL10s2NgoSeNNhlx4ccmZL77jQqbxZ52 7ruT2KZU6eBuj9XitFajAfk3l80dPCl3fKAFYcuAutMtc6xniyojJZRmPE1Ihsn7lmC6 YcMRZpl1WwzGSfI6w0mS3fizN3SEPYxgydqSrWPWDwK4Rhzhu0Y1hBs0nU1+sEMH7HDa xUP8pfi9t3DGjnsaDVB4tIiHjQtDfdrban417PicSu9XNFnEyr0/7yNJpHkwpaPTOhr9 oglrjloC5noPIr8MSfluqfHgmDzupNuugdYJgiBKzlgNqvaQjpROLTiHHs/CnjUOC7jt QxPQ== X-Gm-Message-State: AIVw110NTp6mU8rzUvANwpFX6A5/2hCY8qhD64MDmp3EoNrsayKR0PLG R+CC5yH9O3RSoIMUpFw= X-Received: by 10.28.168.21 with SMTP id r21mr2319084wme.80.1499955934131; Thu, 13 Jul 2017 07:25:34 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:27 +0200 Message-Id: <1499955874-10954-35-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PULL 34/41] nbd: Simplify trace of client flags in negotiation 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake Simplify the tracing of client flags in the server, and return -EINVAL instead of -EIO if we successfully read but don't like those flags. Signed-off-by: Eric Blake Message-Id: <20170707203049.534-5-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- nbd/server.c | 6 ++---- nbd/trace-events | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index 27a0aab..8e363d3 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -396,21 +396,19 @@ static int nbd_negotiate_options(NBDClient *client, E= rror **errp) error_prepend(errp, "read failed: "); return -EIO; } - trace_nbd_negotiate_options_flags(); be32_to_cpus(&flags); + trace_nbd_negotiate_options_flags(flags); if (flags & NBD_FLAG_C_FIXED_NEWSTYLE) { - trace_nbd_negotiate_options_newstyle(); fixedNewstyle =3D true; flags &=3D ~NBD_FLAG_C_FIXED_NEWSTYLE; } if (flags & NBD_FLAG_C_NO_ZEROES) { - trace_nbd_negotiate_options_no_zeroes(); client->no_zeroes =3D true; flags &=3D ~NBD_FLAG_C_NO_ZEROES; } if (flags !=3D 0) { error_setg(errp, "Unknown client flags 0x%" PRIx32 " received", fl= ags); - return -EIO; + return -EINVAL; } =20 while (1) { diff --git a/nbd/trace-events b/nbd/trace-events index 5e2f961..8db0500 100644 --- a/nbd/trace-events +++ b/nbd/trace-events @@ -35,9 +35,7 @@ nbd_negotiate_handle_export_name(void) "Checking length" nbd_negotiate_handle_export_name_request(const char *name) "Client request= ed export '%s'" nbd_negotiate_handle_starttls(void) "Setting up TLS" nbd_negotiate_handle_starttls_handshake(void) "Starting TLS handshake" -nbd_negotiate_options_flags(void) "Checking client flags" -nbd_negotiate_options_newstyle(void) "Client supports fixed newstyle hands= hake" -nbd_negotiate_options_no_zeroes(void) "Client supports no zeroes at handsh= ake end" +nbd_negotiate_options_flags(uint32_t flags) "Received client flags 0x%" PR= Ix32 nbd_negotiate_options_check_magic(uint64_t magic) "Checking opts magic 0x%= " PRIx64 nbd_negotiate_options_check_option(uint32_t option, const char *name) "Che= cking option 0x%" PRIx32 " (%s)" nbd_negotiate_begin(void) "Beginning negotiation" --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149995645294944.120857158870535; Thu, 13 Jul 2017 07:34:12 -0700 (PDT) Received: from localhost ([::1]:60399 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfBr-0000EP-P9 for importer@patchew.org; Thu, 13 Jul 2017 10:34:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51494) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3j-0001HF-0y for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3h-0002nY-Pr for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:38 -0400 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]:34428) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3h-0002jD-EO for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:37 -0400 Received: by mail-wr0-x243.google.com with SMTP id k67so9398830wrc.1 for ; Thu, 13 Jul 2017 07:25:37 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Arr7rWvb25cWSWTWna6AZCBAs7q+VcvLukElKDuR06c=; b=qw+9YEQ3tb1dGzwr5eL9G48LbKrybkIUDshu41w3BvdwIJphUzwZIgIaz0ZMRmstSW eY73jIUm4lROvQGel7TOgl/wKLSVp0MGnlCXHrasTIJvoNMG9RkioC+Tkaql52AzaY3z k8ow89oLChXeQouS9UZVk4HSXDpde3IzVfoVT2TszoBDXucI1ZSRH1yTxpeJaNBglU4D 8Stp/Wb44GsVt6HTV7a/BxMD8/TNGztbUNuXqs0XqeSYoFZJRUaio0dlH2F1AXPHdTS3 MHXNPPyFL7PXZvmLYu1UyFIJ94goezkU72TKuA8EDkzs4Ofm1vddwsXlhetfqhluanzh sKKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Arr7rWvb25cWSWTWna6AZCBAs7q+VcvLukElKDuR06c=; b=gWInEt8BrZ5DXFQ2Q2KO/P67sO1sV45PO3vXldqpcCnj9bLmgnfbkTU15fEORSZij2 MRRZXZEhNAZtqJar2s/PPsmpSTkiHl+tgRib/Dff4oFeuVDg1jthyHuUcjd2LxxkgA11 v1nT+tLmPp/8lp4stMzqjB9fz5ZUTgZUlkan7dH+j1LKoHjhwqYTOM0L3slZAmkh/XZH 3YGtP13mrQro1ZFXfmhQzzTlCG/y690qOatAWooQfcmAcEl+nRBYIbJxqGYjEQOSJYz9 nFVHwd1A4qB7XST4SnNToxsRbvpkIKRAvI5B4mdkzu5bTP79LrW7E02qHUZKG4xjqwCL gkPg== X-Gm-Message-State: AIVw113nxmhwdU39HKT6v5grCuBNRzYlSCq5gDkskeZRiWP0Gk+W/a8c Gyged4y/Q9ZVxqr8ocI= X-Received: by 10.223.177.129 with SMTP id q1mr1874546wra.82.1499955935991; Thu, 13 Jul 2017 07:25:35 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:28 +0200 Message-Id: <1499955874-10954-36-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::243 Subject: [Qemu-devel] [PULL 35/41] nbd: Refactor reply to NBD_OPT_EXPORT_NAME 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake Reply directly in nbd_negotiate_handle_export_name(), rather than waiting until nbd_negotiate_options() completes. This will make it easier to implement NBD_OPT_GO. Pass additional parameters around, rather than stashing things inside NBDClient. Signed-off-by: Eric Blake Message-Id: <20170707203049.534-6-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- nbd/server.c | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index 8e363d3..841986d 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -84,7 +84,6 @@ struct NBDClient { int refcount; void (*close_fn)(NBDClient *client, bool negotiated); =20 - bool no_zeroes; NBDExport *exp; QCryptoTLSCreds *tlscreds; char *tlsaclname; @@ -277,9 +276,13 @@ static int nbd_negotiate_handle_list(NBDClient *client= , uint32_t length, } =20 static int nbd_negotiate_handle_export_name(NBDClient *client, uint32_t le= ngth, + uint16_t myflags, bool no_zero= es, Error **errp) { char name[NBD_MAX_NAME_SIZE + 1]; + char buf[8 + 4 + 124] =3D ""; + size_t len; + int ret; =20 /* Client sends: [20 .. xx] export name (length bytes) @@ -303,6 +306,17 @@ static int nbd_negotiate_handle_export_name(NBDClient = *client, uint32_t length, return -EINVAL; } =20 + trace_nbd_negotiate_new_style_size_flags(client->exp->size, + client->exp->nbdflags | myfla= gs); + stq_be_p(buf, client->exp->size); + stw_be_p(buf + 8, client->exp->nbdflags | myflags); + len =3D no_zeroes ? 10 : sizeof(buf); + ret =3D nbd_write(client->ioc, buf, len, errp); + if (ret < 0) { + error_prepend(errp, "write failed: "); + return ret; + } + QTAILQ_INSERT_TAIL(&client->exp->clients, client, next); nbd_export_get(client->exp); =20 @@ -373,14 +387,17 @@ static QIOChannel *nbd_negotiate_handle_starttls(NBDC= lient *client, * 1 if client sent NBD_OPT_ABORT, i.e. on valid disconnect, * errp is not set */ -static int nbd_negotiate_options(NBDClient *client, Error **errp) +static int nbd_negotiate_options(NBDClient *client, uint16_t myflags, + Error **errp) { uint32_t flags; bool fixedNewstyle =3D false; + bool no_zeroes =3D false; =20 /* Client sends: [ 0 .. 3] client flags =20 + Then we loop until NBD_OPT_EXPORT_NAME: [ 0 .. 7] NBD_OPTS_MAGIC [ 8 .. 11] NBD option [12 .. 15] Data length @@ -403,7 +420,7 @@ static int nbd_negotiate_options(NBDClient *client, Err= or **errp) flags &=3D ~NBD_FLAG_C_FIXED_NEWSTYLE; } if (flags & NBD_FLAG_C_NO_ZEROES) { - client->no_zeroes =3D true; + no_zeroes =3D true; flags &=3D ~NBD_FLAG_C_NO_ZEROES; } if (flags !=3D 0) { @@ -503,7 +520,9 @@ static int nbd_negotiate_options(NBDClient *client, Err= or **errp) return 1; =20 case NBD_OPT_EXPORT_NAME: - return nbd_negotiate_handle_export_name(client, length, er= rp); + return nbd_negotiate_handle_export_name(client, length, + myflags, no_zeroes, + errp); =20 case NBD_OPT_STARTTLS: if (nbd_drop(client->ioc, length, errp) < 0) { @@ -546,7 +565,9 @@ static int nbd_negotiate_options(NBDClient *client, Err= or **errp) */ switch (option) { case NBD_OPT_EXPORT_NAME: - return nbd_negotiate_handle_export_name(client, length, er= rp); + return nbd_negotiate_handle_export_name(client, length, + myflags, no_zeroes, + errp); =20 default: error_setg(errp, "Unsupported option 0x%" PRIx32 " (%s)", @@ -572,7 +593,6 @@ static coroutine_fn int nbd_negotiate(NBDClient *client= , Error **errp) NBD_FLAG_SEND_FLUSH | NBD_FLAG_SEND_FUA | NBD_FLAG_SEND_WRITE_ZEROES); bool oldStyle; - size_t len; =20 /* Old style negotiation header without options [ 0 .. 7] passwd ("NBDMAGIC") @@ -586,10 +606,7 @@ static coroutine_fn int nbd_negotiate(NBDClient *clien= t, Error **errp) [ 0 .. 7] passwd ("NBDMAGIC") [ 8 .. 15] magic (NBD_OPTS_MAGIC) [16 .. 17] server flags (0) - ....options sent.... - [18 .. 25] size - [26 .. 27] export flags - [28 .. 151] reserved (0, omit if no_zeroes) + ....options sent, ending in NBD_OPT_EXPORT_NAME.... */ =20 qio_channel_set_blocking(client->ioc, false, NULL); @@ -618,24 +635,13 @@ static coroutine_fn int nbd_negotiate(NBDClient *clie= nt, Error **errp) error_prepend(errp, "write failed: "); return -EINVAL; } - ret =3D nbd_negotiate_options(client, errp); + ret =3D nbd_negotiate_options(client, myflags, errp); if (ret !=3D 0) { if (ret < 0) { error_prepend(errp, "option negotiation failed: "); } return ret; } - - trace_nbd_negotiate_new_style_size_flags( - client->exp->size, client->exp->nbdflags | myflags); - stq_be_p(buf + 18, client->exp->size); - stw_be_p(buf + 26, client->exp->nbdflags | myflags); - len =3D client->no_zeroes ? 10 : sizeof(buf) - 18; - ret =3D nbd_write(client->ioc, buf + 18, len, errp); - if (ret < 0) { - error_prepend(errp, "write failed: "); - return ret; - } } =20 trace_nbd_negotiate_success(); --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957282931669.4791943752693; Thu, 13 Jul 2017 07:48:02 -0700 (PDT) Received: from localhost ([::1]:60467 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfPK-0005eI-H3 for importer@patchew.org; Thu, 13 Jul 2017 10:47:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51531) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3n-0001Km-7Z for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3j-0002qH-4P for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:43 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:34932) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3i-0002o8-JI for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:39 -0400 Received: by mail-wm0-x241.google.com with SMTP id u23so5459540wma.2 for ; Thu, 13 Jul 2017 07:25:38 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=B8rYFVBgkNDL3inFPZBa37F9HmdSCUShPO7v3VDHqx4=; b=OEfRQwR+8OH627e/jNtUHmx9sNrPROQsvWxhs8D7Tq1zwidN+5a/CLfrtEf42EqE6j hrzSZMkTREOzaFW/2kAQS14/fBnkIAou8036BL/L/GSHeFvrmQPMvskj6w7aNA9d0pPD pQPVBWIgvaiTy+XoRRboX0EEFK3HHBCdkulCH79cAoMR7KE7juFyu/4PKScC9rj5H13y FlEWAwaK6ktfjHqbH7pfIYVE2dhhzb544HGYgZM1Tjkr57/SrTCTbhQ+BLGH/nczrt5I L0WHkld3iGn2jhsbr8oqE1Lf5xgkxvU0coPlpcqirwHksL4CDYX/VNEqVyhzZ5gQ+ZzQ 51KQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=B8rYFVBgkNDL3inFPZBa37F9HmdSCUShPO7v3VDHqx4=; b=t8zWc+G7ELcQW+ZH6vOxr71qR1QDxC4BfjUhd8w0MINqfJTaYEsONRhISPfK9oXGwU fA5DXAwAV3yfU6JSNAb5YkP7izahFYS/wOiNdXoMEPeVYaKNzBEq+lgPl/MAdDsY1KhV +D/N0yV/ueGbKF8kcT2qP4RLy6R7h+XOz6Qe9aKB50IxEuQP1W2BYeMvDyXE0ckEZThd FqzQAjZRULDS8gafgvlgf6smCKzt+GICAj15TftcRFf0eq4kxt8u6carR+eBnk7LWIbn 72Hf+pgJj6LmjSrAvhGM8em6+6rrvtno1QEjoqcGajX5WNcSA6ht6VDYboSG6ZECBv81 HGew== X-Gm-Message-State: AIVw1126qRIyGflGq17iyFiuuzJDlR+zJxQ8Gv4VkNERUkuYBxBBL85B U7NaPQ6F5oRWko4cSdc= X-Received: by 10.28.113.21 with SMTP id m21mr2286272wmc.80.1499955937239; Thu, 13 Jul 2017 07:25:37 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:29 +0200 Message-Id: <1499955874-10954-37-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PULL 36/41] nbd: Implement NBD_OPT_GO on server 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake NBD_OPT_EXPORT_NAME is lousy: per the NBD protocol, any failure requires us to close the connection rather than report an error. Therefore, upstream NBD recently added NBD_OPT_GO as the improved version of the option that does what we want [1], along with NBD_OPT_INFO that returns the same information but does not transition to transmission phase. [1] https://github.com/NetworkBlockDevice/nbd/blob/extension-info/doc/proto= .md This is a first cut at the information types, and only passes the same information already available through NBD_OPT_LIST and NBD_OPT_EXPORT_NAME; items like NBD_INFO_BLOCK_SIZE (and thus any use of NBD_REP_ERR_BLOCK_SIZE_REQD) are intentionally left for later patches. Signed-off-by: Eric Blake Message-Id: <20170707203049.534-7-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- nbd/server.c | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++= +++- nbd/trace-events | 3 + 2 files changed, 179 insertions(+), 3 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index 841986d..e84d012 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -141,6 +141,7 @@ static int nbd_negotiate_send_rep_len(QIOChannel *ioc, = uint32_t type, trace_nbd_negotiate_send_rep_len(opt, nbd_opt_lookup(opt), type, nbd_rep_lookup(type), len); =20 + assert(len < NBD_MAX_BUFFER_SIZE); magic =3D cpu_to_be64(NBD_REP_MAGIC); if (nbd_write(ioc, &magic, sizeof(magic), errp) < 0) { error_prepend(errp, "write failed (rep magic): "); @@ -275,6 +276,8 @@ static int nbd_negotiate_handle_list(NBDClient *client,= uint32_t length, return nbd_negotiate_send_rep(client->ioc, NBD_REP_ACK, NBD_OPT_LIST, = errp); } =20 +/* Send a reply to NBD_OPT_EXPORT_NAME. + * Return -errno on error, 0 on success. */ static int nbd_negotiate_handle_export_name(NBDClient *client, uint32_t le= ngth, uint16_t myflags, bool no_zero= es, Error **errp) @@ -323,6 +326,162 @@ static int nbd_negotiate_handle_export_name(NBDClient= *client, uint32_t length, return 0; } =20 +/* Send a single NBD_REP_INFO, with a buffer @buf of @length bytes. + * The buffer does NOT include the info type prefix. + * Return -errno on error, 0 if ready to send more. */ +static int nbd_negotiate_send_info(NBDClient *client, uint32_t opt, + uint16_t info, uint32_t length, void *b= uf, + Error **errp) +{ + int rc; + + trace_nbd_negotiate_send_info(info, nbd_info_lookup(info), length); + rc =3D nbd_negotiate_send_rep_len(client->ioc, NBD_REP_INFO, opt, + sizeof(info) + length, errp); + if (rc < 0) { + return rc; + } + cpu_to_be16s(&info); + if (nbd_write(client->ioc, &info, sizeof(info), errp) < 0) { + return -EIO; + } + if (nbd_write(client->ioc, buf, length, errp) < 0) { + return -EIO; + } + return 0; +} + +/* Handle NBD_OPT_INFO and NBD_OPT_GO. + * Return -errno on error, 0 if ready for next option, and 1 to move + * into transmission phase. */ +static int nbd_negotiate_handle_info(NBDClient *client, uint32_t length, + uint32_t opt, uint16_t myflags, + Error **errp) +{ + int rc; + char name[NBD_MAX_NAME_SIZE + 1]; + NBDExport *exp; + uint16_t requests; + uint16_t request; + uint32_t namelen; + bool sendname =3D false; + char buf[sizeof(uint64_t) + sizeof(uint16_t)]; + const char *msg; + + /* Client sends: + 4 bytes: L, name length (can be 0) + L bytes: export name + 2 bytes: N, number of requests (can be 0) + N * 2 bytes: N requests + */ + if (length < sizeof(namelen) + sizeof(requests)) { + msg =3D "overall request too short"; + goto invalid; + } + if (nbd_read(client->ioc, &namelen, sizeof(namelen), errp) < 0) { + return -EIO; + } + be32_to_cpus(&namelen); + length -=3D sizeof(namelen); + if (namelen > length - sizeof(requests) || (length - namelen) % 2) { + msg =3D "name length is incorrect"; + goto invalid; + } + if (nbd_read(client->ioc, name, namelen, errp) < 0) { + return -EIO; + } + name[namelen] =3D '\0'; + length -=3D namelen; + trace_nbd_negotiate_handle_export_name_request(name); + + if (nbd_read(client->ioc, &requests, sizeof(requests), errp) < 0) { + return -EIO; + } + be16_to_cpus(&requests); + length -=3D sizeof(requests); + trace_nbd_negotiate_handle_info_requests(requests); + if (requests !=3D length / sizeof(request)) { + msg =3D "incorrect number of requests for overall length"; + goto invalid; + } + while (requests--) { + if (nbd_read(client->ioc, &request, sizeof(request), errp) < 0) { + return -EIO; + } + be16_to_cpus(&request); + length -=3D sizeof(request); + trace_nbd_negotiate_handle_info_request(request, + nbd_info_lookup(request)); + /* For now, we only care about NBD_INFO_NAME; everything else + * is either a request we don't know or something we send + * regardless of request. */ + if (request =3D=3D NBD_INFO_NAME) { + sendname =3D true; + } + } + + exp =3D nbd_export_find(name); + if (!exp) { + return nbd_negotiate_send_rep_err(client->ioc, NBD_REP_ERR_UNKNOWN, + opt, errp, "export '%s' not pres= ent", + name); + } + + /* Don't bother sending NBD_INFO_NAME unless client requested it */ + if (sendname) { + rc =3D nbd_negotiate_send_info(client, opt, NBD_INFO_NAME, length,= name, + errp); + if (rc < 0) { + return rc; + } + } + + /* Send NBD_INFO_DESCRIPTION only if available, regardless of + * client request */ + if (exp->description) { + size_t len =3D strlen(exp->description); + + rc =3D nbd_negotiate_send_info(client, opt, NBD_INFO_DESCRIPTION, + len, exp->description, errp); + if (rc < 0) { + return rc; + } + } + + /* Send NBD_INFO_EXPORT always */ + trace_nbd_negotiate_new_style_size_flags(exp->size, + exp->nbdflags | myflags); + stq_be_p(buf, exp->size); + stw_be_p(buf + 8, exp->nbdflags | myflags); + rc =3D nbd_negotiate_send_info(client, opt, NBD_INFO_EXPORT, + sizeof(buf), buf, errp); + if (rc < 0) { + return rc; + } + + /* Final reply */ + rc =3D nbd_negotiate_send_rep(client->ioc, NBD_REP_ACK, opt, errp); + if (rc < 0) { + return rc; + } + + if (opt =3D=3D NBD_OPT_GO) { + client->exp =3D exp; + QTAILQ_INSERT_TAIL(&client->exp->clients, client, next); + nbd_export_get(client->exp); + rc =3D 1; + } + return rc; + + invalid: + if (nbd_drop(client->ioc, length, errp) < 0) { + return -EIO; + } + return nbd_negotiate_send_rep_err(client->ioc, NBD_REP_ERR_INVALID, op= t, + errp, "%s", msg); +} + + /* Handle NBD_OPT_STARTTLS. Return NULL to drop connection, or else the * new channel for all further (now-encrypted) communication. */ static QIOChannel *nbd_negotiate_handle_starttls(NBDClient *client, @@ -380,7 +539,8 @@ static QIOChannel *nbd_negotiate_handle_starttls(NBDCli= ent *client, } =20 /* nbd_negotiate_options - * Process all NBD_OPT_* client option commands. + * Process all NBD_OPT_* client option commands, during fixed newstyle + * negotiation. * Return: * -errno on error, errp is set * 0 on successful negotiation, errp is not set @@ -397,7 +557,7 @@ static int nbd_negotiate_options(NBDClient *client, uin= t16_t myflags, /* Client sends: [ 0 .. 3] client flags =20 - Then we loop until NBD_OPT_EXPORT_NAME: + Then we loop until NBD_OPT_EXPORT_NAME or NBD_OPT_GO: [ 0 .. 7] NBD_OPTS_MAGIC [ 8 .. 11] NBD option [12 .. 15] Data length @@ -524,6 +684,19 @@ static int nbd_negotiate_options(NBDClient *client, ui= nt16_t myflags, myflags, no_zeroes, errp); =20 + case NBD_OPT_INFO: + case NBD_OPT_GO: + ret =3D nbd_negotiate_handle_info(client, length, option, + myflags, errp); + if (ret =3D=3D 1) { + assert(option =3D=3D NBD_OPT_GO); + return 0; + } + if (ret) { + return ret; + } + break; + case NBD_OPT_STARTTLS: if (nbd_drop(client->ioc, length, errp) < 0) { return -EIO; @@ -606,7 +779,7 @@ static coroutine_fn int nbd_negotiate(NBDClient *client= , Error **errp) [ 0 .. 7] passwd ("NBDMAGIC") [ 8 .. 15] magic (NBD_OPTS_MAGIC) [16 .. 17] server flags (0) - ....options sent, ending in NBD_OPT_EXPORT_NAME.... + ....options sent, ending in NBD_OPT_EXPORT_NAME or NBD_OPT_GO.... */ =20 qio_channel_set_blocking(client->ioc, false, NULL); diff --git a/nbd/trace-events b/nbd/trace-events index 8db0500..5230c61 100644 --- a/nbd/trace-events +++ b/nbd/trace-events @@ -33,6 +33,9 @@ nbd_negotiate_send_rep_err(const char *msg) "sending erro= r message \"%s\"" nbd_negotiate_send_rep_list(const char *name, const char *desc) "Advertisi= ng export name '%s' description '%s'" nbd_negotiate_handle_export_name(void) "Checking length" nbd_negotiate_handle_export_name_request(const char *name) "Client request= ed export '%s'" +nbd_negotiate_send_info(int info, const char *name, uint32_t length) "Send= ing NBD_REP_INFO type %d (%s) with remaining length %" PRIu32 +nbd_negotiate_handle_info_requests(int requests) "Client requested %d item= s of info" +nbd_negotiate_handle_info_request(int request, const char *name) "Client r= equested info %d (%s)" nbd_negotiate_handle_starttls(void) "Setting up TLS" nbd_negotiate_handle_starttls_handshake(void) "Starting TLS handshake" nbd_negotiate_options_flags(uint32_t flags) "Received client flags 0x%" PR= Ix32 --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957505215518.5826383276825; Thu, 13 Jul 2017 07:51:45 -0700 (PDT) Received: from localhost ([::1]:60487 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfSw-0000nO-Tc for importer@patchew.org; Thu, 13 Jul 2017 10:51:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52011) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4m-0002Do-IV for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4i-0004TR-8K for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:44 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34875) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4h-0004Si-UA for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:40 -0400 Received: by mail-wm0-f66.google.com with SMTP id u23so5459639wma.2 for ; Thu, 13 Jul 2017 07:26:39 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=eb9l4nPdUGbu9rMUus7IH35zyAQerh+4W6S8DjLLr2g=; b=EF+BpqYjMpJkYmaOBspqZGrq8qi27H3IXchN8KZHTvukKhV/h0CXVpRypAxOYlfu2I /UpJyYWiyMnOrNFt4DHOPGKZpiSnM+Wos5qGyM2RgeGR9QUYB7u1xzFXECUaMwHR8ZUl PaDNNTT2YO/ZIMF4k4+GDs2u45ZDQyCNHbDax3qaF31QPyYM2wIx2GjqZLsAu0Udrkbl LbpMbrLI5Z5XwG1KlkdW8H7hF8+8khX/eRL7xQIIDLsPaNxQPJGA9wsg/49w+kkCQ7+K oJTBh8zuhD4nPNApQlgYToyVcb5skbtVzugK8vJiIm2f77y3hFStKfif+14PQmhN1Axc XxvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=eb9l4nPdUGbu9rMUus7IH35zyAQerh+4W6S8DjLLr2g=; b=QGxt2Q52Gzh9rwnlmBd1gjuY8XJIljExqZtPZVnlk1NGGZpmyYdIZsRZ7MAnGQ3i96 rh6OZWFsA5ioSQYKfdVOlIOJYvHgD3XxtM4/bEFqclO3hV8b/qo4BEY3Tdn9Z4xjhvHV h/8ORn3hGHBcp34mJohKshrpddgRcHqopQkUODmriPbba7xzWGgPXTg0aCqxYJHqKaDL KALmVKcHP+D0iAuL4C6eDWyTpkuJm53jBdjoPZm1TRNd45sKjdGaFFBhiqX/9waMdIFf lpZQsa0evZiA9PAaNbOyCqr8Mr4Ny3+Ae6IA73NC5nhr7/kxgoyz6RTLHXqu+fAjJSbu mzIg== X-Gm-Message-State: AIVw111f0/uz0PDQye+eqe/aVpi49cdgD08wW/LDZYGc0wMmTzRSNrnK o1/oKk2B0wLv5n7CnU8= X-Received: by 10.28.20.67 with SMTP id 64mr2343297wmu.60.1499955938631; Thu, 13 Jul 2017 07:25:38 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:30 +0200 Message-Id: <1499955874-10954-38-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 74.125.82.66 Subject: [Qemu-devel] [PULL 37/41] nbd: Implement NBD_OPT_GO on client 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake NBD_OPT_EXPORT_NAME is lousy: per the NBD protocol, any failure requires the server to close the connection rather than report an error to us. Therefore, upstream NBD recently added NBD_OPT_GO as the improved version of the option that does what we want [1]: it reports sane errors on failures, and on success provides at least as much info as NBD_OPT_EXPORT_NAME. [1] https://github.com/NetworkBlockDevice/nbd/blob/extension-info/doc/proto= .md This is a first cut at use of the information types. Note that we do not need to use NBD_OPT_INFO, and that use of NBD_OPT_GO means we no longer have to use NBD_OPT_LIST to learn whether a server requires TLS (this requires servers that gracefully handle unknown NBD_OPT, many servers prior to qemu 2.5 were buggy, but I have patched qemu, upstream nbd, and nbdkit in the meantime, in part because of interoperability testing with this patch). We still fall back to NBD_OPT_LIST when NBD_OPT_GO is not supported on the server, as it is still one last chance for a nicer error message. Later patches will use further info, like NBD_INFO_BLOCK_SIZE. Signed-off-by: Eric Blake Message-Id: <20170707203049.534-8-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- nbd/client.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++++= +++- nbd/nbd-internal.h | 3 ++ nbd/trace-events | 3 ++ 3 files changed, 130 insertions(+), 2 deletions(-) diff --git a/nbd/client.c b/nbd/client.c index a443e51..1e98ca9 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -350,6 +350,114 @@ static int nbd_receive_list(QIOChannel *ioc, const ch= ar *want, bool *match, } =20 =20 +/* Returns -1 if NBD_OPT_GO proves the export @wantname cannot be + * used, 0 if NBD_OPT_GO is unsupported (fall back to NBD_OPT_LIST and + * NBD_OPT_EXPORT_NAME in that case), and > 0 if the export is good to + * go (with @info populated). */ +static int nbd_opt_go(QIOChannel *ioc, const char *wantname, + NBDExportInfo *info, Error **errp) +{ + nbd_opt_reply reply; + uint32_t len =3D strlen(wantname); + uint16_t type; + int error; + char *buf; + + /* The protocol requires that the server send NBD_INFO_EXPORT with + * a non-zero flags (at least NBD_FLAG_HAS_FLAGS must be set); so + * flags still 0 is a witness of a broken server. */ + info->flags =3D 0; + + trace_nbd_opt_go_start(wantname); + buf =3D g_malloc(4 + len + 2 + 1); + stl_be_p(buf, len); + memcpy(buf + 4, wantname, len); + /* No requests, live with whatever server sends */ + stw_be_p(buf + 4 + len, 0); + if (nbd_send_option_request(ioc, NBD_OPT_GO, len + 6, buf, errp) < 0) { + return -1; + } + + while (1) { + if (nbd_receive_option_reply(ioc, NBD_OPT_GO, &reply, errp) < 0) { + return -1; + } + error =3D nbd_handle_reply_err(ioc, &reply, errp); + if (error <=3D 0) { + return error; + } + len =3D reply.length; + + if (reply.type =3D=3D NBD_REP_ACK) { + /* Server is done sending info and moved into transmission + phase, but make sure it sent flags */ + if (len) { + error_setg(errp, "server sent invalid NBD_REP_ACK"); + nbd_send_opt_abort(ioc); + return -1; + } + if (!info->flags) { + error_setg(errp, "broken server omitted NBD_INFO_EXPORT"); + nbd_send_opt_abort(ioc); + return -1; + } + trace_nbd_opt_go_success(); + return 1; + } + if (reply.type !=3D NBD_REP_INFO) { + error_setg(errp, "unexpected reply type %" PRIx32 ", expected = %x", + reply.type, NBD_REP_INFO); + nbd_send_opt_abort(ioc); + return -1; + } + if (len < sizeof(type)) { + error_setg(errp, "NBD_REP_INFO length %" PRIu32 " is too short= ", + len); + nbd_send_opt_abort(ioc); + return -1; + } + if (nbd_read(ioc, &type, sizeof(type), errp) < 0) { + error_prepend(errp, "failed to read info type"); + nbd_send_opt_abort(ioc); + return -1; + } + len -=3D sizeof(type); + be16_to_cpus(&type); + switch (type) { + case NBD_INFO_EXPORT: + if (len !=3D sizeof(info->size) + sizeof(info->flags)) { + error_setg(errp, "remaining export info len %" PRIu32 + " is unexpected size", len); + nbd_send_opt_abort(ioc); + return -1; + } + if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) { + error_prepend(errp, "failed to read info size"); + nbd_send_opt_abort(ioc); + return -1; + } + be64_to_cpus(&info->size); + if (nbd_read(ioc, &info->flags, sizeof(info->flags), errp) < 0= ) { + error_prepend(errp, "failed to read info flags"); + nbd_send_opt_abort(ioc); + return -1; + } + be16_to_cpus(&info->flags); + trace_nbd_receive_negotiate_size_flags(info->size, info->flags= ); + break; + + default: + trace_nbd_opt_go_info_unknown(type, nbd_info_lookup(type)); + if (nbd_drop(ioc, len, errp) < 0) { + error_prepend(errp, "Failed to read info payload"); + nbd_send_opt_abort(ioc); + return -1; + } + break; + } + } +} + /* Return -1 on failure, 0 if wantname is an available export. */ static int nbd_receive_query_exports(QIOChannel *ioc, const char *wantname, @@ -531,11 +639,25 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char= *name, name =3D ""; } if (fixedNewStyle) { + int result; + + /* Try NBD_OPT_GO first - if it works, we are done (it + * also gives us a good message if the server requires + * TLS). If it is not available, fall back to + * NBD_OPT_LIST for nicer error messages about a missing + * export, then use NBD_OPT_EXPORT_NAME. */ + result =3D nbd_opt_go(ioc, name, info, errp); + if (result < 0) { + goto fail; + } + if (result > 0) { + return 0; + } /* Check our desired export is present in the * server export list. Since NBD_OPT_EXPORT_NAME * cannot return an error message, running this - * query gives us good error reporting if the - * server required TLS + * query gives us better error reporting if the + * export name is not available. */ if (nbd_receive_query_exports(ioc, name, errp) < 0) { goto fail; diff --git a/nbd/nbd-internal.h b/nbd/nbd-internal.h index bf95601..4065bc6 100644 --- a/nbd/nbd-internal.h +++ b/nbd/nbd-internal.h @@ -37,8 +37,11 @@ * https://github.com/yoe/nbd/blob/master/doc/proto.md */ =20 +/* Size of all NBD_OPT_*, without payload */ #define NBD_REQUEST_SIZE (4 + 2 + 2 + 8 + 8 + 4) +/* Size of all NBD_REP_* sent in answer to most NBD_OPT_*, without payload= */ #define NBD_REPLY_SIZE (4 + 4 + 8) + #define NBD_REQUEST_MAGIC 0x25609513 #define NBD_REPLY_MAGIC 0x67446698 #define NBD_OPTS_MAGIC 0x49484156454F5054LL diff --git a/nbd/trace-events b/nbd/trace-events index 5230c61..bd09fab 100644 --- a/nbd/trace-events +++ b/nbd/trace-events @@ -3,6 +3,9 @@ nbd_unknown_error(int err) "Squashing unexpected error %d t= o EINVAL" nbd_send_option_request(uint32_t opt, const char *name, uint32_t len) "Sen= ding option request %" PRIu32" (%s), len %" PRIu32 nbd_receive_option_reply(uint32_t option, const char *optname, uint32_t ty= pe, const char *typename, uint32_t length) "Received option reply %" PRIx32= " (%s), type %" PRIx32" (%s), len %" PRIu32 nbd_reply_err_unsup(uint32_t option, const char *name) "server doesn't und= erstand request %" PRIx32 " (%s), attempting fallback" +nbd_opt_go_start(const char *name) "Attempting NBD_OPT_GO for export '%s'" +nbd_opt_go_success(void) "Export is good to go" +nbd_opt_go_info_unknown(int info, const char *name) "Ignoring unknown info= %d (%s)" nbd_receive_query_exports_start(const char *wantname) "Querying export lis= t for '%s'" nbd_receive_query_exports_success(const char *wantname) "Found desired exp= ort name '%s'" nbd_receive_starttls_request(void) "Requesting TLS from server" --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957639068623.246301003668; Thu, 13 Jul 2017 07:53:59 -0700 (PDT) Received: from localhost ([::1]:60496 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfV7-0002dt-Kf for importer@patchew.org; Thu, 13 Jul 2017 10:53:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52015) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4n-0002El-Du for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4j-0004Tm-Ce for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:45 -0400 Received: from mail-wr0-f175.google.com ([209.85.128.175]:33463) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4j-0004TW-3E for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:41 -0400 Received: by mail-wr0-f175.google.com with SMTP id r103so54034866wrb.0 for ; Thu, 13 Jul 2017 07:26:41 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Q5wKEy57GqaTZdhIHUdLeTbO6rMjrs4pKNCYTYdQsyA=; b=dQTQiPQaECz42IfM5lt5HoVJVruYtmOORCdcl7Cy0dRBWKW9OASpFp+0wo4KDDW81d C2HAhQDVSPuQQREHqaR8Q4/EejO8nLTeYl1utrKIDKIpundSfIFKSbp2Ikn7aRn22Q57 33k+XJluJodcVuKINvs2SO7Wgz6YTUcr5F/xCchw6QfHv5BtMTg/7/ZiqNco1mnejHAH vWx8/F+tx7eaGmNDaydJZE+nsk4Z7oM/do6X8Fk6eKxt7Eb2pbFzd/WFi/pBqA6cHoQo WmiB7FZsu9qyLpM1z9gkTXoN0HPNoW3RJGd1y5bvZ87zBHqop9DvCoGPA9gkm2JkWMnK U3yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Q5wKEy57GqaTZdhIHUdLeTbO6rMjrs4pKNCYTYdQsyA=; b=GKyZaymjUOPVHU4HWRYcVy4F9m7YqDknunhS/6PhQglQHXHG4lGg1SJ4EccOX/spLJ h4ANXW4kMmUp3POogMY+DURaDkFTWO1EfHGRoTVlwv+4d9azyESAtJABb+Y9lnCNA/52 v3akjsJJ8WxA1tvxcuDXGhJ/tS9C+h7Gjy1EAhxdJc6VFTKrcW9jdANdUbIEvgkQvLBn MBmwmiSgCzo56Jt4rLYL3Xr2t4RNsgGvaU0GdbrNNUkLWVkJWIMEFbNQVKO2XGVcKYcj 5kPvBdgqTsfpMBnMU+Scq7viObIY3UtqcYe7MMxKaRJzb4TnrZ9+X4cYq39PbZPkJCJw oSlw== X-Gm-Message-State: AIVw110ccGDnXvoOcVxvXnPd3Bvrb6eB186gIv2yTVVGS0mh3TS0t/Fq 7mLxnFSVN+iKQQlk1Ug= X-Received: by 10.223.136.212 with SMTP id g20mr2019018wrg.96.1499955939745; Thu, 13 Jul 2017 07:25:39 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:31 +0200 Message-Id: <1499955874-10954-39-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.175 Subject: [Qemu-devel] [PULL 38/41] nbd: Implement NBD_INFO_BLOCK_SIZE on server 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake The upstream NBD Protocol has defined a new extension to allow the server to advertise block sizes to the client, as well as a way for the client to inform the server that it intends to obey block sizes. Thanks to a recent fix (commit df7b97ff), our real minimum transfer size is always 1 (the block layer takes care of read-modify-write on our behalf), but we're still more efficient if we advertise 512 when the client supports it, as follows: - OPT_INFO, but no NBD_INFO_BLOCK_SIZE: advertise 512, then fail with NBD_REP_ERR_BLOCK_SIZE_REQD; client is free to try something else since we don't disconnect - OPT_INFO with NBD_INFO_BLOCK_SIZE: advertise 512 - OPT_GO, but no NBD_INFO_BLOCK_SIZE: advertise 1 - OPT_GO with NBD_INFO_BLOCK_SIZE: advertise 512 We can also advertise the optimum block size (presumably the cluster size, when exporting a qcow2 file), and our absolute maximum transfer size of 32M, to help newer clients avoid EINVAL failures or abrupt disconnects on oversize requests. We do not reject clients for using the older NBD_OPT_EXPORT_NAME; we are no worse off for those clients than we used to be. Signed-off-by: Eric Blake Message-Id: <20170707203049.534-9-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- nbd/server.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- nbd/trace-events | 1 + 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index e84d012..49ed574 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -365,6 +365,8 @@ static int nbd_negotiate_handle_info(NBDClient *client,= uint32_t length, uint16_t request; uint32_t namelen; bool sendname =3D false; + bool blocksize =3D false; + uint32_t sizes[3]; char buf[sizeof(uint64_t) + sizeof(uint16_t)]; const char *msg; =20 @@ -412,11 +414,16 @@ static int nbd_negotiate_handle_info(NBDClient *clien= t, uint32_t length, length -=3D sizeof(request); trace_nbd_negotiate_handle_info_request(request, nbd_info_lookup(request)); - /* For now, we only care about NBD_INFO_NAME; everything else - * is either a request we don't know or something we send - * regardless of request. */ - if (request =3D=3D NBD_INFO_NAME) { + /* We care about NBD_INFO_NAME and NBD_INFO_BLOCK_SIZE; + * everything else is either a request we don't know or + * something we send regardless of request */ + switch (request) { + case NBD_INFO_NAME: sendname =3D true; + break; + case NBD_INFO_BLOCK_SIZE: + blocksize =3D true; + break; } } =20 @@ -448,6 +455,27 @@ static int nbd_negotiate_handle_info(NBDClient *client= , uint32_t length, } } =20 + /* Send NBD_INFO_BLOCK_SIZE always, but tweak the minimum size + * according to whether the client requested it, and according to + * whether this is OPT_INFO or OPT_GO. */ + /* minimum - 1 for back-compat, or 512 if client is new enough. + * TODO: consult blk_bs(blk)->bl.request_alignment? */ + sizes[0] =3D (opt =3D=3D NBD_OPT_INFO || blocksize) ? BDRV_SECTOR_SIZE= : 1; + /* preferred - Hard-code to 4096 for now. + * TODO: is blk_bs(blk)->bl.opt_transfer appropriate? */ + sizes[1] =3D 4096; + /* maximum - At most 32M, but smaller as appropriate. */ + sizes[2] =3D MIN(blk_get_max_transfer(exp->blk), NBD_MAX_BUFFER_SIZE); + trace_nbd_negotiate_handle_info_block_size(sizes[0], sizes[1], sizes[2= ]); + cpu_to_be32s(&sizes[0]); + cpu_to_be32s(&sizes[1]); + cpu_to_be32s(&sizes[2]); + rc =3D nbd_negotiate_send_info(client, opt, NBD_INFO_BLOCK_SIZE, + sizeof(sizes), sizes, errp); + if (rc < 0) { + return rc; + } + /* Send NBD_INFO_EXPORT always */ trace_nbd_negotiate_new_style_size_flags(exp->size, exp->nbdflags | myflags); @@ -459,6 +487,18 @@ static int nbd_negotiate_handle_info(NBDClient *client= , uint32_t length, return rc; } =20 + /* If the client is just asking for NBD_OPT_INFO, but forgot to + * request block sizes, return an error. + * TODO: consult blk_bs(blk)->request_align, and only error if it + * is not 1? */ + if (opt =3D=3D NBD_OPT_INFO && !blocksize) { + return nbd_negotiate_send_rep_err(client->ioc, + NBD_REP_ERR_BLOCK_SIZE_REQD, opt, + errp, + "request NBD_INFO_BLOCK_SIZE to " + "use this export"); + } + /* Final reply */ rc =3D nbd_negotiate_send_rep(client->ioc, NBD_REP_ACK, opt, errp); if (rc < 0) { diff --git a/nbd/trace-events b/nbd/trace-events index bd09fab..be3dce7 100644 --- a/nbd/trace-events +++ b/nbd/trace-events @@ -39,6 +39,7 @@ nbd_negotiate_handle_export_name_request(const char *name= ) "Client requested exp nbd_negotiate_send_info(int info, const char *name, uint32_t length) "Send= ing NBD_REP_INFO type %d (%s) with remaining length %" PRIu32 nbd_negotiate_handle_info_requests(int requests) "Client requested %d item= s of info" nbd_negotiate_handle_info_request(int request, const char *name) "Client r= equested info %d (%s)" +nbd_negotiate_handle_info_block_size(uint32_t minimum, uint32_t preferred,= uint32_t maximum) "advertising minimum 0x%" PRIx32 ", preferred 0x%" PRIx3= 2 ", maximum 0x%" PRIx32 nbd_negotiate_handle_starttls(void) "Setting up TLS" nbd_negotiate_handle_starttls_handshake(void) "Starting TLS handshake" nbd_negotiate_options_flags(uint32_t flags) "Received client flags 0x%" PR= Ix32 --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957164123863.6978013315007; Thu, 13 Jul 2017 07:46:04 -0700 (PDT) Received: from localhost ([::1]:60459 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfNM-0003yy-I6 for importer@patchew.org; Thu, 13 Jul 2017 10:45:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52013) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4m-0002Dx-PT for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4k-0004UX-Uj for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:44 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:36395) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4k-0004U6-Jp for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:42 -0400 Received: by mail-wm0-f66.google.com with SMTP id y5so5448621wmh.3 for ; Thu, 13 Jul 2017 07:26:42 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=pAP/jI1973pEGn4Lb/fbQI3f7+/qwDN9+1mrECckXjg=; b=M7JZhAJRsuPyNnx6vrLRqFI0dQO4zK13UT22Pp0yTS56eHerir0imPYzLPbIYxougi BFuEYysotxGB+ZQzmDN9oGmU4xdRarlTptY4dgpqaEnrvlzcrBh2sTFtM4mf8OGT+VJP vF0epW/hh8adP834aoSSQMRQIrMsANrGQ3C64MaagKfWUJ+galWjWltvqgiMSr4zrmFZ 9zkEfeZ8GH/cBHjvh4hwRmCsgJvxM6pY9D1UoLhUChJsXJ+ykQFsgwHV77lV7eO5NJe2 mg6Pa3cCCwS/kwHyI/DKAXn515gOfZEidv616dE9btZsPVRaeqfN2VqC0+1dyxFYNEyE WwvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=pAP/jI1973pEGn4Lb/fbQI3f7+/qwDN9+1mrECckXjg=; b=BmionyEeuKd2P9vF9qODjG6O8/JzSlHLZLmxtAMjPMP4dZBzM0amb2GaEfzMTLUupn hgB3+lTgLTJDuN2HONjsqE/bDbrb2X6OXwcI8+GsLOHSLio64uCC5f9gsa2dCFGEJV2t DK4nWr044DRec1mZWeKuOOCpDS4skaD5iElBumFfUvTh0qft2D9zCPWXHSxmhTzCfj38 2qQQmK+ApV43yybrO4IiJgi+gjQoFtYGa3nRsyITtfrVtQa/uRkgZEJCRdB7tvEHMG+o tivFB3yc1kW6TgFmFQoRp1OmLdk7D3GFTbZzhA2llmh55TElaA+Uc1qk30XeXeNiVRdU RYjA== X-Gm-Message-State: AIVw111ujd0l1lvW911n0Q3eEgDAlqXEp7UUkNsifeQKyO7HBcRtKGF+ gLvaoOEOQ/cCoQ7YBJg= X-Received: by 10.28.66.67 with SMTP id p64mr2307530wma.93.1499955941198; Thu, 13 Jul 2017 07:25:41 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:32 +0200 Message-Id: <1499955874-10954-40-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 74.125.82.66 Subject: [Qemu-devel] [PULL 39/41] nbd: Implement NBD_INFO_BLOCK_SIZE on client 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake The upstream NBD Protocol has defined a new extension to allow the server to advertise block sizes to the client, as well as a way for the client to inform the server whether it intends to obey block sizes. When using the block layer as the client, we will obey block sizes; but when used as 'qemu-nbd -c' to hand off to the kernel nbd module as the client, we are still waiting for the kernel to implement a way for us to learn if it will honor block sizes (perhaps by an addition to sysfs, rather than an ioctl), as well as any way to tell the kernel what additional block sizes to obey (NBD_SET_BLKSIZE appears to be accurate for the minimum size, but preferred and maximum sizes would probably be new ioctl()s), so until then, we need to make our request for block sizes conditional. When using ioctl(NBD_SET_BLKSIZE) to hand off to the kernel, use the minimum block size as the sector size if it is larger than 512, which also has the nice effect of cooperating with (non-qemu) servers that don't do read-modify-write when exposing a block device with 4k sectors; it might also allow us to visit a file larger than 2T on a 32-bit kernel. Signed-off-by: Eric Blake Message-Id: <20170707203049.534-10-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- block/nbd-client.c | 4 +++ block/nbd.c | 14 +++++++-- include/block/nbd.h | 6 ++++ nbd/client.c | 81 +++++++++++++++++++++++++++++++++++++++++++++----= ---- nbd/trace-events | 1 + qemu-nbd.c | 2 +- 6 files changed, 92 insertions(+), 16 deletions(-) diff --git a/block/nbd-client.c b/block/nbd-client.c index aab1e32..25dd284 100644 --- a/block/nbd-client.c +++ b/block/nbd-client.c @@ -384,6 +384,7 @@ int nbd_client_init(BlockDriverState *bs, logout("session init %s\n", export); qio_channel_set_blocking(QIO_CHANNEL(sioc), true, NULL); =20 + client->info.request_sizes =3D true; ret =3D nbd_receive_negotiate(QIO_CHANNEL(sioc), export, tlscreds, hostname, &client->ioc, &client->info, errp); @@ -398,6 +399,9 @@ int nbd_client_init(BlockDriverState *bs, if (client->info.flags & NBD_FLAG_SEND_WRITE_ZEROES) { bs->supported_zero_flags |=3D BDRV_REQ_MAY_UNMAP; } + if (client->info.min_block > bs->bl.request_alignment) { + bs->bl.request_alignment =3D client->info.min_block; + } =20 qemu_co_mutex_init(&client->send_mutex); qemu_co_queue_init(&client->free_sema); diff --git a/block/nbd.c b/block/nbd.c index 4a9048c..a50d24b 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -472,9 +472,17 @@ static int nbd_co_flush(BlockDriverState *bs) =20 static void nbd_refresh_limits(BlockDriverState *bs, Error **errp) { - bs->bl.max_pdiscard =3D NBD_MAX_BUFFER_SIZE; - bs->bl.max_pwrite_zeroes =3D NBD_MAX_BUFFER_SIZE; - bs->bl.max_transfer =3D NBD_MAX_BUFFER_SIZE; + NBDClientSession *s =3D nbd_get_client_session(bs); + uint32_t max =3D MIN_NON_ZERO(NBD_MAX_BUFFER_SIZE, s->info.max_block); + + bs->bl.max_pdiscard =3D max; + bs->bl.max_pwrite_zeroes =3D max; + bs->bl.max_transfer =3D max; + + if (s->info.opt_block && + s->info.opt_block > bs->bl.opt_transfer) { + bs->bl.opt_transfer =3D s->info.opt_block; + } } =20 static void nbd_close(BlockDriverState *bs) diff --git a/include/block/nbd.h b/include/block/nbd.h index 4a22eca..9c3d0a5 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -144,8 +144,14 @@ enum { =20 /* Details collected by NBD_OPT_EXPORT_NAME and NBD_OPT_GO */ struct NBDExportInfo { + /* Set by client before nbd_receive_negotiate() */ + bool request_sizes; + /* Set by server results during nbd_receive_negotiate() */ uint64_t size; uint16_t flags; + uint32_t min_block; + uint32_t opt_block; + uint32_t max_block; }; typedef struct NBDExportInfo NBDExportInfo; =20 diff --git a/nbd/client.c b/nbd/client.c index 1e98ca9..c3ee9f3 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -369,12 +369,17 @@ static int nbd_opt_go(QIOChannel *ioc, const char *wa= ntname, info->flags =3D 0; =20 trace_nbd_opt_go_start(wantname); - buf =3D g_malloc(4 + len + 2 + 1); + buf =3D g_malloc(4 + len + 2 + 2 * info->request_sizes + 1); stl_be_p(buf, len); memcpy(buf + 4, wantname, len); - /* No requests, live with whatever server sends */ - stw_be_p(buf + 4 + len, 0); - if (nbd_send_option_request(ioc, NBD_OPT_GO, len + 6, buf, errp) < 0) { + /* At most one request, everything else up to server */ + stw_be_p(buf + 4 + len, info->request_sizes); + if (info->request_sizes) { + stw_be_p(buf + 4 + len + 2, NBD_INFO_BLOCK_SIZE); + } + if (nbd_send_option_request(ioc, NBD_OPT_GO, + 4 + len + 2 + 2 * info->request_sizes, buf, + errp) < 0) { return -1; } =20 @@ -405,8 +410,9 @@ static int nbd_opt_go(QIOChannel *ioc, const char *want= name, return 1; } if (reply.type !=3D NBD_REP_INFO) { - error_setg(errp, "unexpected reply type %" PRIx32 ", expected = %x", - reply.type, NBD_REP_INFO); + error_setg(errp, "unexpected reply type %" PRIx32 + " (%s), expected %x", + reply.type, nbd_rep_lookup(reply.type), NBD_REP_INF= O); nbd_send_opt_abort(ioc); return -1; } @@ -446,6 +452,51 @@ static int nbd_opt_go(QIOChannel *ioc, const char *wan= tname, trace_nbd_receive_negotiate_size_flags(info->size, info->flags= ); break; =20 + case NBD_INFO_BLOCK_SIZE: + if (len !=3D sizeof(info->min_block) * 3) { + error_setg(errp, "remaining export info len %" PRIu32 + " is unexpected size", len); + nbd_send_opt_abort(ioc); + return -1; + } + if (nbd_read(ioc, &info->min_block, sizeof(info->min_block), + errp) < 0) { + error_prepend(errp, "failed to read info minimum block siz= e"); + nbd_send_opt_abort(ioc); + return -1; + } + be32_to_cpus(&info->min_block); + if (!is_power_of_2(info->min_block)) { + error_setg(errp, "server minimum block size %" PRId32 + "is not a power of two", info->min_block); + nbd_send_opt_abort(ioc); + return -1; + } + if (nbd_read(ioc, &info->opt_block, sizeof(info->opt_block), + errp) < 0) { + error_prepend(errp, "failed to read info preferred block s= ize"); + nbd_send_opt_abort(ioc); + return -1; + } + be32_to_cpus(&info->opt_block); + if (!is_power_of_2(info->opt_block) || + info->opt_block < info->min_block) { + error_setg(errp, "server preferred block size %" PRId32 + "is not valid", info->opt_block); + nbd_send_opt_abort(ioc); + return -1; + } + if (nbd_read(ioc, &info->max_block, sizeof(info->max_block), + errp) < 0) { + error_prepend(errp, "failed to read info maximum block siz= e"); + nbd_send_opt_abort(ioc); + return -1; + } + be32_to_cpus(&info->max_block); + trace_nbd_opt_go_info_block_size(info->min_block, info->opt_bl= ock, + info->max_block); + break; + default: trace_nbd_opt_go_info_unknown(type, nbd_info_lookup(type)); if (nbd_drop(ioc, len, errp) < 0) { @@ -729,8 +780,14 @@ fail: int nbd_init(int fd, QIOChannelSocket *sioc, NBDExportInfo *info, Error **errp) { - unsigned long sectors =3D info->size / BDRV_SECTOR_SIZE; - if (info->size / BDRV_SECTOR_SIZE !=3D sectors) { + unsigned long sector_size =3D MAX(BDRV_SECTOR_SIZE, info->min_block); + unsigned long sectors =3D info->size / sector_size; + + /* FIXME: Once the kernel module is patched to honor block sizes, + * and to advertise that fact to user space, we should update the + * hand-off to the kernel to use any block sizes we learned. */ + assert(!info->request_sizes); + if (info->size / sector_size !=3D sectors) { error_setg(errp, "Export size %" PRIu64 " too large for 32-bit ker= nel", info->size); return -E2BIG; @@ -744,17 +801,17 @@ int nbd_init(int fd, QIOChannelSocket *sioc, NBDExpor= tInfo *info, return -serrno; } =20 - trace_nbd_init_set_block_size(BDRV_SECTOR_SIZE); + trace_nbd_init_set_block_size(sector_size); =20 - if (ioctl(fd, NBD_SET_BLKSIZE, (unsigned long)BDRV_SECTOR_SIZE) < 0) { + if (ioctl(fd, NBD_SET_BLKSIZE, sector_size) < 0) { int serrno =3D errno; error_setg(errp, "Failed setting NBD block size"); return -serrno; } =20 trace_nbd_init_set_size(sectors); - if (info->size % BDRV_SECTOR_SIZE) { - trace_nbd_init_trailing_bytes(info->size % BDRV_SECTOR_SIZE); + if (info->size % sector_size) { + trace_nbd_init_trailing_bytes(info->size % sector_size); } =20 if (ioctl(fd, NBD_SET_SIZE_BLOCKS, sectors) < 0) { diff --git a/nbd/trace-events b/nbd/trace-events index be3dce7..f5024d8 100644 --- a/nbd/trace-events +++ b/nbd/trace-events @@ -6,6 +6,7 @@ nbd_reply_err_unsup(uint32_t option, const char *name) "ser= ver doesn't understan nbd_opt_go_start(const char *name) "Attempting NBD_OPT_GO for export '%s'" nbd_opt_go_success(void) "Export is good to go" nbd_opt_go_info_unknown(int info, const char *name) "Ignoring unknown info= %d (%s)" +nbd_opt_go_info_block_size(uint32_t minimum, uint32_t preferred, uint32_t = maximum) "Block sizes are 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 nbd_receive_query_exports_start(const char *wantname) "Querying export lis= t for '%s'" nbd_receive_query_exports_success(const char *wantname) "Found desired exp= ort name '%s'" nbd_receive_starttls_request(void) "Requesting TLS from server" diff --git a/qemu-nbd.c b/qemu-nbd.c index c8bd47f..78d05be 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -255,7 +255,7 @@ static void *show_parts(void *arg) static void *nbd_client_thread(void *arg) { char *device =3D arg; - NBDExportInfo info; + NBDExportInfo info =3D { .request_sizes =3D false, }; QIOChannelSocket *sioc; int fd; int ret; --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499958323277683.2257451569435; Thu, 13 Jul 2017 08:05:23 -0700 (PDT) Received: from localhost ([::1]:60563 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVffy-00050u-Sc for importer@patchew.org; Thu, 13 Jul 2017 11:05:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52041) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4p-0002H5-Mw for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4l-0004Uw-MD for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:47 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:32961) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4l-0004US-Fi for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:43 -0400 Received: by mail-wr0-f195.google.com with SMTP id n18so1463783wrb.0 for ; Thu, 13 Jul 2017 07:26:43 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=9lGJEWJbYBmkjXEvRXszHRCa68/On+ooXkNp2NHh1E4=; b=jFlaEIBvcVyLTVUGgIuWhLqN8l2viqebfT8QxcAZuIkHam5zC4E7m47QC5MgptV51B JMnvN9yerV9G/7hxlXS7dUjK9JP3QTswRJ2LaOvlQpX7WPv9uIpTYMLIlT6tkE9y4x8y llYbJLjtKg0ew+GQF5z3od6DOQCez6/UjwzqEfG1W9gxZexQ1Dw5KE29pIh7N6bg7imS AMxnH0hmB6LO/2tJYbiF5wnxAU8lxR/TN/wGEGOVufrHzwZbERDJIykev0YvCuSC3AiN cOu+VJ+PAyf9Q90hxqW54PQQFNJSIIxPOJ5QWQcTs4le+EZFkEyGhx9+ZvRxmhKHcp6I jLcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=9lGJEWJbYBmkjXEvRXszHRCa68/On+ooXkNp2NHh1E4=; b=Y8vkRutBPZqBzqldB/t4U6SBHcQSWiBujGgLReUfzA229P0UfM3kU20IxGYcgeLopR CDjwaSsqsgbLpoUaDX1KGwKd/+uAgpMiJsR3RuIlegZDR7nPjbQjTcDiohaxCkS1hp8k JOcVIQqRXjzWIQxaI2wq5boEO2O0W5VSvu4VwH1RXMq78/STF1LL7vU7om7hS2Orv66G avMCwzQtpyTLqe/deB8w7QTrYZ+jBGT6koE97ZICpZze4GFpyoyASsc5BkyrjATcvLCY ui5wfqPDLtvCyG0TEEPmjIlgau6U6WRX0CZMMhWRZs9r7/Ssokra4rbLI1w54KJrA+vj p5/g== X-Gm-Message-State: AIVw110By/S/OvV7/qfIIfE8yRKCW0ik84hP3CgYnAsYexQ/YjtUwxbk J0KjFZAjh/Gk1XSwGow= X-Received: by 10.223.154.206 with SMTP id a72mr1893858wrc.47.1499955942173; Thu, 13 Jul 2017 07:25:42 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:33 +0200 Message-Id: <1499955874-10954-41-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.195 Subject: [Qemu-devel] [PULL 40/41] vl: fix breakage of -tb-size 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: "Emilio G. Cota" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Emilio G. Cota" Commit e7b161d573 ("vl: add tcg_enabled() for tcg related code") adds a check to exit the program when !tcg_enabled() while parsing the -tb-size flag. It turns out that when the -tb-size flag is evaluated, tcg_enabled() can only return 0, since it is set (or not) much later by configure_accelerator= (). Fix it by unconditionally exiting if the flag is passed to a QEMU binary built with !CONFIG_TCG. Signed-off-by: Emilio G. Cota Signed-off-by: Paolo Bonzini --- vl.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vl.c b/vl.c index f7560de..85cdbbf 100644 --- a/vl.c +++ b/vl.c @@ -3933,10 +3933,10 @@ int main(int argc, char **argv, char **envp) configure_rtc(opts); break; case QEMU_OPTION_tb_size: - if (!tcg_enabled()) { - error_report("TCG is disabled"); - exit(1); - } +#ifndef CONFIG_TCG + error_report("TCG is disabled"); + exit(1); +#endif if (qemu_strtoul(optarg, NULL, 0, &tcg_tb_size) < 0) { error_report("Invalid argument to -tb-size"); exit(1); --=20 1.8.3.1 From nobody Mon Apr 29 01:51:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499957064547563.2913943561927; Thu, 13 Jul 2017 07:44:24 -0700 (PDT) Received: from localhost ([::1]:60448 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfLo-0001ro-Am for importer@patchew.org; Thu, 13 Jul 2017 10:44:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51549) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf3p-0001N7-PL for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf3o-00032A-NZ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:45 -0400 Received: from mail-wr0-x241.google.com ([2a00:1450:400c:c0c::241]:36705) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf3o-0002zq-GN for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:25:44 -0400 Received: by mail-wr0-x241.google.com with SMTP id 77so9410398wrb.3 for ; Thu, 13 Jul 2017 07:25:44 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=qZUl2R0yHMtp9yzkBV8REVQflexZpi/wFrTNh1hDHJc=; b=rjAbt1Gqx5SGtI9jS1zloZW5PPT9/VLbfUQEluU0XOaCGC8T/BGwRkKt9teQIGzfDM owT4J4WvpzRxLStwZrKqrE8/EoLT6UmiC7OkOZfd7mok7Gup4dHszwkIwd8et4bHAT4c ZCj9DyyWrEflUneSzZTg+cg00+RC2KTeEKBknu5LoiBdqNotFhiUmEtfj/e8wQRITD+F E+tKo4VAB2z6wnygiAGwki/StmxNazJx87Yema4ms3DTWbB5gz0dVXYt+GSeXxEy6LVw 91S2rjoARP+MujPLkAHRP7M83kQcZMF6V3XoBXZ3SNgLti7SUfEBzQ0gdLkY8NP8nJep /IZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=qZUl2R0yHMtp9yzkBV8REVQflexZpi/wFrTNh1hDHJc=; b=Em03YoXTH8WrBL+L8oijTVEGXCKMB3gh8pF7FXhWF8b6SOaWls9FOuGEdTrrch2NA3 MQ9DtCHBO2+NcC5q+gjI2iZ4f/1UQN7FheTlsZ3OsavKhil8PpuPYKH+lVADDCYpj9Rk ZUmTG9luWETmOuQBB/92LenKBJkRbcVSZGxpZhtuXYfcpfpReh09aUMQK1egsedM8PFh sk23cEo/vF3IUDENN7AyVjWtdnSK2n3JmAFqTDmde83FOlNRiNYqZwaHnmUGOtjqQ9Zv Rgu3t3NwfxzBzpEQEhBleR+kCpRQdEpbn6zGpAyOAo6LMl2TBpkl+j1BoZdqlYcmQMFV VW0w== X-Gm-Message-State: AIVw112RJThCAueM360mudbajwjfqigFrLYc/4t8vm3jkG4EdoEjGLqx 3DeholLaRSLHSdg9crs= X-Received: by 10.223.151.67 with SMTP id r61mr1792187wrb.189.1499955943318; Thu, 13 Jul 2017 07:25:43 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:34 +0200 Message-Id: <1499955874-10954-42-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::241 Subject: [Qemu-devel] [PULL 41/41] translate-all: remove redundant !tcg_enabled check in dump_exec_info 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: "Emilio G. Cota" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Emilio G. Cota" This check is redundant because it is already performed by the only caller of dump_exec_info -- the caller was updated by b7da97eef ("monitor: Check whether TCG is enabled before running the "info jit" code"). Checking twice wouldn't necessarily be too bad, but here the check also returns with tb_lock held. So we can either do the check before tb_lock is acquired, or just get rid of it. Given that it is redundant, I am going for the latter option. Signed-off-by: Emilio G. Cota Signed-off-by: Paolo Bonzini --- accel/tcg/translate-all.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index 0caf80d..4e1831c 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -1851,11 +1851,6 @@ void dump_exec_info(FILE *f, fprintf_function cpu_fp= rintf) =20 tb_lock(); =20 - if (!tcg_enabled()) { - cpu_fprintf(f, "TCG not enabled\n"); - return; - } - target_code_size =3D 0; max_target_code_size =3D 0; cross_page =3D 0; --=20 1.8.3.1